Реєстрація
Згода на обробку персональних даних
Я, користувач, надаю згоду адміністрації платформи на обробку моїх персональних даних, зокрема:
- ПІБ;
- логін та пароль (в зашифрованому вигляді);
- обрана навчальна група та курс;
- активність на платформі (розклад, командна робота, повідомлення тощо).
Дані обробляються виключно з метою надання доступу до функцій навчального порталу та не передаються третім особам. Згода діє протягом усього періоду використання сервісу та може бути відкликана за запитом.
Оновлення
Нотатки до релізівv1.4.x 54 релізів ›
v1.4.55
2026-04-08
- fix(academic-v2-schedule-workspace): simplify the Academic Setup v2 schedule tab down to the advanced editor only, move warning/problem slot review behind the separate schedule-list page, and add a clear-current-term action that bulk-deletes the selected term's schedule rows with projection sync
v1.4.54
2026-04-07
- fix(register-subjects-quick-select): hide single-group required subjects from the manual registration list while keeping them auto-assigned in hidden submit fields and progress counters, so quick-pick group 2 no longer leaves required one-group subjects visibly stuck or blocking completion
v1.4.53
2026-04-07
- fix(register-subjects-source): make bachelor student subject registration overlay live group subjects with stage-template catalog settings, so group counts and visibility now follow the catalog even when workspace live rows are stale
v1.4.52
2026-04-07
- fix(bachelor-catalog-live-sync): make bachelor catalog save and sync-live propagate stage-template subject settings into live group subjects, so edited group counts now reach registration instead of falling back to raw source defaults
v1.4.51
2026-04-07
- fix(bachelor-catalog): auto-backfill older auto-seeded bachelor stage-template rows from legacy 1 group to the new default 2 groups during catalog sync, without overwriting rows that were already edited manually
v1.4.50
2026-04-07
- feat(bachelor-catalog): add manual subject group-count control in the bachelor catalog with selectable values 1..3, default new catalog rows to 2 groups, and persist that count into stage templates so seeded/live sync subjects inherit it
v1.4.49
2026-04-07
- tune(register-subjects): remove the top registration helper panel and cohort readiness block so the subject picker opens directly into the working catalog
v1.4.48
2026-04-07
- docs(deploy): switch project instructions from legacy Cloud Run wording to Docker Compose as the active deployment target, add routine server update steps with `git pull --rebase` plus `docker compose up --build -d`, and document that `down -v` is only for intentional database re-creation or dump re-import
v1.4.47
2026-04-07
- fix(register-subjects): show the full registration catalog instead of only manual-choice rows, mark single-group required subjects as auto-configured, hide quick select when it adds no value, and compact the readiness and summary surfaces into a denser Liquid Glass flow
v1.4.46
2026-04-07
- fix(runtime): normalize security-event `course_id` values so zero never violates foreign keys during failed logins or registration auditing, make post-registration security recompute null-safe when risk signals are absent, and sort visible messages with a timestamptz-safe fallback for legacy text `created_at` rows
v1.4.45
2026-04-07
- fix(docker): pre-create the `cloudsqlsuperuser` compatibility role before local Postgres imports Cloud SQL dumps, and extend the database healthcheck start period so restore-heavy first boots do not fail early while initialization is still running
v1.4.44
2026-04-07
- feat(docker): add an isolated `docker/local` runtime with Docker Compose, a dedicated app image, PostgreSQL 18 bootstrap from the provided Cloud SQL dump, default local env wiring for the existing `DB_*` config, and documentation for first boot plus backup re-import flow
v1.4.43
2026-04-07
- feat(register-course-debug): make all registration tracks selectable in the track picker, add per-track diagnostics with concrete setup actions and readiness counts, and explain why teacher/master routes are unavailable even when no registration-ready program rows exist yet; export Academic V2 listPrograms/listCohorts/listGroups for this route-level diagnostics pass
v1.4.42
2026-04-07
- fix(register-course): broaden the Academic V2 registration scope beyond stage-1-only groups, allow repairable cohort and campus routes to stay selectable instead of hiding them behind hard readiness gating, prefer the current higher-stage group when a cohort has multiple active campus rows, and label routes that will auto-repair on continue so cohort 2024 and teacher-track registration can resolve through the same submit-time repair flow
v1.4.41
2026-04-07
- tune(register-course): compact the academic route picker into a denser track-registration flow, replace cohort cards with a dropdown selector plus compact cohort meta, rename the top heading to track registration, tighten the overall spacing and control sizing, and remove the bottom selection preview block
v1.4.40
2026-04-07
- tune(academic-v2-live-subjects): add compact origin badges in live course subjects and the subject detail summary, marking whether a subject came from the active bachelor catalog stage or was added manually
v1.4.39
2026-04-07
- fix(academic-v2-projection-fallback): make legacy schedule projection schema-aware by falling back to old schedule-entry fields when migration-045 activity/link structures are missing, so Academic V2 saves and manual live sync no longer defer projection just because group_subject_activity_id or academic_v2_schedule_entry_legacy_links is unavailable
v1.4.38
2026-04-07
- feat(academic-v2-bachelor-live-sync): add explicit catalog-to-live sync actions in the bachelor bulk editor for the current program, cohort, or course, and seed live Academic V2 subjects directly from the code-backed bachelor catalog so missing T1/T2/T3 subject rows can be added to live courses even when the implicit stage-change flow does not backfill them
v1.4.37
2026-04-07
- fix(academic-v2-bachelor-schema-resilience): guard every SQL path that touches migration-045 tables (academic_v2_group_subject_activities, academic_v2_schedule_entry_legacy_links, group_subject_activity_id column) with runtime table-existence checks so bachelor course stage changes, subject seeding, and program-wide backfill survive partial schemas where the activity-migration has not yet been applied; add runtime try/catch fallback in applyConfiguredStructureToGroupTx so any remaining schema error in the template path gracefully degrades to direct catalog seeding instead of aborting the transaction
v1.4.36
2026-04-07
- fix(academic-v2-bachelor-schema-fallback): preflight the bachelor stage-template schema before sync/apply flows, route save/render/manual course seeding through one shared fallback that can seed live course subjects directly from the bachelor catalog when required stage-template migrations are missing, and keep program-wide subject backfill running after course stage changes instead of aborting with a schema migration error
v1.4.35
2026-04-07
- fix(academic-v2-bachelor-backfill): make bachelor course stage changes backward-compatible with older academic_v2 schemas by skipping missing stage-activity template tables, defaulting live bachelor subjects to lecture plus seminar when needed, and backfilling missing subject coverage across all courses in the program during course save
v1.4.34
2026-04-07
- fix(academic-v2-bachelor-course-seeding): apply the matching bachelor stage template immediately when saving a course, so changing a course to another stage now auto-syncs the bachelor catalog for the program and assigns the correct subjects and canonical terms to that live course instead of waiting for a later page render pass
v1.4.32
2026-04-07
- fix(academic-v2-projection): harden legacy projection resync so saved groups self-heal stale legacy program, admission, course, semester, subject, and schedule-entry pointers instead of deferring with a projection-sync warning when old compatibility rows are missing
v1.4.31
2026-04-07
- tune(academic-v2-subject-editor): collapse the shared-subject tools, non-shared course assignment flow, activity editor, and current activity list by default inside the subject detail workspace, while auto-opening the activities disclosure when jumping into activity-focused editing
v1.4.30
2026-04-07
- fix(academic-v2-layout): reduce the remaining top gap above Academic Setup v2 when the page is wrapped by the shared page-container layout, so the local context bar sits much closer to the global navbar
v1.4.29
2026-04-06
- tune(academic-v2-layout): pull the Academic Setup v2 workspace closer to the shared app navbar by reducing the standalone page top gap between the global navigation shell and the local context bar
v1.4.28
2026-04-06
- fix(academic-v2-bachelor-t3): complete the workbook-derived bachelor semester column map with canonical third-semester columns for all four stages, and lock the source registry with tests so the seeded T3 subjects stay assigned to the correct grades and semesters in code
v1.4.27
2026-04-06
- feat(academic-v2-bachelor-semesters): backfill bachelor stage templates and course subjects from the bachelor catalog into the fixed three-term model, extend the workbook-derived semester mapping with short T3 placements, auto-seed all courses in the selected bachelor program with three visible terms and matching stage subjects, and add optional grade/semester filters to the bachelor bulk catalog editor while preserving that filter state across sync/save redirects
v1.4.26
2026-04-06
- feat(academic-v2-terms): switch Academic Setup v2 to a fixed three-term model with canonical T1/T2/T3 topology, hard-code week counts to 15/15/7 across live terms and stage templates, extend bachelor-catalog term bindings to T3, auto-normalize selected Academic V2 program/course term sets, remove manual week editing from the v2 term editors, and block deletion or duplication of the canonical term numbers
v1.4.25
2026-04-06
- refactor(academic-setup-v2-density): remove the duplicate scope summary from the sidebar, switch the workspace shell to a tighter system-font operator UI, collapse diagnostics and stage-template tooling into disclosure-based panels, simplify the sticky scope strip to value-only chips, move utility links out of the context bar, and tighten the laptop-first density of the Academic Setup v2 admin workspace
v1.4.24
2026-04-06
- refactor(academic-setup-v2-workspace): rebuild `/admin/pathways` into a denser desktop-first operator workspace with a sticky scope strip, clear `Operate / Structure / Diagnostics` modes, compact secondary tabs, diagnostics separated from daily course work, the global subject template catalog moved out of live subjects into structure, a standalone bachelor catalog panel, and tighter Apple-style table/control density for daily admin use on laptop screens
v1.4.23
2026-04-06
- docs(agents): remove the outdated note from AGENTS.md that told Codex to handle explicit test requests automatically
v1.4.22
2026-04-06
- feat(academic-v2-bachelor-catalog): add a code-backed bachelor subject registry seeded from the bachelor workbook, expose a bachelor-only bulk catalog editor in `/admin/pathways`, add non-destructive source sync and inline stage/term/general/required saving on top of existing Academic V2 templates, preserve manual activity overrides while defaulting new rows to lecture + seminar, and cover the new source, service, and render paths with catalog-focused tests
v1.4.21
2026-04-05
- refactor(schedule-attendance-modal): move attendance entry to a single footer button, replace the bulky list editor with a one-student-at-a-time card flow, and keep saving locked until every student in the class has been marked as present, absent, or excused
v1.4.20
2026-04-05
- fix(schedule-attendance-flow): remove attendance UI from the journal page, move teacher attendance marking into the schedule class modal with a dedicated save flow, and show per-class attendance chips for students directly on visible schedule cards
v1.4.19
2026-04-05
- tune(academic-setup-v2-hero): reduce the top gap under the navbar, compress the hero block spacing and stats cards, and shorten the opening copy so the first glass panel lands much closer to the navigation
v1.4.18
2026-04-05
- fix(journal-runtime): restore the shared boolean normalizer in app.js so the journal student V2 subject merge path no longer crashes with a runtime error during page load
v1.4.17
2026-04-05
- fix(journal-student-v2-subjects): merge Academic V2 student selections with the personal schedule scope so journal self-view and admin view-as-self show the same subjects that are available in the student's Academic Setup V2 schedule path
v1.4.16
2026-04-04
- fix(journal-shell-fallback): route journal view-render failures through the safe in-app journal shell before falling back to the plain compatibility HTML
v1.4.15
2026-04-04
- fix(journal-v2-subject-dropdown): surface new Academic V2 subjects in the journal selector for teacher and full-access flows, keep unmapped subjects selectable with synthetic ids, and stop journal storage writes for subjects that still lack a legacy binding
v1.4.14
2026-04-04
- fix(journal-render-fallback): keep the journal compatibility fallback inside the normal app shell by providing the missing empty-state workflow links and showing the compatibility warning inline
v1.4.13
2026-04-04
- fix(journal-compatibility-fallback): add legacy subject-option fallback for journal teacher and student scopes so the journal stays on the rendered app shell instead of dropping into the plain compatibility HTML when the v2 catalog is unavailable
v1.4.12
2026-04-04
- fix(admin-data-binding): remove legacy course fallback from the admin overview counters and weekly user counts, make the overview surface warn when Academic V2 scope is missing, and tighten users.csv export to current course bindings only
v1.4.11
2026-04-03
- fix(academic-v2-teacher-student-surfaces): make teacher hub and workspace prefer the offering-based subject flow, replace journal student lookup and subject selection with v2 bridge-first resolution, reduce student/teamwork legacy fallbacks, normalize v2 subject shapes, and remove legacy navigation labels from the primary teacher entry points
v1.4.09
2026-04-03
- fix(admin-users-context-render): enrich the main admin users query with study context placement data so the academic label under each username is visible on the first page load instead of appearing only after opening the user modal
v1.4.08
2026-04-03
- fix(admin-users-delete-permanent): preserve the current `users_status` filter on permanent delete so inactive and all-user views stay where the operator left them after the redirect
v1.4.07
2026-04-03
- fix(admin-users-dropdown): normalize inactive user state in the table and force the row actions menu upward for inactive users so `Delete permanently` stays visible instead of being clipped by the table footer
v1.4.06
2026-04-03
- tune(admin-users-bulk-bar): keep the bulk users action strip on one centered row on wide screens while allowing a stacked fallback on small screens
v1.4.05
2026-04-03
- tune(admin-users-context): render the full academic context string in the users table before opening the user modal, and keep the AJAX refresh path aligned so the row does not collapse back to the short label
v1.4.04
2026-04-03
- fix(admin-users-status): make the users list respect `users_status` from the page URL so inactive and all-user views persist instead of snapping back to active-only, and surface the context label directly under the username in the server and client table renderers
v1.4.03
2026-04-03
- fix(generator-theme-sync): stop the schedule/session generator pages from forcing a separate light theme state and switch them to the shared `ui-theme` storage key so entering generators no longer flips the whole app to white
v1.4.02
2026-04-03
- fix(homework-submit-compat): make teacher homework creation tolerate legacy homework schemas and shared-subject contexts by normalizing the subject title fallback, checking the active study day after resolving the real storage course, and inserting homework only into columns that actually exist in the current database
v1.4.01
2026-04-03
- tune(navbar-home-group): make `Studerria` plain text in the shared navbar and move `Про сайт` plus `FAQ & Help` under the `Головна` dropdown so the top navigation matches the rest of the app
v1.4.00
2026-04-03
- fix(admin-session-generator-render): pass `explicitSessionDates` into the session generator view so the EJS template can build its cleanup previews and hidden form payloads without crashing on render
v1.3.x 100 релізів ›
v1.3.99
2026-04-03
- tune(admin-role-studio-preview): shorten the Role Studio copy and collapse long permission previews into a few visible chips plus a compact `+N` overflow badge, so admin role cards keep editing power without stretching the panel wide
v1.3.98
2026-04-03
- tune(schedule-mobile-compact-cards): tighten schedule cards on mobile by hiding secondary meta rows, removing the old Academic V2 / legacy-binding labels from the visible UI, and flattening the subject card layout so shared-subject-heavy views feel lighter and less width-stretched
v1.3.97
2026-04-03
- chore(repo-cleanup): remove the tracked `database.db` SQLite artifact from the repository and add it to `.gitignore`, since the app uses Postgres via `pg` and does not read the local SQLite file at runtime
v1.3.96
2026-04-03
- fix(schedule-mobile-week-carousel): replace the mobile week-rail grid override that was collapsing the week carousel into a narrow sliver on phones, so the Liquid Glass week navigator now spans the full dock width and keeps the week cards readable on small screens
v1.3.95
2026-04-02
- fix(admin): remove orphaned EJS closing tag left after legacy Academics panel removal, fixing SyntaxError on admin page
v1.3.94
2026-04-02
- chore(admin): remove legacy Academics subpages (Subjects, Semesters, Courses) from the admin sidebar and their corresponding panels — all functionality is now covered by Academic Setup v2 (Pathways)
v1.3.93
2026-04-01
- feat(academic-v2-shared-subjects): add a first-class shared subject flow to `/admin/pathways` by introducing `academic_v2_shared_group_subject_links`, a new `Спільний предмет` panel in the course-subject editor, actions to create linked copies in other courses or attach an existing same-template subject, a manual sync action that copies title, flags, subgroup config, term bindings by `term_number`, teacher assignments, and activity setup while keeping schedule rows local, and guardrails that lock course/template changes for shared participants, block deleting a source subject while linked copies exist, and clean up linked-course schedule rows that no longer fit after subgroup-count sync
v1.3.92
2026-04-01
- feat(academic-v2-course-subject-redirect): add an opt-in `Після призначення відкрити цільовий курс і новий предмет` toggle to the new course-subject reuse flow, teach the Academic V2 mutation redirect helper to append extra deep-link params, and make `/admin/pathways` honor `subject_id` plus `workspace_tab` overrides so assigning a subject across courses can land directly inside the target course on the newly cloned live subject instead of dropping the admin back into the old workspace state
v1.3.91
2026-03-31
- feat(academic-v2-course-subject-reuse): add a new "Призначити в інший курс" flow inside the `/admin/pathways` course-subject detail editor that clones the selected live subject into another course as a separate Academic V2 row, blocks template duplicates in the target course up front, copies flags, teacher assignments, and activity setup, maps term bindings by matching `term_number`, keeps schedule rows out of the transfer, and surfaces a warning if some source terms do not exist in the target course
v1.3.90
2026-03-31
- feat(academic-v2-schedule-list-filters): let the dedicated Academic V2 schedule-list page filter the full slot report by week, subject, teacher, and warning-only state, and add deep links back into `/admin/pathways#schedule` so clicking `Редагувати у workspace` opens the exact `schedule_entry_id` in the advanced editor instead of just jumping to the generic schedule tab
v1.3.89
2026-03-31
- feat(academic-v2-schedule-report): make schedule warnings understandable inside `/admin/pathways` by turning the old raw warning count into a detailed breakdown with reason chips and example slots, move the full heavy slot list out of the main schedule workspace into a dedicated Academic V2 schedule-list screen with week and warning-only filters, and trim the in-workspace subject/group/advanced slot rendering down to fast previews so the main schedule tab opens lighter while keeping the complete slot audit available separately
v1.3.88
2026-03-31
- fix(my-day-student-group-scope): tighten the Academic V2 student `My Day` scope builder so a shared lecture subject no longer expands to every subgroup-specific seminar on the home page, and reuse the same subgroup-aware rule for homework lookups so personal dashboard cards only include lecture rows plus the student's own selected subgroup content
v1.3.87
2026-03-31
- fix(admin-view-as-student-academic-scopes): reuse the real Academic V2 selected-subgroup rows in admin `view-as self` mode across `My Day`, `/subjects`, and `/teamwork` instead of falling back to legacy student-group rows or staff-only scope resolution, so homework, materials, teamwork access, and subject listings stay aligned with the same `selected_group` source already used by the repaired schedule flow
v1.3.86
2026-03-31
- fix(admin-view-as-student-seminar-filter): apply the selected-group filter to Academic V2 schedule rows in the admin `view-as self` schedule branch as well, so seminar, practice, and lab slots from other subgroups no longer leak into the student's personal timetable while lectures remain visible course-wide
v1.3.85
2026-03-31
- fix(admin-view-as-student-schedule-groups): make the admin `/schedule` view-as-self Academic V2 path load the student's actual selected subject groups instead of a single fallback group for every subject, reuse `selected_group` when building homework scope and debug decisions, and relabel lecture cards in that personal schedule view to the student's chosen subgroup instead of the course-wide `Усі групи` marker
v1.3.84
2026-03-31
- fix(schedule-personal-group-labels): keep lecture slots shared internally while showing the student's own selected subgroup label in personal and view-as schedules whenever a single subgroup is chosen for that subject, instead of rendering those lecture cards as "Усі групи" / "All groups"
v1.3.83
2026-03-31
- fix(academic-v2-schedule-new-slot-persistence): keep newly inserted Academic Setup v2 schedule rows alive during multi-week cleanup by tracking the ids returned from each insert or update instead of only pre-existing row ids, so brand-new lecture or seminar slots for newly added subjects are no longer immediately deleted as stale siblings
v1.3.82
2026-03-30
- fix(academic-v2-schedule-multiweek-replace): make Academic Setup v2 schedule saves treat the week list as the full desired state for the current slot/activity combination by cleaning up stale sibling rows outside the submitted week set, including after slot edits that change activity, day, class, or subgroup scope, and clarify this replace behavior directly in both the grid placement panel and advanced schedule editor
v1.3.81
2026-03-30
- chore(schedule-debug-hardening): keep Academic V2 schedule debug as an admin-only hidden mode instead of exposing it in regular student sessions, and normalize course-level Academic V2 schedule row sorting by real weekday order so Monday-through-Sunday grids stay stable across admin, teacher, and view-as schedule surfaces
v1.3.80
2026-03-30
- fix(academic-v2-course-schedule-runtime): rebuild `loadCourseScheduleRows()` as a true course-level Academic V2 schedule source instead of a student-selected projection, load the full course subject scope before reading schedule rows, stop dropping valid slots just because a default subgroup does not match, expand seminar-like entries by their target groups, and keep mapped lecture rows renderable in admin, teacher, and view-as student schedule surfaces
v1.3.79
2026-03-30
- fix(admin-schedule-debug-visibility): expose the new Academic V2 schedule debug panel in the admin `/schedule` and `view-as student` flow as well, and build an admin-scoped debug payload with raw `academic_v2_schedule_entries`, runtime inclusion decisions, requested subgroup context, and reason codes so the same `?debug_schedule=1&week=...` URL can diagnose why a slot is missing without switching into a plain student session
v1.3.78
2026-03-30
- fix(student-schedule-debug-and-unmapped-slots): add deterministic Academic V2 student schedule diagnostics with resolved scope, active term, raw row decisions, and reason codes behind `?debug_schedule=1`; stop treating selected legacy subjects as the only render source so visible lecture rows can render even without explicit subgroup selections; keep unmapped Academic V2 slots visible as normal schedule cards with homework compatibility disabled instead of hiding them; and prevent synthetic or compat-disabled schedule rows from being used to build legacy homework lookups
v1.3.77
2026-03-30
- fix(student-schedule-lecture-fallback): broaden Academic V2 student schedule fallback so lecture rows can still render when the subject is required but missing an explicit subgroup-selection row, and even when the live course subject still lacks a legacy subject binding by assigning a synthetic local subject key for schedule-card rendering while keeping homework bindings disabled for those unmapped slots
v1.3.76
2026-03-30
- fix(academic-v2-student-schedule-visibility): stop student schedule rows from disappearing when a lecture belongs to a visible all-groups subject that has no explicit subgroup-selection row, reuse the broader Academic V2 subject catalog as a safe fallback for lecture/general schedule rendering, and no longer hard-block week cards only because the scope is missing a legacy course id so valid Academic V2 slots still render in “Твій тиждень”
v1.3.75
2026-03-30
- fix(academic-v2-advanced-schedule-sync): make the `/admin/pathways` advanced schedule editor honor explicit activity-mode changes instead of sticking to the previous hidden activity id, and sync advanced term/day/class/week/group edits back into the calendar workspace state before submit so newly added or edited rows reopen in the correct term, week, and slot instead of disappearing behind a stale schedule view
v1.3.74
2026-03-30
- fix(academic-v2-schedule-subject-mode-and-multiweek): simplify `/admin/pathways` schedule editing so admins first choose a subject and then its activity mode instead of picking duplicated subject-activity rows, keep the existing `group_subject_activity_id` save contract behind hidden inputs, and let week fields accept comma-separated values like `1, 3, 5` that save or reuse separate Academic V2 schedule rows per week
v1.3.73
2026-03-30
- fix(academic-v2-schedule-field-sizing): normalize control sizing in the `/admin/pathways` schedule workspace by introducing dedicated calendar and advanced-editor form grids, widening long activity/mode selectors, moving subgroup multiselects onto their own full-width row with a shorter fixed height, and aligning schedule action buttons so the tab reads as one consistent editing surface on desktop while still collapsing cleanly on smaller screens
v1.3.72
2026-03-30
- fix(academic-v2-subject-alphabetical-order): remove manual sort-order inputs from stage and live course subject editors in `/admin/pathways`, sort Academic Setup subject lists alphabetically by subject title as the primary order, and preserve existing `sort_order` values on backend updates when no explicit order is submitted so legacy compatibility data stays intact
v1.3.71
2026-03-30
- fix(academic-v2-workspace-state): keep `/admin/pathways` in the same scoped workspace after redirects by persisting the current architecture/workspace mode, active tab, selected course subject, schedule view/week draft, and scroll position per focus scope so Academic Setup no longer drops admins back to the default top-of-page state after save actions
v1.3.70
2026-03-30
- fix(registration-dark-theme-contrast): strengthen dark-theme text contrast on `/register/course` and `/register/subjects` by forcing explicit registration-surface text tokens on course scope cards, campus/cohort buttons, and subject-selection panels, plus brightening outline actions and footer text so registration content no longer renders dark-on-dark
v1.3.69
2026-03-30
- fix(registration-postgres-subject-flow): make Academic V2 registration and student subject loaders Postgres-safe by replacing legacy `COALESCE(..., TRUE/FALSE)` filters with text-normalized boolean checks, removing nullable `? IS NULL` subject-term predicates from `/register/subjects`, skipping `user_registration_events.course_id` updates when the repaired legacy course is missing, and hardening one remaining typed-null retake update so registration no longer trips the reported database errors after course selection
v1.3.68
2026-03-30
- feat(registration-cohort-scope-selector): rebuild `/register/course` into an explicit level -> program -> cohort -> campus selector backed by a richer Academic V2 `registrationScopeMatrix`, show all cohorts for the selected program with readiness and blocked setup reasons instead of silently auto-selecting the first ready path, keep blocked campuses visible with inline conflict/setup labels, hydrate only already-valid saved selections on revisit, and disable Continue until the academic group is explicitly confirmed
v1.3.67
2026-03-30
- feat(academic-v2-admin-workspace-refactor): rebuild `/admin/pathways` into separate architecture and course-workspace modes with a sticky scoped header, workspace tabs, and localized navigation; redesign live course subjects into a catalog + course cards + detail-editor flow with nested activity management and readiness states; refactor terms into operational term cards; add a grid-first schedule workspace with calendar, subject, teacher, and subgroup views plus advanced-row fallback; and replace the raw bulk reassignment block with a safer student assignment panel that shows selection counts and a confirmation summary before submit
v1.3.66
2026-03-30
- feat(academic-v2-activity-integrity-actions): add direct Focus and Edit actions for missing-activity subjects in the Academic Setup v2 Activity integrity panel, preserve full subject payloads for those diagnostics so the existing editors can open in-place, and extend `scripts/academic-v2-cleanup.js` with an `--activity-integrity` audit mode plus optional `--program-id`, `--template-stage`, `--group-id`, and `--write-snapshot` flags for CLI snapshots
v1.3.65
2026-03-30
- fix(academic-v2-activity-validation-and-diagnostics): stop the stage/course activity editors from silently overwriting an existing row when the same activity type already exists, return explicit duplicate-activity validation messages instead, and add an Activity integrity panel in Academic Setup v2 that shows stage-template and live-course subjects which still have no activity rows in the current focus scope
v1.3.64
2026-03-30
- fix(academic-v2-activity-baselines): backfill a default `lecture` activity for existing stage subject templates and live course subjects that still have none, auto-seed that baseline on future subject saves and stage-template application, and block deleting the last remaining activity so the new activity-based schedule editor never falls back to an empty target set
v1.3.63
2026-03-30
- feat(academic-v2-subject-activities-and-schedule): add stage and live `lecture|seminar|practice|lab` activity entities for Academic Setup v2 subjects, let stage templates seed activity sets into courses, move manual schedule editing to `group_subject_activity_id + target_group_numbers`, and update student/course schedule runtime plus legacy schedule projection to treat lectures as all-groups rows and grouped activities as subgroup-targeted rows
v1.3.62
2026-03-30
- fix(registration-catalog-fail-open-for-repairable-v2-groups): let `/register/course` build tracks, programs, cohorts, and campuses from stage-1 Academic V2 groups that already have visible subjects even when legacy compat bridge ids or mapped subject projection are still missing, keep only true campus blockers such as duplicate student groups or unresolved teacher defaults disabled in the UI, and move the final projection plus legacy study-context repair to `POST /register/course` before placement is persisted
v1.3.61
2026-03-30
- fix(academic-v2-group-study-context-bridge): let Academic Setup v2 course edits auto-create or reuse the exact legacy study context for the saved `course + admission + stage + campus` before showing a compatibility warning, so normal course updates stop tripping the deferred study-context bridge banner
v1.3.60
2026-03-30
- fix(academic-v2-term-projection-flags): write legacy semester `is_active` and `is_archived` values as `1/0` during Academic V2 term projection so creating or editing a term stops tripping the legacy projection sync warning on Postgres-backed installs
v1.3.59
2026-03-29
- fix(academic-v2-course-save-warning): restore the missing `invalidateAcademicV2CompatibilityCaches(...)` helper in `app.js` so successful Academic Setup v2 course edits stop showing a false compatibility-cache warning banner after save
v1.3.58
2026-03-29
- feat(teacher-registration-without-admission-year): add a teacher-only registration path that resolves `program + campus -> academic_v2 group` without exposing cohort selection, add `is_teacher_registration_default` on Academic V2 groups with admin controls in Academic Setup v2, and surface teacher campus ambiguity states when multiple groups share one campus without exactly one default
v1.3.57
2026-03-29
- fix(academic-v2-course-save-route-messages): restore the missing `getAcademicV2RouteMessages(...)` helper in `app.js` so Academic Setup v2 program/cohort/course/term mutation routes stop throwing a raw 500 before they can redirect with a normal success or validation error notice
v1.3.56
2026-03-29
- fix(academic-v2-postgres-query-hardening): remove ambiguous `? IS NULL` duplicate-course checks, replace validated `LIMIT CAST(? AS INTEGER)` clauses with safe inline numeric limits in cleanup and normalization helpers, and stop updating cohort `current_stage_number` through `COALESCE(?)` so Academic Setup v2 and related admin diagnostics are less likely to degrade on Postgres type inference edge cases
v1.3.55
2026-03-29
- fix(admin-pathways-v2-missing-role-resolver): replace the stray `getAcademicV2PageRole(...)` call in `/admin/pathways` with a session-backed normalized role value so Academic Setup v2 stops crashing on render and the degraded fallback can actually open
v1.3.54
2026-03-29
- fix(admin-pathways-v2-fail-open-render): make `/admin/pathways` fall back to a degraded Academic Setup v2 page instead of returning a 500 when the v2 page data build or render-prep still throws, and emit a dedicated `admin.pathways.v2.render.degraded` runtime event so the remaining root cause is visible without blocking the screen
v1.3.53
2026-03-29
- fix(global-ui-text-mojibake): restore 785 corrupted Ukrainian string literals in `app.js` from the last healthy pre-corruption revision so labels, banners, selects, cards, and notices across journal, admin, registration, myday, teamwork, and related pages render readable text again instead of mojibake symbols
v1.3.52
2026-03-29
- fix(admin-pathways-v2-render-query-types): harden Academic Setup v2 render queries in `lib/academicV2.js` against mixed legacy `int/bool` flags by switching render-time `is_active` and `is_archived` checks to text-normalized boolean predicates, cast render-time `LIMIT` parameters explicitly for Postgres, and add a page-level fallback payload so `/admin/pathways` degrades with warnings instead of dying on one broken panel query
v1.3.51
2026-03-29
- fix(registration-v2-ready-groups-and-summary-contrast): stop treating a missing active Academic V2 term as a hard blocker for registration-ready groups so valid programs and cohorts appear in `/register/course` again after the schedule cutover, and tune the registration summary card styling in `public/js/design-system.js` so the dark-theme preview text stays readable instead of collapsing into a dim track-only label
v1.3.50
2026-03-29
- fix(academic-v2-missing-helpers): restore the missing `parseAcademicV2Focus`, `buildAcademicV2NoticeUrl`, and `loadAcademicV2LegacyStudentRows` helpers in `app.js`, unblocking Academic Setup v2 routing and the student compat flows used by myday, teamwork, and journal pages
v1.3.49
2026-03-29
- fix(admin-pathways-v2-render-warning-normalizer): replace the missing render-warning message helper in `lib/academicV2.js` so Academic Setup no longer crashes with a `ReferenceError` when one of its optional data queries fails and the page falls back to degraded rendering
v1.3.48
2026-03-29
- fix(admin-pathways-v2-render-resilience): make Academic Setup render helpers tolerate partial query failures with safe fallbacks so one broken optional panel no longer turns `/admin/pathways` into a generic `Database error (admin.pathways.v2.render)`
v1.3.47
2026-03-29
- fix(admin-pathways-v2-render): replace the remaining Academic Setup render-time boolean casts in `lib/academicV2.js` with boolean-safe predicates so opening Academic Setup no longer fails with a generic `Database error (admin.pathways.v2.render)`
v1.3.46
2026-03-29
- fix(admin-users-course-transfer): remove the admin-only guard from the Academic V2 user transfer path so admins can be moved onto the correct course or group again, including legacy course fallback resolution in the modal and batch move flow
v1.3.45
2026-03-29
- fix(admin-users-course-move-and-schedule-week-card-contrast): allow admin user reassignment to resolve legacy course input into an Academic V2 group again, keep the users refresh query state-driven so the table does not collapse after modal interactions, and raise the active week-card contrast so the selected week keeps its label and range readable
v1.3.44
2026-03-29
- fix(admin-academic-v2-projection-copy): replace the mojibake Academic V2 projection banner text in `app.js` with clean English messages so the admin sidebar and users panel stop rendering broken alert copy after the previous encoding-safe refactors
v1.3.43
2026-03-29
- fix(schedule-admin-v2-scope-and-bool-filters): switch the admin `/schedule` fallback path to course subject scope data for Academic V2 courses instead of legacy subject/group loaders, and harden schedule homework/custom-deadline filters in `app.js` to use boolean-safe conditions for `is_custom_deadline`, eliminating the remaining V2 schedule open failures that still surfaced as generic `Database error`
v1.3.42
2026-03-29
- fix(app-startup-syntax-and-homework-clause): quote the legacy role alias keys in `app.js` so the server boots cleanly again, and restore the my-day homework SQL fragment to a valid template literal so the Cloud Run container can start and listen on `PORT=8080`
v1.3.41
2026-03-29
- fix(schedule-db-errors): remove the remaining legacy `study_context.course_id` dependency from Academic V2 cleanup/audit queries and harden scheduled message/homework comparisons so opening `/schedule` no longer trips PostgreSQL type errors on scheduled timestamps or stale legacy context rows
v1.3.40
2026-03-29
- fix(admin-users-refresh-scope-preservation): make `/admin/users.json` refreshes read live users filter form state and keep Academic V2 scope anchored without falling back to a legacy `course` query, so switching status/role filters or opening the user modal no longer collapses the table into the wrong empty state
v1.3.39
2026-03-29
- fix(academic-v2-schedule-cutover): stop projecting Academic V2 schedule rows back into legacy `schedule_entries`, block legacy admin schedule writes for V2-backed courses, and route old schedule views to the V2 schedule source so new courses no longer auto-pick up legacy subjects or auto-generated legacy schedules
v1.3.38
2026-03-29
- fix(academic-v2-course-save-followups-and-error-mapping): harden `handleAcademicV2MutationRoute(...)` in `app.js` so cache refresh, focus restore, and legacy study-context compatibility follow-ups for `/admin/pathways/v2/groups/save` now degrade into warnings instead of flipping a successful course save back into the generic `Action failed` state, while `saveGroup(...)` in `lib/academicV2.js` now normalizes raw Academic V2 DB/schema write errors from both precheck and write phases into explicit route errors such as `GROUP_LABEL_DUPLICATE`, `GROUP_INVALID`, `GROUP_SAVE_RETRY`, `ACADEMIC_V2_SCHEMA_INCOMPATIBLE`, and `GROUP_SAVE_FAILED`
v1.3.37
2026-03-29
- fix(admin-users-v2-scope-refresh-parity): align both `/admin` user-list rendering and `/admin/users.json` in `app.js` so program, admission, track, stage, campus, and study-context filters now resolve users through `users.group_id -> academic_v2_groups -> academic_v2_cohorts/programs` before falling back to legacy `study_contexts`, preventing the users table from collapsing to an empty state after client-side refreshes when the current scope is already anchored in Academic V2 placement
v1.3.36
2026-03-29
- fix(academic-v2-course-save-guards): harden `saveGroup(...)` in `lib/academicV2.js` so academic-v2 course edits now fail with mapped `GROUP_NOT_FOUND`, `COHORT_NOT_FOUND`, or `COURSE_STAGE_CAMPUS_DUPLICATE` route errors instead of crashing into the generic `Action failed` flash when the submitted group/cohort is stale or a race hits the underlying `academic_v2_groups` constraints
v1.3.35
2026-03-29
- fix(shared-messages-runtime-help-myday): remove the stale `${courseFilter}${semesterFilter}` SQL fragments from `listVisibleMessagesForUser(...)` in `app.js`, fixing the runtime `ReferenceError` that was surfacing as `Database error (help.v2)` and `Database error (myday)` whenever Help or My Day tried to load the shared inbox/messages digest
v1.3.34
2026-03-29
- fix(register-course-empty-state-and-copy): adjust `views/register-course.ejs` so disabled campus cards keep their stacked layout instead of collapsing text into one row, localize the summary card in Ukrainian, and replace the remaining student-facing registration copy that still described campus selection as resolving a legacy `course` instead of the academic-v2 group
v1.3.33
2026-03-29
- feat(register-academic-v2-group-cutover): refactor `/register/course` in `app.js` so registration placement now resolves strictly from stage-1 `academic_v2_groups` by `study_track + program_id + cohort_id + campus + group_id`, removes the legacy `course_id` / `study_context_id` fallback path, and writes those legacy ids back to `users` only as compatibility metadata after `bulkAssignUsersToGroup(...)` succeeds
- fix(register-subject-flow-group-only): tighten `/register/subjects` and `/register/teacher-subjects` in `app.js` so both subject-selection flows now require an academic-v2 scope that was resolved via `group_id`, fail closed when only legacy placement exists, and route teacher registration from the selected academic-v2 group instead of re-deriving access from legacy course flags
- feat(register-ready-group-audit): add registration readiness helpers in `lib/academicV2.js` plus moderation audit wiring in `app.js`, so only active stage-1 groups with one campus match, an active term, visible mapped subjects, and complete compatibility bridge ids appear in registration while duplicate or not-ready groups are pushed into the academic moderation queue
v1.3.32
2026-03-29
- feat(messages-runtime-v2-scope): add a shared academic runtime audience resolver in `app.js` so `/help`, `/messages.json`, and `My Day` inbox cards now build course, term, subject, and group visibility from `group_id` / teacher assignments / selected academic-v2 course scope instead of assuming one raw legacy `course_id` + `semester_id` per user
- fix(uploads-access-v2-course-membership): update `resolveStoredUploadAccess(...)` in `app.js` to authorize homework, material, asset, submission, and journal export files against all live course IDs visible through the academic-v2 runtime scope, so teachers and other staff no longer lose file access when their projected course ownership lives on `users.group_id` instead of only `users.course_id`
- refactor(message-read-recipients-v2-membership): change `/admin/api/messages/:id/reads` in `app.js` to resolve broadcast and direct recipients through `academic_v2_groups.legacy_course_id` membership, while subject recipients now correctly treat `group_number = null` as full-subject audience instead of forcing the old raw `u.course_id` path
v1.3.31
2026-03-29
- feat(academic-v2-runtime-scope): add `lib/academicV2Runtime.js` and wire it into `app.js` so live course scope, active term resolution, teacher subject ownership, and course membership can now be resolved from `academic_v2_*` by `legacy_course_id` instead of rebuilding page state only from legacy `study_contexts` / `course_id` tables
- refactor(admin-staff-read-cutover): update the main `/admin` render, `starosta`, and `deanery` flows in `app.js` to read subjects and user membership from the v2-aware course scope, widen course-scoped user queries and weekly user analytics to include `users.group_id -> academic_v2_groups.legacy_course_id`, and surface a shared projection warning in `views/admin.ejs` whenever the selected course still has missing term/subject compatibility bindings
- refactor(teacher-runtime-v2-subject-schedule-teamwork): switch teacher-facing `/subjects`, `/schedule`, `/subjects/materials`, and teamwork access checks to `getTeacherAssignedSubjects(...)` plus the new batch teacher-assignment lookup, add explicit projection alerts to `views/teamwork.ejs`, and stop the remaining live teacher flows from depending on legacy mirror assignment rows as their primary read path
- fix(legacy-compat-membership-helpers): extend `lib/academicSetup.js` helpers such as `listLegacyCourseUsers`, `listLegacyCourseStudentGroupAssignments`, `listLegacySubjectStudentRows`, `countLegacySubjectStudents`, and `countLegacyMessageRecipients` so admin lists, teamwork student pools, message audience counts, and other compatibility reads treat `users.group_id` / projected `legacy_course_id` as first-class membership instead of requiring raw `users.course_id` to stay authoritative
v1.3.30
2026-03-28
- fix(academic-v2-render-legacy-audit-compat): harden `lib/academicV2.js` so cleanup-audit queries used by `/admin/pathways` treat missing legacy config tables or columns as compatibility gaps instead of fatal DB errors, allowing Academic Setup v2 to render even when older environments do not have the full legacy pathways/config schema available for the dry-run audit surface
v1.3.29
2026-03-28
- refactor(admin-users-legacy-reassignment-freeze): replace the remaining legacy `/admin/users/study-context`, `/admin/users/study-context/batch`, and `/admin/users/course` mutation handlers in `app.js` with explicit cutover redirects, so admin user reassignment can no longer write the old academic model behind the back of the academic-v2 course source of truth
- fix(admin-users-no-v2-course-block-state): update the manage-user modal in `views/admin.ejs` so when no academic-v2 course options exist for the current scope it no longer falls back to posting legacy `course_id` writes, but instead disables the save path and shows a clear message that the missing course must be created or mapped in Academic Setup v2 first
v1.3.28
2026-03-28
- feat(admin-users-v2-course-reassignment): add `listAssignableAdminAcademicGroups(...)` plus new `/admin/users/group` and `/admin/users/group/batch` handlers in `app.js`, so admin-side single and bulk user moves can now target academic-v2 `group_id` directly and let projection sync update legacy `course_id` / `study_context_id` as a compatibility consequence instead of treating those legacy fields as the source of truth
- refactor(admin-users-v2-options-and-response-shape): extend `/admin/users.json` and the admin scope bootstrap in `app.js` with `availableAcademicGroups`, `academic_group_id`, `academic_group_label`, and shared `group_options`, which gives the users table and reassignment modal a stable v2 course-option payload instead of rebuilding choices only from legacy study-context rows
- refactor(admin-users-course-first-ui): update `views/admin.ejs` so the users bulk bar and manage-user modal submit `target_group_id` / `group_id` to the new v2 reassignment routes, show course-first copy in the UI, and keep the legacy course dropdown only as a fallback when no academic-v2 course metadata is available yet
v1.3.27
2026-03-28
- feat(academic-v2-cleanup-apply-layer): extend `lib/academicV2.js` with `normalizeUsersIntoAcademicV2Groups(...)` and `archiveStaleLegacyAcademicConfig(...)`, add stale preset/offering detail rows to the cleanup audit surface, and keep the new cleanup logic dry-run/apply compatible so `users.group_id` normalization and orphan legacy academic config archiving can be reviewed before anything mutates
- feat(academic-v2-cleanup-cli): add `scripts/academic-v2-cleanup.js` as an explicit operational CLI for `--normalize-users`, `--archive-legacy-config`, optional `--resync-all`, and `--apply`, giving the cutover a separate non-UI execution path for cleanup work instead of hiding destructive actions inside the daily admin surface
- refactor(admin-users-v2-placement-preference): update `app.js` so `/admin/users.json` and `/admin/export/users.csv` prefer `users.group_id` plus projected `legacy_course_id` / `legacy_study_context_id` when available, reducing the admin users list and CSV export dependence on raw legacy study-context placement while the remaining staff flows are still being migrated
- chore(academic-v2-health-cli-hints): add direct cleanup command hints to the Projection Health card in `views/admin-academic-v2.ejs`, so the v2 admin surface now points operators at the new CLI cleanup workflow instead of implying that legacy config cleanup should happen inline from the UI
v1.3.26
2026-03-28
- refactor(legacy-academic-admin-archive-shell): turn the legacy Subjects / Semesters / Courses panels in `views/admin.ejs` into explicit read-only archive views with direct links back to Academic Setup v2, so the main admin UI no longer presents the old academic config surfaces as live editors while legacy IDs remain visible for compatibility and export flows
- feat(academic-v2-cleanup-details): add `loadAcademicCleanupDetails(...)` to `lib/academicV2.js` so cleanup work can inspect concrete users, courses, subjects, semesters, and study-context rows behind the dry-run counters instead of relying only on aggregate numbers
- feat(academic-v2-audit-snapshots): extend `scripts/academic-v2-audit.js` with `--details`, `--limit`, `--out`, and `--write-snapshot`, allowing dry-run/resync audit output to be written to a JSON snapshot file for manual cleanup review before touching legacy academic config
v1.3.25
2026-03-28
- feat(academic-v2-stage-templates-and-promotion): add `migrations/043_academic_v2_stage_templates.js`, extend `lib/academicV2.js`, and wire new `/admin/pathways/v2/stage-terms`, `/admin/pathways/v2/stage-subjects`, `apply-stage-template`, and `cohort promotion` routes in `app.js`, so each program now owns stage 1..4 term/subject templates and cohorts can be promoted onto a new live course stack through an explicit preview + apply flow
- fix(academic-v2-course-ui-and-empty-focus): rename `group` to `course` across `views/admin-academic-v2.ejs`, add stage-template and promotion controls to the admin surface, and stop `buildFocusState(...)` in `lib/academicV2.js` from auto-falling onto a different live course when a cohort has no selected course, which keeps new cohorts empty until a course is created or a stage template is explicitly applied
- fix(academic-v2-stable-term-save-and-settings-flags): split legacy projection sync out of term/course/subject/schedule writes in `lib/academicV2.js` so projection failures now downgrade to warnings instead of rolling back `academic_v2_*` rows, and make the new stage/course settings checkboxes in `views/admin-academic-v2.ejs` submit real `0/1` values so visibility, required/general flags, teamwork, archived state, and active markers can actually be turned off
v1.3.24
2026-03-28
- fix(admin-users-live-refresh): harden the `views/admin.ejs` users table refresh flow so modal opens, websocket-driven updates, and other in-page actions no longer wipe the current list when `/admin/users.json` refreshes overlap or fail, and escape client-rendered user fields before rebuilding rows to prevent malformed markup from collapsing the table until a full reload
v1.3.23
2026-03-28
- feat(academic-v2-cutover-audit): extend `lib/academicV2.js` and `views/admin-academic-v2.ejs` with projection health status, cleanup dry-run counts, and batch `resync all group projections`, and add `scripts/academic-v2-audit.js` for an explicit out-of-band dry-run/resync flow so `/admin/pathways` is not the only place to inspect legacy drift, user normalization gaps, and projection completeness before destructive cleanup
- feat(academic-v2-safe-delete-guards): add guarded delete flows for programs, cohorts, groups, and subject templates in `lib/academicV2.js` plus new `/admin/pathways/v2/.../delete` routes in `app.js`, so archive remains the default soft path while hard delete is only allowed when no live terms, subjects, enrollments, users, or legacy compatibility bindings still depend on the row
- feat(legacy-academic-write-freeze): insert early legacy write blockers in `app.js` for old `/admin/pathways/*`, `/admin/subjects/*`, `/admin/courses/*`, `/admin/semesters/*`, and manual `/admin/schedule/*` POST mutations, redirecting those requests to `/admin/pathways` with an explicit cutover notice instead of letting legacy config drift continue outside `academic_v2_*`
- refactor(admin-academics-navigation): repoint the main admin sidebar in `views/admin.ejs` from legacy Subjects / Semesters / Courses tabs to the canonical `academic v2` surface, and relabel the legacy pathways button in `views/admin-academic-v2.ejs` as a read-only compatibility view so daily admin work now funnels into one academic system
v1.3.22
2026-03-28
- fix(admin-topbar-course-navigation): replace the admin topbar course selector's inline `onchange` submit in `views/admin.ejs` with an explicit client-side `window.location.assign(...)` redirect that preserves the active tab and clears stale academic scope params, so choosing another course now forces a real page navigation instead of depending on a fragile inline form submit path
v1.3.21
2026-03-28
- fix(admin-topbar-course-switch-force-scope): make `buildAdminAcademicScopeState(...)` pass `preferCourseOnly` into `resolveAdminAcademicScopeState(...)` when the topbar sends `reset_scope=course`, so changing the admin topbar course no longer rehydrates a hidden legacy academic context and silently keeps page content on the previous course
- fix(admin-course-switch-content-refresh): update `lib/academicSetup.js` so a topbar-driven course switch resolves to a strict `course-only` admin scope for both legacy and projected academic-v2 courses, which lets course-scoped `/admin` sections like users, homework, schedule, and messages actually reload against the selected course
v1.3.20
2026-03-28
- fix(admin-v2-course-only-scope): update `resolveAdminAcademicScopeState(...)` in `lib/academicSetup.js` so when the selected course exists in legacy `courses` but has no matching legacy `study_context`, the admin panel stays on that exact `course_id` instead of silently snapping back to the first old academic context
- fix(admin-page-content-course-switch): keep contextless academic-v2 projected courses in a `course-only` admin scope, which makes `/admin` content such as user lists, filters, and other course-scoped sections actually reload against the newly selected projected course instead of continuing to show the old legacy course data
v1.3.19
2026-03-28
- fix(admin-course-switch-topbar): simplify the admin header scope chip in `views/admin.ejs` to a single course selector plus campus badge, removing the stacked track/program/admission/stage/campus dropdowns that made the topbar oversized and noisy
- fix(admin-course-switch-reset): make `buildAdminAcademicScopeState(...)` in `app.js` honor `reset_scope=course` from the topbar selector so switching the course clears stale stored academic scope and actually re-resolves the page against the newly selected course instead of silently sticking to the previous context
- style(admin-topbar-compact-width): tighten `.admin-nav`, `.admin-topbar-left`, and `.admin-course-chip` in `public/css/pages/admin.css`, bringing the admin topbar back to a narrower compact shell and resizing the remaining course selector for the simplified layout
v1.3.18
2026-03-28
- fix(schedule-projection-alert-rendering): pass `projectionAlert: null` from the teacher and legacy compatibility render branches in `app.js` so `views/schedule.ejs` can safely render its new projection warning block without throwing `ReferenceError: projectionAlert is not defined` outside the student v2 path
v1.3.17
2026-03-28
- feat(student-v2-read-expansion): extend the academic v2 student compatibility scope in `app.js` beyond `/register/subjects`, `/subjects`, and `/schedule` by adding `loadAcademicV2LegacyStudentRows(...)` and routing student-like runtime reads for messages, My Day workload, journal student subject options, and teamwork subject scope through v2-selected subjects instead of `listLegacyStudentGroupRows(...)`
- feat(student-role-cutover-hardening): treat `starosta` as a student-like runtime role for v2 subject and schedule reads, while keeping only teacher/admin/deanery compatibility paths on the remaining legacy student-group readers
- fix(student-compatibility-scope-filtering): make inbox/message scope, homework workload targeting, journal subject pickers, and teamwork filtering derive their legacy `subject_id/group_number/course_id` bridge from academic v2 selection state, so incomplete or stale legacy group assignments no longer silently drive normal student-facing reads
v1.3.16
2026-03-28
- feat(student-v2-read-cutover): add `lib/academicV2Students.js` and switch plain-student `/register/subjects`, `/subjects`, and `/schedule` reads onto academic v2 `group -> term -> group_subject` scope with fallback resolution through `users.group_id`, legacy `study_context_id`, and legacy `course_id`, while leaving teacher/admin schedule and subjects flows on the legacy runtime
- feat(student-v2-compatibility-bridge): add a student-side legacy compatibility bridge in `app.js` that derives schedule visibility from v2 group subjects and schedule entries, but still loads `student_groups`, `user_subject_optouts`, materials, homework, reactions, assets, and custom deadlines through legacy subject and semester bindings so existing runtime history stays readable during the cutover
- fix(student-projection-incomplete-ux): show explicit `projection incomplete` warnings in `views/register-subjects.ejs`, `views/subjects.ejs`, and `views/schedule.ejs`, and sync `users.group_id` after registration study-context assignment so missing v2 mappings fail visibly instead of silently falling back to confusing empty student screens
v1.3.15
2026-03-28
- fix(academic-v2-startup-latency): move `ensureDbReady()` ahead of `server.listen(...)` in `app.js` so the app no longer accepts requests while DB init is still running, which previously made the first page load appear to hang for a very long time
- fix(academic-v2-migration-boot-path): disable heavy legacy auto-import in `migrations/042_academic_v2_core.js` by default and keep it behind `ACADEMIC_V2_IMPORT_LEGACY=true`, so adding the new academic v2 schema no longer drags a full backfill through every startup/deploy path
v1.3.14
2026-03-28
- feat(academic-v2-admin-shell): add a new `views/admin-academic-v2.ejs` + `public/css/pages/admin-academic-v2.css` admin workspace for `Program -> Cohort -> Group -> Term -> GroupSubject`, including focus navigation, manual schedule CRUD, teacher assignment, and bulk user reassignment while moving the default `/admin/pathways` experience off the old pathways surface
- feat(academic-v2-service-and-projection): add `lib/academicV2.js`, wire new `/admin/pathways/v2/...` CRUD routes in `app.js`, keep `app.js` as a thin routing layer, and rebuild legacy compatibility data through one-way projection plus shared cache invalidation instead of writing new admin state back into the old pathways/presets/contexts/offering flows
- feat(academic-v2-schema-bootstrap): register `migrations/042_academic_v2_core.js` in `migrations/index.js`, seed the new academic core tables from existing legacy data, and extend authenticated session payloads with `group_id` so the new group-scoped academic context is available alongside transitional `course_id`
v1.3.13
2026-03-28
- feat(pathways-cohort-status-explainers): enrich cohort cards in `views/admin-pathways.ejs` with hover detail popovers that explain the current readiness state in plain language, including mapping, subject, campus, override, and user-assignment reasons instead of only showing a short status pill
- feat(pathways-cohort-delete-flow): add a guarded `POST /admin/pathways/admissions/:id/delete` flow in `app.js` that removes the cohort's live contexts and the underlying admission year, blocks deletion while users are still attached, and cleans up orphan subject offerings after cascade deletes
- style(pathways-cohort-action-popovers): add dedicated cohort status/delete hover-card styling in `public/css/pages/admin-pathways.css`, and switch admission card forms onto unified hidden focus fields so edit and delete actions preserve the shared Academic Setup context
v1.3.12
2026-03-27
- feat(pathways-unified-focus-state): add a canonical `pathwaysFocus` payload to `/admin/pathways`, seed it from `study_context_id` when available, and use the same normalized focus contract for GET render state, redirect URLs, and Academic Setup scope recovery instead of rebuilding program/admission/context/preset state piecemeal
- refactor(admin-pathways-focus-fields): rework `views/admin-pathways.ejs` so the page derives its selected scope from one normalized focus object, `buildPathwaysUrl(...)` now uses that shared state, and repeated hidden focus inputs in preset/context/offering/moderation forms are generated through a single `renderPathwaysFocusFields(...)` helper
- refactor(pathways-post-redirect-continuity): switch program and admission add/update actions in `app.js` onto the same canonical pathways redirect state, reducing dependence on separate `focus_program_id` / `focus_admission_id` flows and keeping Academic Setup focused on one shared context across GET and POST transitions
v1.3.11
2026-03-27
- fix(admin-scope-topbar): add an explicit course selector to the admin scope chip, keep the current course summary compact, and preserve the selected academic scope while switching courses from the topbar
- fix(schedule-mobile-carousel): turn the schedule week carousel into a mobile scroll-snap strip with a centered active week so the dock no longer collapses into a clipped sliver on small screens
- style(admin-scope-chip-compactness): tighten the admin topbar chip and scope select widths so the active course is readable without flooding the header with the full scope path
v1.3.10
2026-03-27
- refactor(runtime-homework-facades): add `listLegacyCourseHomeworkRows(...)` and `listLegacyTeacherHomeworkRows(...)` to `lib/academicSetup.js`, then switch `app.js` course-homework access helpers off hand-written binding/fallback SQL so these reads now go through the Academic Setup service layer
- refactor(shared-course-subject-cache): move `getSubjectsCached(...)` in `app.js` onto `listLegacyCourseSubjects(...)`, removing another duplicated binding-aware subject read and keeping shared/bound subject access logic in one facade instead of scattered helper SQL
- feat(teacher-workspace-shared-homework-scope): make teacher workspace templates, assets, and recent homework use derived shared storage scope and legacy semester mapping, so bound-course contexts can still see shared subject homework/runtime artifacts instead of relying only on raw `course_id = selectedCourseId` filtering
v1.3.09
2026-03-27
- feat(teacher-workspace-primary-path): turn `/teacher/subjects` into an explicit compatibility wrapper that redirects normal teacher traffic back into `/teacher/workspace`, preserves `course/study_context/semester` scope across the wrapper, and returns successful legacy saves to the workspace instead of keeping the old page as a normal-path editor
- refactor(teacher-ux-compatibility-positioning): update `views/teacher-hub.ejs`, `views/teacher-subjects.ejs`, and `views/register-teacher-subjects.ejs` so Teacher workspace is the clear primary surface for live scope management while the legacy subject picker is labeled and presented as compatibility-only
- test(teacher-compatibility-render-smoke): extend `test/admin-render-smoke.test.js` with coverage for the legacy teacher-subjects wrapper and the profile-edit teacher registration screen so the new compatibility copy and workspace escape-hatch paths stay EJS-safe
v1.3.08
2026-03-27
- feat(academic-setup-primary-flow-strip): add an explicit August setup flow strip to `views/admin-pathways.ejs` so admins can move through programs, intake, cohorts, live contexts, and teacher scope from one primary workspace instead of mentally stitching the order together
- refactor(pathways-compatibility-shell): collapse legacy course mapping, legacy subject visibility, campus routing, and migration into a single advanced `Compatibility tools` details shell with summary metrics, keeping these bridge/debug surfaces accessible without letting them dominate the primary Academic Setup flow
- tune(pathways-hero-and-context-ux): shift the hero metrics away from legacy mapping/visibility counts toward live contexts and moderation, and update empty-context guidance so missing stage cards send admins back into intake/cohort setup instead of back into legacy mapping by default
v1.3.07
2026-03-27
- refactor(course-wide-student-group-facades): add `listLegacyCourseStudentGroupAssignments(...)`, `countLegacySubjectStudents(...)`, and `countLegacyMessageRecipients(...)` to `lib/academicSetup.js`, with binding-first reads and compatibility fallback for legacy schemas so repeated course-scoped student-group aggregates no longer need route-level SQL
- refactor(runtime-course-aggregate-cleanup): move admin/users placement reads, admin and starosta message target counts, deanery subject monitoring counts, and users CSV semester-scoped placement filtering in `app.js` onto Academic Setup service-layer facades while keeping `courseId` as a derived runtime key
- test(academic-setup-course-group-aggregates): extend `test/pathways.test.js` with contract coverage for the new course-wide assignment, subject-student count, and batched message-recipient helpers to lock their normalized runtime wire format
v1.3.06
2026-03-27
- refactor(student-runtime-academic-facades): add `listLegacyStudentGroupRows(...)`, `listLegacySubjectStudentRows(...)`, and `getLegacyStudentSubjectGroup(...)` to `lib/academicSetup.js`, with binding-aware fallback logic for legacy schemas so repeated student-group and subject-student reads no longer live as route-level SQL in `app.js`
- refactor(course-derived-runtime-cleanup): move canonical student-group lookups in messages, dashboard/workload, schedule view, journal subject options, journal student access checks, teamwork student targeting, and message recipient resolution onto Academic Setup facades while keeping legacy runtime modules on derived `courseId`
- refactor(scoped-user-security-lookups): switch scoped user/session/risk-case checks in admin security endpoints to `getLegacyCourseUser(...)`, and extend `test/pathways.test.js` with contract coverage for the new student-group and subject-student facade helpers
v1.3.05
2026-03-27
- feat(canonical-scope-admin-redirect-hardening): replace the remaining hand-built `/admin?ok|err` redirects in messages, homework, settings, import/export, subjects, courses, semesters, activity resets, teacher request moderation, and schedule/session generator flows with scope-aware redirect builders so canonical academic scope survives admin mutations and secondary generator paths
- refactor(course-derived-academic-facades): add service-layer helpers in `lib/academicSetup.js` for legacy course semesters, subjects, users, support threads, and dependency counts, then switch `app.js` wrappers and critical users/students/roles/course-delete flows onto those facades instead of route-level SQL
- test(academic-setup-course-facades): extend `test/pathways.test.js` with narrow contract coverage for the new legacy course facade helpers, including active semester lookup, schema-compat subject fallback, filtered course-user reads, and normalized dependency counts
v1.3.04
2026-03-27
- refactor(teacher-assignment-runtime-facade): add a generic `listTeacherAssignmentRows(...)` service helper in `lib/teacherTemplates.js` and move teamwork task visibility, session teacher conflict resolution, and teacher-group data-quality diagnostics in `app.js` off direct `teacher_subjects` joins
- refactor(pathways-legacy-course-bridge): add Academic Setup helpers for legacy subject-to-admission lookups, teacher subject catalog labels, and `program_admission_courses` upsert/copy operations, then switch subject offering sync, teacher catalog loading, admission cloning, and pathways course mapping writes to those service-layer bridges
- feat(canonical-scope-admin-redirects): add `buildAdminTabUrl(...)` and preserve canonical academic scope through support ticket updates, settings rollback, role studio rollback/create/update/delete, and student group/activation admin mutations instead of hand-built `/admin?tab=...` redirects
v1.3.03
2026-03-27
- feat(canonical-scope-secondary-cleanup): remove the last explicit `?course=` tails from secondary admin flows by preserving canonical academic scope in schedule-health fix links, schedule-generator preview redirects, message read lookups, and admin overview return navigation
- refactor(teacher-compatibility-facades): add service-layer read helpers in `lib/teacherTemplates.js` for teacher request status, teacher request summaries, teacher subject mirror rows, teacher selection rows, course-access checks, and template target resolution, then switch mainline teacher/profile/journal/teamwork/material access flows in `app.js` to those helpers instead of direct route-level SQL
- refactor(pathways-legacy-read-bridges): add `lib/academicSetup.js` facade helpers for legacy registration-pathway rows, admission-course mappings, admission visibility rows, and aggregate stats, and move registration/pathways/context-sync flows in `app.js` onto those helpers so `program_admission_courses` and `subject_visibility_by_admission` are no longer read directly in the primary Academic Setup flow
v1.3.02
2026-03-27
- feat(academic-core-hardening): move canonical moderation issue contracts for registration fallback, missing stage-1 contexts, failed promotion targets, shared offering mismatches, invalid teacher template matches, and missing active semesters into `lib/academicSetup.js`, and wire the main runtime flows to those builders instead of route-level payload duplication
- feat(canonical-scope-secondary-runtime): make teacher workspace redirects derive `course` from `study_context_id`, stop auto-centering the workspace on a lone legacy course when no canonical context is selected, and preserve canonical admin scope through more secondary admin links such as generators, exports, history CSV, archive exports, and staff panel return paths
- feat(moderation-and-smoke-coverage): extend Academic Setup moderation with reopen/reviewing actions and add new unit/render smoke coverage for canonical scope resolution, compatibility mirrors, moderation payload contracts, and critical EJS surfaces including `admin.ejs`, `admin-pathways.ejs`, `teacher-workspace.ejs`, `register-course.ejs`, and `admin-overview.ejs`
v1.3.01
2026-03-27
- fix(admin-support-ejs-parse): remove the nested `<%=` tag from the admin support scope helper block in `views/admin.ejs`, so the support panel template compiles again under EJS instead of crashing with an unmatched close-tag error
v1.3.00
2026-03-27
- feat(academic-setup-moderation-safety-net): add service-layer moderation upserts and new issue producers for registration course fallback, missing stage-1 study contexts, failed promotion targets, contexts without active semesters, shared offering mismatches, and invalid teacher template matches
- feat(canonical-scope-secondary-surfaces): move `/admin/overview`, import/export links, support links, mobile Academic Setup entry, and teacher workspace redirects/forms onto canonical academic scope preservation so `track/program/admission/stage/campus/study_context_id` survives secondary admin and teacher flows
- refactor(context-first-registration-and-resolution): make `/register/course` treat `study_context_id` as the primary placement output, keep raw course resolution only as a compatibility branch with moderation logging, and route moderation context assignment through `assignUserStudyContext(...)` instead of direct user-row updates
v1.2.x 99 релізів ›
v1.2.99
2026-03-27
- refactor(admin-academic-scope-service): move the canonical admin academic scope resolver out of `app.js` into `lib/academicSetup.js`, so track/program/admission/stage/campus context selection now lives in one reusable service instead of route-adjacent monolith code
- refactor(promotion-context-service): move next-stage context resolution for cohort promotion into `lib/academicSetup.js`, keeping `app.js` as a thin transport wrapper while preserving preset application and legacy compatibility behavior for `promote +1`
- fix(scope-filter-service-parity): preserve the old semantics for empty `allowedCourseIds` filters during admin scope resolution, so restricted staff with zero accessible courses do not accidentally fall back to an unscoped academic selector
v1.2.98
2026-03-27
- refactor(academic-setup-user-placement-service): move canonical user placement resolution and assignment into `lib/academicSetup.js`, so `resolveUserAcademicPlacement` and `assignUserStudyContext` stop carrying the full implementation inside `app.js`
- tune(app-placement-wrappers): keep thin wrappers in `app.js` that only inject database access and local label/course helpers into the new Academic Setup service layer, reducing duplication before the next extraction pass on admin scope and promotion flows
- tune(service-boundary-canonical-placement): consolidate the core `study_context_id` placement engine behind one reusable module path, which makes later refactors of admin scope, moderation, and migration flows safer because canonical placement no longer lives as route-adjacent monolith code
v1.2.97
2026-03-27
- refactor(academic-setup-visibility-bridge): move legacy `subject_visibility_by_admission` writes behind helper functions in `lib/academicSetup.js`, including single-row upsert/delete, subject-to-subject mirroring across admissions, and course-scoped visibility copy between admission years
- refactor(teacher-legacy-bridge): move legacy `teacher_subjects` and `teacher_requests` writes into `lib/teacherTemplates.js`, so teacher selection, mirror sync, and request approval/rejection flows stop issuing route-level SQL directly from `app.js`
- tune(app-service-boundaries): slim down Academic Setup and teacher runtime code in `app.js` by routing compatibility writes through service-layer adapters, keeping canonical study-context and offering flows intact while freezing more legacy tables behind bridge helpers
v1.2.96
2026-03-26
- feat(admin-academic-scope-topbar): replace the old course-only switcher in `/admin`, `/starosta`, and `/deanery` with a canonical academic scope stack (`track/program/admission/stage/campus`), persist that scope in query and session state, and keep legacy course-based panels running on a derived `course_id`
- feat(context-first-users-admin): move the users API and moderation UI onto `study_context_id` as the primary academic placement, enrich `/admin/users.json` with resolved program/admission/stage/campus metadata, add batch moves between study contexts, and preserve the current admin scope after user actions like password reset, delete, and compatibility course moves
- feat(pathways-compatibility-and-context-actions): keep registration and pathways focused on canonical study contexts by resolving `study_context_id` in the registration flow, demoting legacy mapping/visibility into `Compatibility tools`, and adding direct context actions from Academic Setup into offerings, preset apply flow, users, and teacher-related admin surfaces
v1.2.95
2026-03-26
- feat(teacher-workspace-template-preview): add an explicit recurring template preview panel to `/teacher/workspace` with create, update, deactivate, and keep counters plus per-rule scope cards built from the visible live offering filter
- feat(teacher-workspace-template-sync-route): add `/teacher/workspace/offering-templates/sync` so teachers can apply recurring `teacher_assignment_templates` changes separately from live assignment saves while staying inside the same scoped workspace flow
- tune(teacher-workspace-template-scope-state): pass `workspaceTemplatePlan` into the teacher workspace view, keep sync requests pinned to the current course/context/semester filters via visible offering ids, and explain that template preview reads from saved live assignments rather than unsaved draft toggles
v1.2.94
2026-03-26
- feat(teacher-workspace-live-editor): turn `/teacher/workspace` into a primary live-offering assignment surface with scoped editing by course, study context, and semester instead of only a read-only summary of current assignments
- feat(teacher-workspace-scope-save): add `/teacher/workspace/offerings` so teachers can update only the visible offering scope, keep out-of-scope assignments untouched, and mirror the resulting live selection back into legacy `teacher_subjects` for compatibility
- feat(teacher-workspace-template-sync): let the workspace optionally sync recurring `teacher_assignment_templates` from the same scoped editor, so live overrides and future cohort defaults can now be managed from one place
v1.2.93
2026-03-26
- feat(academic-setup-live-offering-editor): add context-level live offering management inside `/admin/pathways`, including create/update/remove flows for `subject_offerings`, target study-context bindings, semester links, and legacy visibility mirroring from the new Academic Setup workspace
- feat(teacher-offering-selection-mode): switch teacher subject registration and profile editing into offering-first mode when live offerings are available, preserving the existing checkbox/group UX while saving through `teacher_offering_assignments` and keeping `teacher_subjects` as a compatibility mirror
- feat(teacher-workspace-live-scope): add a new live teaching scope panel to `/teacher/workspace` with study-context and semester filters, offering-level context metadata, template-match visibility, and better carry-through for shared/context-bound teaching assignments
v1.2.92
2026-03-26
- feat(academic-setup-presets-and-intake): add program-preset CRUD routes and a new Academic Setup UI for multi-program intake creation, preset selection, stage subject/semester scaffolding, and canonical `preset_id` focus inside `/admin/pathways`
- feat(academic-setup-apply-preview): surface context-level and cohort-level preset apply previews plus explicit apply/reapply actions, so admins can snapshot semesters and offerings into live `study_contexts` without falling back to manual admission-course mapping
- feat(academic-setup-moderation-and-promotion): add an Academic Moderation Queue UI with resolve/ignore/assign-context actions, and upgrade cohort promotion to resolve or create next-stage `study_contexts` before moving users through the canonical placement model
v1.2.91
2026-03-26
- feat(academic-setup-context-workspace): add a new `Contexts and semesters` section to `/admin/pathways` that surfaces live `study_context` cards by cohort with stage, campus, semester, offering, and user counts so admins can focus the real academic runtime container instead of only legacy course mappings
- feat(academic-setup-context-semesters): add context-level semester CRUD on `/admin/pathways/contexts/:id/semesters/*`, letting admins create, edit, activate, archive, and delete `study_context_semesters` without going through the legacy course-semester admin flow
- fix(academic-setup-semester-bridge): sync `study_context_semesters` with legacy semester titles, start dates, and week counts, and keep `subject_offerings` refreshed after context-semester changes so the new cohort-stage-campus layer carries semester metadata instead of dropping back to course-only defaults
v1.2.90
2026-03-26
- feat(academic-setup-offering-bridge): sync `subject_offerings`, context bindings, and context-semester links from legacy subject visibility so each cohort context now gets a live offering layer without dropping the existing subject model
- feat(academic-setup-registration-context-read): let registration resolve visible subjects through `study_context_id` first, with automatic fallback to the legacy admission/course path when the new offering layer is unavailable or still empty
- feat(academic-setup-teacher-template-seeding): seed `teacher_assignment_templates` and `teacher_offering_assignments` whenever teachers save their subject list, and auto-apply matching templates when cohort offerings are refreshed
v1.2.89
2026-03-26
- feat(academic-setup-canonical-user-context): route registration, profile, admin user editing, and cohort migration flows through `study_context_id`, keeping legacy course/admission fields as compatibility shadows instead of the primary academic placement source
- feat(academic-setup-sync-and-promotion): automatically sync study contexts whenever admissions or course mappings change, add cohort promotion through stage-aware study contexts, and surface the new `Promote stage +1` action inside the Academic Setup workspace
- fix(academic-setup-admin-context-data): enrich admin user payloads with resolved study-context labels and course bindings so the context-first user moderation UI can move people between cohorts, stages, and campuses without losing canonical placement metadata
v1.2.88
2026-03-26
- feat(academic-setup-schema-foundation): add the new cohort, study-context, preset, offering, teacher-assignment, and moderation tables that will underpin the academic setup refactor
- feat(academic-setup-backfill): backfill cohorts and study contexts from legacy program admissions, course mappings, and campuses, while preserving a course-to-context binding layer for future migration work
- feat(academic-setup-user-context): add `users.study_context_id` and backfill it for unambiguous legacy user placements so the new canonical academic link is available without removing legacy fields
v1.2.87
2026-03-26
- fix(register-specific-error-codes): replace the generic `Check your details` signup failure with explicit server-side error codes for missing name, missing password, short password, missing confirmation, password mismatch, consent, duplicate user, rate limit, and database failure
- fix(register-validation-parity): enforce the same registration rules on the form itself, including minimum password length and localized field-level guidance, so the user sees the exact problem before submit instead of a blind round-trip
- tune(register-error-localization): map register error codes into localized alert copy for both Ukrainian and English, while still translating the legacy generic messages if an old redirect reaches the page
v1.2.86
2026-03-26
- feat(session-generator-cleanup-preview): add server-side cleanup impact previews for the selected session window and the full active semester scope, so the session generator now knows how many published session events, linked journal columns, and affected subjects each delete action will touch before the user commits it
- feat(session-generator-guided-delete-cards): rebuild the selected-window and delete-all session cleanup panels into guided impact cards with Tahoe/Liquid Glass metric grids, explicit cleanup scope badges, and live draft-assignment counters instead of blind destructive buttons
- fix(session-generator-cleanup-state-sync): keep delete actions in sync with the current manual planner by pushing the same serialized draft payload into cleanup forms, deriving draft counts from the live slot board, and disabling cleanup buttons when neither published nor draft session state remains
v1.2.85
2026-03-26
- feat(journal-review-summary-bars): add guided summary/action bars for retakes, appeals, moderation, and competency review inside the journal cell modal, so each workflow now surfaces its queue, current state, and next action before the user dives into the raw forms
- tune(journal-modal-primary-actions): strengthen the main review actions visually by promoting the create/save buttons for retakes, appeals, moderation, and competency checklist, making the intended teacher and student flows read faster without hunting for the right control
- tune(journal-review-summary-surface): add Tahoe/Liquid Glass styling and responsive metric cards for the new review summary panels, keeping the cell modal clearer on desktop and mobile while preserving the existing journal visual language
v1.2.84
2026-03-26
- fix(journal-close-stay-in-context): change `/journal/subject/close` from a raw CSV response into a guided redirect back to `/journal`, so closing a subject now preserves the active journal scope and shows the success state in-place instead of throwing the teacher out of the workflow
- fix(journal-close-export-stateful-link): build the closed-subject export link with the same subject, attendance, quick-attendance, and open-cell context as the journal page, reducing another redirect drift between the closure card and the main journal surface
- tune(journal-close-export-error-redirects): route missing export, unavailable file, invalid subject, and database-error paths from `/journal/subject/close-export` back through the shared journal redirect helper, and update the closure panel copy to explain that export is now a separate follow-up action after close
v1.2.83
2026-03-26
- feat(journal-guided-closure-panel): rebuild the `/journal` subject close/reopen block into a guided impact-and-action surface with explicit column, student, and export snapshot preview cards plus stronger primary closure actions
- tune(journal-review-availability-states): add explicit open, paused, student-view, and no-grade state summaries above retakes, appeals, moderation, and competencies so each review workflow now explains whether the current cell can be acted on and why
- tune(journal-closure-mobile-surface): add Tahoe/Liquid Glass styling and mobile-responsive layout rules for the new closure panel and review-state cards, keeping the workflow readable in both light and dark themes
v1.2.82
2026-03-26
- feat(journal-attendance-dirty-state): add a live attendance workflow bar in `/journal` with marked, changed, and removed counters, row-level dirty highlighting, and a disabled save action until the teacher actually changes the current attendance snapshot
- tune(journal-attendance-save-feedback): make attendance quick-edit changes immediately update the same editor summary and switch the save state chip into a pending state on submit, so the attendance flow now reads like one guided workflow instead of a blind form dump
- feat(journal-cell-operational-summary): add a top-of-modal operational summary card for journal cells that surfaces effective score, moderation state, retake and appeal counts, competency activity, and the exact reason a cell is editable, locked, closed, read-only, or waiting for a second reviewer
v1.2.81
2026-03-26
- refactor(journal-unified-workflow-redirects): route journal bulk grading, grade delete/restore, retakes, appeals, moderation, competency actions, column toggles, config saves, and template import through shared journal redirect helpers so subject, attendance, and active workflow context survive success and error round-trips consistently
- fix(journal-bulk-save-error-path): replace the broken bulk-save catch path that still referenced `gradeDeleteRedirect`, and remove several stale unreachable redirect branches left behind by the earlier journal workflow refactor
- fix(journal-modal-context-sync): sync subject, attendance, and active-cell hidden inputs into journal page forms and cell-modal forms, including dynamically rendered retake and appeal update forms, so async modal submits and fallback redirects land back in the same operational scope
v1.2.80
2026-03-26
- fix(journal-workflow-context-redirects): stabilize the journal workflow refactor by routing attendance save, subject close/reopen, and the core grade action flows back through shared journal redirect helpers, preserving subject and attendance context instead of dropping users into generic fallback states
- fix(journal-insights-return-context): carry the return-to-journal subject and attendance context through Journal Insights filters and publish-rating submits, and reuse that same workflow state when building publish redirects and back-to-journal actions
- fix(teacher-hub-linked-actions): move shared journal/schedule/insights href locals to the top of Teacher Hub, remove the duplicated insights CTA in the latest rating card, and point the hub quick actions and latest-rating links at the same stabilized workflow surfaces
v1.2.79
2026-03-25
- fix(admin-pathways-sidebar-navigation): replace the admin sidebar `Pathways` control with a real `/admin/pathways` link instead of an inline `onclick` button, so the section opens reliably even when client-side navigation or browser security rules ignore inline handlers
- tune(admin-sidebar-link-styling): make `.admin-nav-link` explicitly remove text decoration so anchor-based admin navigation keeps the same Tahoe/Liquid Glass sidebar look as the existing button-based items
v1.2.78
2026-03-25
- fix(pathways-mapping-track-scope): make the admin mapping board render only track-compatible courses for the selected cohort, instead of showing cross-track rows that the save route would silently ignore
- fix(pathways-mapping-summary-parity): align mapping totals and visible counts with the same compatible-course scope that `/admin/pathways/admissions/:id/courses/save` already enforces, removing another false-affordance gap between UI and server behavior
v1.2.77
2026-03-25
- tune(pathways-actionable-empty-states): replace several passive empty-state blocks in mapping, subject visibility, campuses, migration, and catalog with direct CTA actions so the admin can jump straight to admissions, mapping, scope, or catalog repair instead of hitting dead ends
- fix(pathways-catalog-create-entry-point): expose the global catalog create form as a real anchor target and wire the empty catalog state to it, so an empty subject base now leads directly into the first corrective action
- tune(pathways-migration-actionable-rows): make migration rows reflect real pending users, disable no-op source courses with zero candidates or fully aligned assignments, and disable the migration submit action when nothing actually needs stamping
v1.2.76
2026-03-25
- fix(pathways-admissions-empty-state): make the admissions section distinguish between “no program selected” and “selected program has no cohorts yet”, so the empty state now explains the real blocker instead of collapsing both cases into one vague message
- tune(pathways-admissions-cta): add direct CTA routing from the admissions empty state either back to the programs section or straight to the first admission form, which removes another dead-end from the admin cohort flow
v1.2.75
2026-03-25
- fix(pathways-explicit-focus-mode): stop auto-selecting the first program and first admission on `/admin/pathways`, so cohort focus now stays explicit and the page can honestly render its no-focus state until the admin chooses a program or cohort
- tune(pathways-clear-focus-control): add a direct clear-focus action in the scope header, making it possible to leave cohort mode without hacking query params or getting bounced into another admission automatically
v1.2.74
2026-03-25
- fix(pathways-catalog-target-scope): drive catalog assignment targets from the active cohort context so `/admin/pathways` now surfaces mapped cohort courses first instead of inviting picks that the server would immediately reject
- tune(pathways-catalog-readiness-copy): add a readiness banner and disabled target rows in focused cohort mode, making it explicit which courses are ready for catalog assignment and which still need mapping before they can receive subjects
v1.2.73
2026-03-25
- fix(pathways-focus-context-preservation): keep the current program and admission focus attached to inline program/admission forms so saving cards inside `/admin/pathways` no longer kicks the admin out of the selected cohort workspace
- fix(pathways-validation-redirect-context): preserve the same cohort focus when program/admission add or update actions bounce back with validation or duplicate-name errors, which removes another dead-end loop from the admin pathways flow
v1.2.72
2026-03-25
- refactor(session-generator-action-parser): extract one shared parser for session-generator action payloads so `publish`, `delete`, and `delete-all-active` now normalize the same planner knobs, booleans, timing values, and scope ids through one code path
- fix(session-generator-action-parity): remove another source of route drift in cleanup/publish flows, reducing the chance that future fixes land in one session-generator action while the other two keep stale parsing behavior
v1.2.71
2026-03-25
- fix(session-generator-cleanup-current-planner-payload): `delete` and `delete-all-active` now submit the current in-memory manual assignment payload too, so cleanup-driven draft pruning uses the actual planner state even if autosave has not finished yet
- fix(session-generator-cleanup-helper-current-state): session cleanup draft sync can now prune against posted planner assignments instead of only the last persisted draft snapshot, which closes the remaining race between client-side edits and cleanup actions
v1.2.70
2026-03-25
- fix(session-generator-cleanup-draft-sync): when deleting session events in the selected window or fully clearing active sessions, the linked session-generator draft is now pruned too, so the planner no longer bounces back with stale assignments that were just cleaned from timetable/journal state
- fix(session-generator-action-form-draft-id-sync): keep `publish`, `delete`, and `delete-all-active` forms aligned with the latest autosaved `draft_id`, which closes the gap where cleanup actions could post an outdated draft reference after autosave created a fresh planner draft
- tune(session-generator-cleanup-feedback): cleanup redirects now explicitly say when only the draft changed, and when published session data plus draft assignments were both removed, so the post-action state reads more honestly
v1.2.69
2026-03-25
- fix(session-generator-room-publish-binding): keep `room_id` when manual session assignments expand into per-group publish rows so published session events finally retain the room chosen in the planner instead of silently dropping it on insert
- fix(session-generator-room-conflict-expansion): run live room-conflict checks and publish-time room validation against expanded per-group assignments, which closes the blind spot where all-group session rows could miss room collisions that only appeared after group expansion
v1.2.68
2026-03-25
- fix(session-generator-day-window-get-state): stop forcing `/admin/session-generator` back to `weeks` mode on each GET render and let explicit window dates round-trip through the shared helper so day-mode planning and stateful redirects no longer collapse to the default week flow
- fix(session-generator-draft-navigation-context): preserve course, semester, window knobs, boolean planner flags, sequencing, strategy, and current explicit session dates when creating a new draft, clearing the current draft, or switching drafts inside the session generator
- tune(session-generator-explicit-window-guard): keep explicit planner dates only while the current form still matches the rendered window state, so draft navigation stays stable without overriding freshly changed window controls with stale explicit-date payloads
v1.2.67
2026-03-25
- fix(journal-modal-safe-dom-render): replace the remaining string-based rendering in journal retakes, appeals, moderation, and competency modal sections with DOM node construction so dynamic teacher/student state no longer flows through `innerHTML` sinks
- fix(journal-competency-checklist-safe-updates): rebuild the competency signal list and checklist rows through DOM APIs while keeping the existing score-chip toggle behavior and submission wiring intact
- tune(journal-review-surfaces): keep the same journal modal actions and status chips, but make empty states, readonly blocks, and moderation summaries use one consistent safe-render pattern
v1.2.66
2026-03-25
- fix(shared-topbar-optional-nav-locals): make `views/partials/topbar.ejs` tolerate missing `navItems`, `navMeta`, `userNav`, and `currentPath` so pages that include the shared navbar no longer crash with `ReferenceError` when those optional locals are absent
- fix(admin-pathways-render-regression): restore `/admin/pathways` page rendering by removing the shared-topbar crash path that blocked the admin pathways surface before any cohort data could load
- test(shared-partials-render-smoke): add focused EJS render coverage for the shared topbar partial and the admin pathways page so future partial-local regressions are caught before they break SSR pages
v1.2.65
2026-03-25
- fix(session-generator-delete-flow-context): make `/admin/session-generator/delete` and `delete-all-active` keep the same planner scope on redirect, including window mode, timing knobs, sequencing, and boolean filters instead of collapsing back to a reduced weeks-only state
- fix(session-generator-window-resolution): unify GET, publish, and delete window-date resolution through shared helpers so explicit planner dates and future day-mode windows resolve consistently instead of diverging between preview and cleanup flows
- test(session-generator-window-state): extend focused helper coverage for stateful return URLs and explicit-date window resolution so the session-generator flow regressions are caught before they hit publish/delete UX
v1.2.64
2026-03-25
- refactor(session-generator-helper-module): move reusable session-generator parsing, return-href, and conflict-shaping helpers into `lib/sessionGenerator.js` so the planner flow can be tested without reaching through `app.js`
- test(session-generator-helpers): add focused `node:test` coverage for strategy normalization, flag/int bounds, scoped return URLs, conflict slot aggregation, and conflict summary shaping
- fix(session-generator-safe-planner-render): replace the remaining string-based warning, assignment-card, and group-timeline rendering in `/admin/session-generator` with DOM-node rendering so planner previews stay on the safer client-side pattern
v1.2.63
2026-03-25
- test(core-security-helpers): add focused `node:test` coverage for trust-proxy resolution, session secret policy, operational access gating, rate limiting, pathways readiness, and journal insights snapshot helpers
- fix(journal-attendance-health-null-total): stop treating `null` totals as zero in attendance health summaries so risk/share calculations use the real marked counts when explicit totals are omitted
- tune(second-security-sweep-ui): replace a few remaining string-based DOM updates in session generator group selection and journal moderation status controls with DOM-node rendering to keep the hardening pass moving toward one safe pattern
v1.2.62
2026-03-25
- fix(security-session-and-ops-hardening): enforce a real production session secret, rotate sessions on login/logout/role changes, trust proxy-aware IP handling, explicit body-size limits, verified Postgres TLS, and tighter `/_health`, `/__version`, `/_bootstrap` exposure with baseline helmet hardening
- fix(journal-and-schedule-safe-previews): replace unsafe HTML-string rendering in journal bulk grading and admin schedule windows with DOM-safe previews, and make journal subject closure explain lock/export impact before destructive actions
- feat(core-module-finish-pass): add publish impact summary to `/admin/session-generator`, operational digest plus latest rating context to `/teacher/hub`, an action-oriented scope card to `/journal/insights`, and a stronger focus CTA inside `/admin/pathways`
v1.2.61
2026-03-24
- tune(schedule-week-carousel-compact): remove the side arrows and header copy from the floating week carousel, compress the glass dock into a lower profile, and clean Role Studio simulator blocks by dropping the extra English section labels
v1.2.60
2026-03-24
- tune(schedule-week-carousel-spotlight): turn the floating week navigator into a true glass carousel with a centered active week card, adjacent week previews, wider dock spacing, and cleaner mobile sizing so week switching reads like a proper liquid-glass control
v1.2.59
2026-03-23
- feat(schedule-week-carousel): redesign the floating week carousel into a liquid-glass navigator with centered week chips, date-range context, and richer swipe-friendly motion
v1.2.58
2026-03-23
- tune(shared-footer-signature-order): move the compact `© A.M.` rights mark even further left by placing it before the sync pill in the shared footer dock
v1.2.57
2026-03-19
- tune(changelog-modal-header-spacing): add explicit spacing between the changelog title and the release-notes chip so the modal header no longer looks crowded
- tune(shared-footer-signature): remove the footer build label and replace it with a compact `© A.M.` signature while keeping the release pill and changelog trigger
v1.2.55
2026-03-19
- tune(my-day-mission-cards-normalization): rebuild the four My Day mission cards into a stable 4-column deck with equal-height glass cards, bottom-pinned CTA pills, cleaner empty states, and responsive 2/1-column fallbacks so attendance, rating, support, and inbox blocks stop looking collapsed or misaligned
- fix(my-day-attendance-short-date): make the attendance last-mark label accept both date-only and datetime values so the homepage no longer leaks raw timestamp strings in the summary card
v1.2.54
2026-03-19
- fix(help-faq-render-locals): restore the FAQ page by making `views/help.ejs` tolerant to missing legacy announcement locals and by passing compatibility aliases from `/help` so the inbox digest no longer crashes with `announcementSummary is not defined`
v1.2.53
2026-03-19
- fix(admin-data-quality-compatibility): keep `/admin/data-quality.json` in a compatible partial-results mode when legacy subject-scope or diagnostic queries hit schema drift, instead of collapsing the whole widget into `Unavailable`
- tune(admin-data-quality-status-ui): add a dedicated `Partial` state in the admin Data quality card and render schema-compatibility notes as neutral `INFO` rows rather than green `OK` rows
v1.2.52
2026-03-19
- fix(security-upload-hardening): replace the public `/uploads` static surface with authenticated access checks, keep file reads scoped to the right user or course context, and force dangerous legacy extensions like `.html` or `.svg` to download instead of rendering inline
- fix(security-safe-upload-storage): stop preserving attacker-controlled active file extensions during upload writes by normalizing saved filenames to safe extensions derived from the allowed MIME catalog
- fix(security-realtime-channel-scoping): move WebSocket traffic onto explicit `/ws` channels, require same-origin authenticated upgrades, and keep admin-only events like `security_alert`, `users_updated`, and `history_updated` off the student-facing realtime channel
- fix(security-xss-render-paths): replace unsafe HTML-string rendering for journal submissions and custom-deadline attachment links with safe DOM node creation and href validation so stored submission text or file labels can no longer execute in the UI
v1.2.51
2026-03-19
- fix(journal-insights-filters-localization): add the missing filters title and subtitle keys in `locales/en.json` and `locales/uk.json` so the journal insights filter card renders translated copy instead of raw i18n keys
v1.2.50
2026-03-18
- refactor(inbox-surface-consistency): switch Help and My Day inbox digest wiring away from legacy announcement naming, keep narrow fallback compatibility, and align inbox-specific copy across touched surfaces
- tune(message-type-clarity-uk): translate Ukrainian inbox type chips and filters in `/help`, `/home`, and `/schedule` so broadcast, group, subject, and direct updates read clearly instead of mixing English labels
- chore(appjs-dead-code-cleanup): remove the orphaned commented attendance-save block left in `app.js` after the journal recovery refactor
v1.2.49
2026-03-18
- feat(core-ux-wave-pathways-correctness): harden admin pathway validation for program/admission/course/campus mapping, remove remaining registration dead ends, and explain exactly how broken cohort setup blocks student subject registration
- tune(journal-insights-publish-surface): add publish-scope and latest-published snapshot cards in `/journal/insights`, improve ranking readability, and keep the latest published rating aligned with My Day and message surfaces without adding a separate portal
- tune(messages-inbox-separation): upgrade the schedule inbox with broadcast/group/subject/direct filtering and grouping, keep support threads in Help, and render published rating updates as reusable inbox cards instead of generic announcements
- refresh(help-and-my-day-journeys): update FAQ/help inbox digest and My Day mission cards to reflect the current login, registration, schedule, journal, ratings, materials, teamwork, teacher assets, and support SLA journeys
- refactor(surgical-appjs-recovery): continue moving touched pathway/message/journal/support shaping into focused helpers, remove duplicate route leftovers, and repair broken register/journal blocks in `app.js` caused by prior partial cuts
v1.2.48
2026-03-18
- fix(pathways-summary-parse): remove the stray closing parenthesis in `lib/pathways.js` so Cloud Run can parse the pathways helper during app startup instead of crashing before binding `PORT`
- fix(homework-due-date-sql-casts): cast homework due-date and created-at sort/filter expressions to `TEXT` in teacher workspace, My Day, journal sync, journal columns, and course pulse analytics so Postgres no longer fails on mixed `COALESCE` types when date columns drift between text and timestamp-like types
v1.2.47
2026-03-18
- fix(cloud-run-startup-sequencing): wait for the HTTP server to bind `PORT` before kicking off database initialization, session health probes, and the scheduler so startup side effects cannot race the Cloud Run readiness window
- chore(node-runtime-pin): pin the app runtime to Node 20.x in `package.json` so Google buildpacks stop auto-selecting the latest available Node release during deploys
v1.2.46
2026-03-17
- feat(pathways-registration-impact): add a focused registration-impact layer for cohort admin workspaces and subject registration so both admins and students can see whether course routing, subject visibility, campus routing, and migration are actually ready
- tune(subject-base-binding-clarity): summarize shared vs separate catalog bindings in admin pathways, surface per-instance binding descriptions directly in the global subject base, and highlight unassigned or multi-course subject setups before they create registration confusion
- refactor(register-subjects-single-source): remove the duplicate `GET /register/subjects` route and keep the registration readiness flow anchored to one render path with the new pathway helper summaries
v1.2.45
2026-03-16
- feat(help-announcement-digest): add a fresh announcement digest to FAQ & Help so broadcasts and direct updates stay separate from support threads while the full archive still opens from the schedule inbox
- tune(my-day-inbox-separation): remove support threads from the generic My Day inbox, surface recent announcements in a dedicated mission card, and route inbox CTAs straight to `/schedule?panel=messages`
- refactor(messages-visible-query): extract visible message shaping into `lib/messages.js`, reuse a shared user-facing message query for `/messages.json`, `/help`, and `/home`, and label message kinds directly inside the schedule inbox modal
v1.2.44
2026-03-16
- tune(my-day-attendance-signal): upgrade the My Day attendance card with stability/watch/attention states, recent 14-day signal, last-marked context, and clearer journal follow-up copy instead of a flat count-only summary
- feat(register-subjects-cohort-readiness): add a registration readiness panel that shows cohort status, mapped-course coverage, visible subject scope, campus routing readiness, and open pathway issues before students choose subject groups
v1.2.43
2026-03-16
- tune(support-flash-and-admin-actions): restyle FAQ & Help flash messages into the shared liquid alert pattern and add explicit close/reopen actions in the admin support thread header
v1.2.42
2026-03-16
- feat(template-inline-file-uploads): allow uploading reusable files directly from the create and edit template forms in Teacher Workspace, automatically saving them to the asset library and linking them to the template
v1.2.41
2026-03-16
- tune(help-support-page-focus): remove the extra 'How to write a strong request' card from FAQ & Help so the page stays focused on the support form and request history
v1.2.40
2026-03-16
- feat(support-request-close-action): add explicit close controls for support threads in FAQ & Help and the admin support workspace so requests can be closed directly instead of only changing the status dropdown
v1.2.39
2026-03-15
- fix(schedule-render-teacher-template-fallback): initialize `teacherHomeworkTemplates` for every `/schedule` render path and add an EJS fallback so student and admin view-as schedule screens no longer crash with `teacherHomeworkTemplates is not defined`
v1.2.38
2026-03-15
- feat(core-ux-wave-home-and-sessions): redesigned authenticated My Day into a clearer mission-control surface with attendance health, latest rating snapshot, support status, teacher quick actions, room-aware schedule cards, and room conflict handling throughout the session generator flow
- feat(teacher-hub-asset-library): expanded Teacher Hub and Teacher Workspace with reusable asset storage, template-to-asset mapping, richer recent activity panels, and room-aware homework creation directly from the schedule
- feat(help-center-threaded-support-and-ratings): exposed threaded support history with user replies in FAQ & Help, refreshed FAQ content around real Studerria journeys, and added structured rating publication snapshots that can be reused across home and messaging surfaces
- feat(pathways-readiness-and-modularization): tightened pathways and subject-registration guidance, moved support/room/template/journal/pathway helpers out of app.js, and replaced the placeholder test script with a real node:test entrypoint plus focused module coverage
v1.2.37
2026-03-15
- chore(codex-test-request-rule): document that explicit requests like `зроби тест` or `додай тест` authorize Codex to add or update the relevant tests and run only the minimal necessary test command without extra clarification
v1.2.36
2026-03-13
- fix(messages-global-purge): add an admin-only `Clear all` action that hard-deletes the full message archive across every course and semester, and ship a cleanup migration that removes the known stale February broadcast announcements still leaking into the inbox modal
v1.2.35
2026-03-13
- fix(confirm-flow-native-fallback): route admin destructive confirmations through native `confirm/prompt` so laggy custom Bootstrap confirmation sheets no longer block typing or clicks in the admin workspace
v1.2.34
2026-03-13
- fix(messages-admin-course-scope): make `/messages.json` use the admin-selected course instead of the account default course so Clear visible, delete actions, and the schedule messages modal finally operate on the same message set
v1.2.33
2026-03-13
- fix(confirm-modal-typed-input-lag): remove forced uppercase rendering and switch the admin typed-confirm field to composition-safe, frame-queued state syncing so text entry stops lagging on macOS/iOS keyboards
v1.2.32
2026-03-13
- fix(messages-admin-render-fallback): restore the admin Messages panel after the new refresh/clear controls by passing `adminHomeHref` into all admin-shell renders and adding a safe EJS fallback when that local is missing
v1.2.31
2026-03-13
- feat(messages-admin-refresh-clear): add explicit Refresh and typed-confirm Clear visible controls in the admin Messages workspace, plus a bulk-delete backend action that hard-clears the entire message list currently visible in the selected course scope
v1.2.30
2026-03-13
- fix(message-inbox-cache-busting): disable caching for `/messages.json` and force the student inbox plus unread badge fetches to use `no-store` so previously deleted admin messages stop lingering from stale browser responses
v1.2.29
2026-03-13
- fix(message-delete-live-sync): emit `messages_updated` after manual admin message sends and deletes, and reload the student messages inbox plus unread indicators in real time so removed admin messages disappear for users without a manual refresh
v1.2.28
2026-03-13
- fix(session-generator-slot-heights): rebuilt the day slot stack so session slots no longer inherit the tallest neighbor in each row, giving free and lightly populated pairs their own compact height instead of oversized empty cards
- tune(session-generator-slot-density): tightened slot padding and updated the narrow-screen fallback for the new flexible slot layout so the timetable stays cleaner across full-width and mobile admin views
v1.2.27
2026-03-13
- fix(session-generator-wide-layout): rebalanced the desktop session-generator columns so the manual planner gets materially more width, the control stack no longer compresses the slot board, and the group timeline only docks beside the board on truly wide screens
- fix(session-generator-filter-wrap): made the active-assignment header and planner filters wrap responsively so full-width admin views stop collapsing labels, selects, and reset controls into the timetable area
v1.2.26
2026-03-13
- tune(session-generator-planner-ux): rebuilt the manual session planner with a sticky active-assignment bar, unified filter dock, free-slot focus mode, clearer slot cards, per-day load chips, and a selected-group exam timeline sidebar so full-session planning needs fewer repeated clicks
- feat(session-generator-speed-tools): added inline slot warnings, keyboard shortcuts for assessment types and delete, improved drag-fill behavior, and an auto-consultation helper that drafts consultations one day before each exam without touching the publish flow or database schema
v1.2.25
2026-03-13
- feat(session-generator-full-active-purge): added a dedicated destructive action in the session generator to remove all active `[Сесія]` events for the selected course and semester, including linked and residual session journal columns, so exam-session cleanup no longer depends on the currently selected week window
v1.2.24
2026-03-13
- tune(admin-overview-tab-restore): restored Overview as its own admin tab while keeping it off the support workspace, and added server-side initial tab rendering so `/admin?tab=admin-support` opens straight into support without the overview block stacking above it
v1.2.23
2026-03-13
- tune(admin-dashboard-overview-removal): removed the embedded Overview card, its sidebar shortcut, and the header CTA from the main admin dashboard so the landing screen opens directly into the remaining working sections without the extra summary block
v1.2.22
2026-03-13
- feat(admin-support-chat-section): moved support tickets into a dedicated admin section with a conversation-style layout, request list, selected thread view, and inline reply composer instead of keeping tickets under the Messages inbox
- feat(support-request-thread-history): added `support_request_messages` with backfill from existing requests and admin notes so ticket history is preserved as a real thread while new replies append to the conversation
v1.2.21
2026-03-12
- fix(schedule-postgres-typing): cast scheduled homework and message publish windows through `timestamptz` so `/schedule`, homework actions, and scheduled publishing no longer crash when `scheduled_at` is stored as text in Postgres
- fix(schedule-shared-subject-array-order): corrected the student schedule query parameter order for shared-subject owner course and semester arrays so bound-course timetable loads no longer fail with malformed array literals
v1.2.20
2026-03-12
- fix(shared-subject-staff-and-analytics-scope): moved Starosta teamwork and homework views, teacher review SLA, course pulse analytics, and admin workload counters onto shared-subject owner scope so shared subjects now stay visible and count correctly outside the owner course
- fix(shared-subject-overview-and-admin-lists): fixed the overview course pulse state bootstrap, aligned the admin teamwork list with shared subject bindings, and updated admin users student-group payloads so bound courses stop dropping shared subject data in staff screens
v1.2.19
2026-03-12
- fix(shared-subject-reaction-access): locked homework and teamwork reactions behind real visibility checks so students, teachers, and admin view-as mode can only react to items available in their current subject binding and active owner semester
- fix(shared-subject-monitoring-scope): moved My Day teamwork deadlines, deanery schedule and monitoring, and admin data-quality diagnostics onto `subject_course_bindings` plus owner-course scope so shared subjects no longer disappear or report incomplete analytics outside the owner course
v1.2.18
2026-03-12
- fix(pathways-template-render): moved the `isUk` locale flag initialization before the new global subject catalog checklist props in the Pathways EJS shell so `/admin/pathways` no longer crashes on first render with an internal server error
v1.2.17
2026-03-12
- feat(pathways-global-subject-catalog): added a global subject catalog with shared or separate assignment to one or many courses, backfilled existing subjects into the new catalog, and moved this management flow into the lower Pathways block
- fix(shared-subject-bound-flows): updated schedule, teamwork, homework, My Day, schedule-list, bulk admin actions, student homework submit/complete flows, study-day bindings, student-group assignment, and schedule-generator subject checks so shared subjects now resolve through `subject_course_bindings` instead of breaking outside the owner course
v1.2.16
2026-03-12
- tune(help-center-hero-simplification): removed the extra hero action and metrics block from FAQ & Help so the top section is cleaner and no longer carries the oversized right-side panel
v1.2.15
2026-03-12
- fix(help-center-schema-compat): made admin support ticket updates schema-aware so production instances with lagging `support_requests` columns now degrade safely instead of throwing HTTP 500 on save
v1.2.14
2026-03-12
- fix(help-center-admin-reply): removed the ambiguous SQL CASE placeholders in support request updates so admins can now save notes and change ticket statuses without triggering a database error
v1.2.13
2026-03-12
- feat(help-center-faq-page): added a new Personal -> FAQ & Help page with a liquid-glass FAQ knowledge base, direct support form, and personal request history for students and staff
- feat(help-center-admin-inbox): added persistent support request storage plus an admin inbox inside Communications so incoming tickets can be reviewed, annotated, and resolved
v1.2.12
2026-03-11
- tune(journal-shell-localization): localized the main `/journal` shell including the page title, subject picker, subject-closure controls, grading summary chrome, attendance summaries, and journal-table status chips so this workspace no longer opens with hardcoded mixed Ukrainian and English copy
- tune(journal-attendance-feedback): localized the quick-attendance modal, attendance editor labels, localized date formatting, undo timer copy, top-level grading presets, and client-side attendance fallback messages while keeping the journal grading and attendance logic unchanged
v1.2.11
2026-03-11
- tune(register-course-shell-localization): localized the register-course flow shell, track, program, admission-year, and campus labels so the onboarding step no longer mixes hardcoded Ukrainian and English copy across the main form
- tune(register-course-pathway-feedback): localized client-side pathway placeholders, empty states, campus hints, teacher-path warnings, ambiguous-campus guidance, and campus mapping summaries while keeping the existing registration logic unchanged
v1.2.10
2026-03-11
- tune(schedule-week-shell-localization): localized the main schedule shell including the hero phrase, teacher course filters, localized date formatting, dense-day and overlap cues, class cards, session chips, pager labels, and week-grid empty states so the core `/schedule` view no longer mixes hardcoded Ukrainian and English copy
- tune(schedule-summary-and-phrases): localized the rotating daily phrase pool, month snapshot copy, and density-summary labels and details while keeping the existing timetable interactions, homework flows, and modal behavior unchanged
v1.2.09
2026-03-11
- tune(session-generator-shell-localization): localized the session generator shell, hero, calendar controls, legend, manual planner chrome, filters, publish flow, and delete panel so `/admin/session-generator` no longer ships with hardcoded mixed Ukrainian and English copy
- tune(session-generator-live-feedback): localized client-side group and type labels, block-reason hints, live-conflict statuses, publish source meta, and slot assignment summaries while preserving the existing manual session overlay behavior
v1.2.08
2026-03-11
- tune(schedule-generator-shell-localization): localized the schedule generator shell, hero, settings, scope controls, validation panels, analytics summaries, load map, teacher controls, and plan table so this admin workspace no longer ships with hardcoded mixed Ukrainian and English chrome
- tune(schedule-generator-dryrun-and-mirror-copy): localized the subject merge dry-run, mirror key summaries, conflict explanations, auto-pair modal, and client-side merge preview status messages while preserving the existing generator behavior
v1.2.07
2026-03-11
- tune(pathways-ukrainian-copy): localized the Pathways workspace hero, section navigation, forms, cards, empty states, campus and migration panels, and catalog so `/admin/pathways` no longer ships mixed English admin copy
- tune(pathways-route-feedback): localized server-generated Pathways health labels, readiness alerts, campus labels, and save or copy flash messages so the page stays consistently Ukrainian after cohort, mapping, visibility, and migration actions
v1.2.06
2026-03-11
- fix(pathways-health-safe-mode): wrapped the new cohort health presentation layer in a final fallback so unexpected legacy data no longer takes down the whole `/admin/pathways` page
- fix(pathways-render-resilience): kept admission cards and focus flow renderable even when one of the new readiness enrichments cannot be derived
v1.2.05
2026-03-11
- fix(pathways-health-compat): normalized new Pathways health aggregates to treat legacy boolean-like values safely instead of assuming strict PostgreSQL booleans in every visibility column
- fix(pathways-render-fallback): added guarded fallback behavior around the new readiness aggregate queries so `/admin/pathways` stays renderable even when a derived insight query cannot be computed
v1.2.04
2026-03-11
- feat(pathways-health-focus): rebuilt the Pathways workspace into a cohort health control center with a sticky focus nav, selected-admission readiness panel, and action-oriented warnings for mapping, subjects, campuses, and migration
- tune(pathways-admission-cards): turned admission years into richer status cards with mapping, visibility, campus, and user signals while pushing the overall page deeper into the Apple liquid-glass direction
v1.2.03
2026-03-11
- tune(subjects-local-copy): localized the Subjects workspace with a page-level copy map for teacher and student states, material publishing controls, type labels, and destructive actions so the page no longer ships with hardcoded Ukrainian chrome
- tune(teamwork-local-copy): localized the Teamwork workspace including subject selection, task cards, subgroup management, join and move actions, create-task modal controls, and validation fallback text while keeping the underlying teamwork flows unchanged
v1.2.02
2026-03-09
- tune(schedule-overlay-localization): moved the schedule drawer, homework overlays, custom-deadline flows, messages modal, and welcome modal onto locale keys so these teacher and student surfaces no longer ship with mixed hardcoded Ukrainian and English copy
- tune(schedule-modal-feedback): localized dynamic schedule-side labels for subgroup cards, template pickers, file inputs, message loading states, custom-deadline details, and homework submit meta while aligning those overlay dates with the active interface language
v1.2.01
2026-03-09
- tune(my-day-lower-localization): localized the lower My Day surfaces including progress and risk, review queue, pulse and inbox, standalone reminders, competency compass, and the welcome modal so the dashboard no longer ships these panels with hardcoded Ukrainian copy
- tune(my-day-whatif-locale-feedback): moved the dynamic What-if calculator status and result strings to locale keys and finished full locale coverage for the My Day template
v1.2.00
2026-03-09
- tune(admin-mobile-topbar-density): regrouped the admin mobile navbar into compact utility and action clusters so preview, schedule, and logout no longer stack as tall full-width rows and the top shell takes notably less vertical space
v1.1.x 100 релізів ›
v1.1.99
2026-03-09
- fix(admin-layout-navbar-dedup): taught the shared page layout to treat admin pages with their own .admin-nav as local topbars so the global Studerria navbar no longer renders a second stacked navigation bar above admin screens
v1.1.98
2026-03-09
- feat(admin-mobile-section-switcher): added a compact mobile section switcher with quick jump-to-top behavior and preserved Pathways access so phone users can move between admin areas without relying on the desktop sidebar
- tune(admin-mobile-shell): tightened the admin topbar, overview quick actions, responsive table wrappers, and stacked utility bars so the main admin workflows remain usable on narrow mobile screens
v1.1.97
2026-03-09
- tune(my-day-core-localization): moved the main My Day cockpit copy for the brief card, learning drawers, student and teacher focus blocks, reminder form, and homework submit modal into locale keys so the dashboard no longer hardcodes its core Ukrainian labels
- tune(my-day-locale-formatting): aligned My Day date rendering with the active interface language on both the server-rendered cards and the client-side reminder refresh flow
v1.1.96
2026-03-09
- fix(teacher-hub-schema-fallback): hardened the Teacher Hub dashboard so legacy or partially migrated teacher-specific tables no longer take the whole page down and instead fall back to empty teacher stats
- fix(teacher-nav-learning): exposed Teacher Hub inside the Learning menu for teacher accounts and made the nav item stay active across the broader /teacher workspace flow
v1.1.95
2026-03-08
- tune(teacher-surfaces-localization): localized the Teacher Hub and Journal Insights screens through locale keys so titles, actions, filters, summary labels, table headings, and empty states no longer ship with hardcoded English copy
- tune(my-day-copy): localized the My Day briefing kicker and drawer close-label to keep the student cockpit navigation consistent with the rest of the Ukrainian UI
v1.1.94
2026-03-08
- fix(admin-light-topbar): rebuilt the admin light-theme topbar into a brighter liquid-glass surface so the title, account label, status chip, actions, and course switcher read cleanly instead of collapsing into a dark navbar block
- fix(select-light-arrow-tiling): centralized the custom form-select indicator styling so light-theme dropdowns render a single chevron, keep the open-state arrow stable, and stop repeating the icon across the field background
v1.1.93
2026-03-08
- fix(schedule-mobile-menu): rebuilt the phone navigation into a compact OpenAI-style sheet with a cleaner Studerria topbar, structured workspace sections, and an account footer that keeps the mobile menu usable instead of falling back to the retired legacy modal
- fix(schedule-mobile-height): added viewport-aware safe-area offsets and tighter week-dock spacing on the schedule screen so the floating week controls sit correctly on iPhone-sized viewports without crowding the content as aggressively
v1.1.92
2026-03-07
- tune(register-groups-readability): stacked the pending-status badge away from subject titles so three-group rows no longer squeeze the names together, brightened subject titles in the dark theme, and updated the profile hint copy to the new "Choose groups again" path
v1.1.91
2026-03-07
- tune(register-groups-layout): widened the subject-group registration step, moved the unresolved filter into the sticky footer, removed the redundant top status card and inline submit, tightened the subject and quick-pick panels, and aligned the palette and theme toggle with the auth screens
v1.1.90
2026-03-07
- tune(auth-action-widths): unified the primary auth and registration action buttons to one centered width across login and the related registration steps, including course, subject-group, and teacher subject selection screens
v1.1.89
2026-03-07
- tune(login-form-field-width): narrowed the login name and password inputs, helper copy, and error banner to the same centered width as the auth action buttons
v1.1.88
2026-03-07
- tune(register-groups-auth-width): narrowed the subject-group registration step to the same auth-card width as the other registration screens and aligned the submit area and sticky CTA to that tighter layout
v1.1.87
2026-03-07
- feat(register-groups-ux): rebuilt the subject group registration step with quick presets, compact subject rows, live progress validation, unresolved filtering, and a sticky finish CTA while preserving the existing final submit flow
v1.1.86
2026-03-07
- tune(login-action-width): narrowed and centered the login submit and account-creation buttons so they no longer stretch across the full form width and now match the tighter action layout used on the registration screen
v1.1.85
2026-03-07
- tune(register-course-action-buttons): aligned the course-registration submit and back buttons with the login auth buttons by matching the primary fill, outline treatment, height, radius, and active interaction states
v1.1.84
2026-03-07
- tune(register-admission-cards): replaced the admission-year dropdown on the course registration step with the same card-based selection language used by the other pathway choices
- tune(register-course-ukrainian-copy): translated the visible registration-course labels, helper messages, campus states, and validation errors into Ukrainian so the whole pathway step reads consistently
- tune(shared-footer-and-changelog-copy): localized the shared footer pills and changelog modal labels so the registration screen no longer mixes English footer controls into the Ukrainian flow
v1.1.83
2026-03-07
- tune(register-campus-button-language): simplified the campus choice cards on the registration step so they now read closer to the same compact selection language as the track and program buttons instead of standing out as oversized status widgets
- tune(footer-sync-pill-tone): aligned the footer online or offline status chip with the release version pill across the shared design system and Studerria theme so both footer chips now use the same base border and background treatment
v1.1.82
2026-03-07
- feat(register-teacher-no-admission-step): removed the visible admission-year choice from the teacher registration flow so teachers now move through track, program, and campus without picking a cohort manually
- fix(register-teacher-admission-resolution): added backend auto-resolution of the active teacher pathway admission so campus-to-course binding still works when teacher registration submits without an explicit admission year
v1.1.81
2026-03-07
- tune(pathways-flash-alerts): aligned success and error banners in the pathways workspace with the legacy admin flash-message styling so status feedback now renders in the same visual language
v1.1.80
2026-03-07
- feat(register-single-program-flow): hide the program dropdown on the course-registration step when a track has only one program and show it as a locked selected card instead
- feat(legacy-admission-course-mapping): added legacy year inference so bachelor or master admissions can resolve `1 курс`, `2 курс`, and campus duplicates into the right cohort mapping without exposing raw course choice during registration
- feat(pathways-legacy-quick-map): added a one-click admin pathways action that writes legacy year mappings into `program_admission_courses`, so flows like `1 курс -> 2026` and `2 курс -> 2025` can be applied directly from the selected admission year
v1.1.79
2026-03-07
- tune(register-campus-controls): restyled the Kyiv and Munich campus choices to use the same compact selection language as the other pathway buttons instead of oversized message cards
- tune(register-campus-ambiguity-copy): shortened ambiguous campus copy and kept the conflict explanation in the shared hint area so the campus step reads cleaner while still blocking invalid mappings
v1.1.78
2026-03-07
- feat(register-campus-flow): replaced direct course picking on the registration pathway screen with campus selection so track, program, and admission year now resolve the linked course automatically
- feat(pathways-user-migration): added an admin pathways bulk action that assigns existing users from selected legacy courses to the chosen track, program, and admission year without forcing re-registration or changing their current course binding
- feat(pathways-campus-summary): added a registration-campus summary in pathways so ambiguous Kyiv or Munich bindings are visible before they break cohort registration
v1.1.77
2026-03-07
- fix(admin-pathways-render): stopped coercing `subjects.visible` through a boolean-style SQL path in the pathways subject catalog so `/admin/pathways` no longer crashes on installations where subject visibility is stored as integer legacy data
v1.1.76
2026-03-07
- feat(admin-pathways-sidebar): added a visible `Pathways` entry to the legacy admin sidebar so the pathways workspace is reachable without typing `/admin/pathways` manually
- feat(pathways-subject-catalog): added a read-only subject catalog on the pathways page that lists every subject grouped by its current course without changing existing course bindings
- fix(pathways-text-encoding): converted the pathways template to UTF-8 so Ukrainian copy renders correctly instead of broken replacement glyphs
v1.1.75
2026-03-07
- tune(footer-sync-pill-tone): aligned the online/offline footer status pill with the rest of the footer dock palette so the status chip no longer looks more saturated than adjacent footer controls
- tune(footer-sync-state-accent): kept network-state emphasis in the blinking dot while neutralizing the pill background and border for both online and offline states
v1.1.74
2026-03-07
- fix(modal-scrollbar-layout-shift): removed the shared `padding-right: 0 !important` override from `body.modal-open` so Bootstrap can keep scrollbar compensation and opening modals no longer nudges the whole page sideways
- fix(scrollbar-gutter-stability): added a stable root scrollbar gutter fallback to keep the viewport width visually consistent during modal open and close transitions
v1.1.73
2026-03-07
- fix(week-pager-layout-stability): recentered the floating week pager without transform-based horizontal offsets so the control no longer jitters or shifts when hovered
- fix(week-nav-hover-shadow): normalized week navigation hover shadows to keep visual feedback color-based without changing the pager geometry
v1.1.72
2026-03-07
- fix(modal-layering-and-scroll-lock): aligned every Bootstrap modal with the changelog modal layering model so dialogs now render above the backdrop, background scrolling stays locked, and modal content is no longer glazed by the overlay
- fix(global-no-blur-coverage): expanded the modal-open no-blur guard for admin glass surfaces and added a computed-style fallback that disables remaining page blur layers while a modal is open
- fix(week-pager-hover-shift): blocked the global button lift rule from moving week navigation controls so the week carousel no longer jumps on hover
v1.1.71
2026-03-07
- fix(modal-interaction-regression): limited custom backdrop z-index syncing to `changelog` modal only so regular Bootstrap modals no longer get covered by an elevated backdrop layer
- fix(global-modal-sync-scope): kept global `modal-open`/scroll-lock/no-blur synchronization for all modals while preventing non-changelog dialogs from inheriting changelog-specific backdrop overrides
v1.1.70
2026-03-07
- fix(global-modal-sync): extended the changelog modal runtime to all Bootstrap modals so body open-state, root scroll-lock, and no-blur fallback are synchronized consistently on `show/shown/hide/hidden` events
- fix(backdrop-interaction-lock): forced visible modal backdrops to keep pointer events enabled and added a modal-open overflow guard so background scrolling no longer leaks through on admin and other page-specific modal styles
v1.1.69
2026-03-06
- fix(changelog-modal-no-blur): synchronized changelog modal body-open state with both `studerria-changelog-open` and `modal-open`, extended shared no-blur guards for both states, and added an inline fallback that force-disables backdrop filters on global glass layers while the changelog modal is open
- fix(schedule-card-hover-color-tune): strengthened clickable lesson-card hover color shift in both themes so hover feedback is visible as color change, not only lift animation
v1.1.68
2026-03-06
- fix(modal-no-blur-final): added a late `modal-open` no-blur guard in the shared Studerria UI layer and removed the remaining welcome-state page blur in schedule so opening modals no longer softens the full viewport
- fix(schedule-card-hover-color): strengthened lesson-card hover with visible color shift in both dark and light themes while keeping non-clickable schedule containers static on hover
v1.1.67
2026-03-06
- fix(modal-no-blur-viewport): added a modal-open no-blur safeguard for shared glass layers so opening any modal no longer creates a full-page frosted blur effect
- fix(schedule-hover-scope): removed hover movement from non-clickable schedule containers and restored explicit hover lift for clickable lesson cards
v1.1.66
2026-03-06
- fix(modal-no-blur-hard-stop): added a shared no-blur override for modal backdrops, dialog surfaces, and glass controls inside dialogs so page-level glass styles can no longer blur the screen when a modal opens
- fix(schedule-light-surface-contrast): slightly increased the opacity and border contrast of schedule containers and lesson cards in the light theme so blocks separate more clearly from the page background
v1.1.65
2026-03-06
- fix(footer-network-pill): unified the shared footer status across app pages into a compact blinking dot plus English `Online` or `Offline` label instead of the longer localized sync text
- fix(schedule-footer-sync-override): removed the remaining schedule-specific footer sync styling and status refresh overrides so the shared footer pill now stays consistent everywhere
v1.1.64
2026-03-06
- feat(course-legacy-normalization): added an admin bulk action that moves legacy campus suffixes like `Munich` out of course names into the dedicated Campus field without changing course IDs
- fix(course-registration-clarity): refreshed the register-course selection cards so normalized course names stay clean while campus metadata is shown as a separate pill during track/program/admission selection
v1.1.63
2026-03-06
- fix(schedule-card-hover-scope): restored a dedicated hover state only for clickable lesson cards while keeping non-interactive day and panel shells visually stable on pointer hover
- fix(schedule-light-contrast): slightly separated lesson cards from their parent day containers in the light theme with denser fills, clearer borders, and a softer interactive hover contrast
v1.1.62
2026-03-06
- fix(schedule-no-blur): added a page-level no-blur override for schedule so cards, rails, footer dock, controls, drawer, and modal shells no longer reintroduce `backdrop-filter` through older glass rules
- fix(schedule-modal-controls): removed the remaining schedule-page blur from modal form controls and list items, so the homework modal now renders with solid surfaces instead of frosted inputs
v1.1.61
2026-03-06
- fix(schedule-hover): removed the remaining schedule block hover lift and hover recoloring so day panels and class cards now keep a stable appearance instead of flashing brighter on pointer hover
- fix(light-theme-surfaces): rebalanced the shared light-theme panel, footer dock, control, and schedule surface tones away from near-white fills to cooler slate-blue glass so cards and navigation controls keep clearer contrast
v1.1.60
2026-03-06
- fix(modal-blur-removal): removed the shared modal blur experiment entirely, including the spotlight backdrop logic, so modal windows now render as solid sheets without any blur layer
- fix(modal-style-overrides): added a final no-blur override in the shared modal enhancement layer to keep page-specific modal styles from reintroducing `backdrop-filter` on content, headers, footers, or backdrops
v1.1.59
2026-03-06
- fix(modal-spotlight): replaced the in-sheet blur with a viewport spotlight layer that covers the page around the active modal while keeping the modal box itself outside the blur field
- fix(modal-geometry-sync): modal spotlight bounds now follow the active dialog on show, resize, scroll, and stacked-modal changes so the blur cutout stays aligned to the visible sheet
v1.1.58
2026-03-06
- fix(modal-blur-layer): moved the shared liquid blur off `modal-content` and onto a background layer on `modal-dialog`, so the blur now sits behind the sheet instead of inside it
- fix(schedule-modal-glass): removed the remaining schedule-page modal/header/backdrop `backdrop-filter` rules that were still softening the homework modal content
v1.1.57
2026-03-06
- fix(modal-backdrop): removed the remaining full-screen backdrop blur so opening a modal no longer blurs the entire page outside the dialog
- fix(changelog-backdrop): stopped the changelog modal script from reapplying runtime blur to the Bootstrap backdrop, keeping blur localized to the modal sheet styling only
v1.1.56
2026-03-06
- fix(modal-layering): moved the shared modal glass blur into a dedicated background layer in `design-system.css` so dialog text and controls stay sharp on the base modal sheets too
- fix(changelog-sheet): routed the changelog liquid modal through the same layered blur variables so the stronger glass effect stays behind the content instead of over it
v1.1.55
2026-03-06
- fix(modal-sheet-blur): removed the extra backdrop blur from shared modal surfaces so only the page behind the dialog is blurred, not the dialog content itself
- fix(modal-sheet-contrast): made the shared dark and light modal backgrounds slightly denser after removing sheet blur so text stays crisp without losing contrast
v1.1.54
2026-03-06
- fix(about-topbar-spacing): moved the `/about` page onto the same local topbar path as the app screens so the navbar now has the correct gap from the top edge instead of sticking to it
- fix(local-topbar-shell-width): aligned the shared app navbar shell to the full content width inside `page-local-topbar` pages, removing the narrower shell and right-shift mismatch against the main content blocks on home, schedule, subjects, teamwork, and related screens
v1.1.53
2026-03-06
- fix(navbar-journal-student-visibility): returned the main `Журнал` item to students in the shared learning dropdown so the navbar matches the real journal access rules
- fix(navbar-journal-insights-scope): kept `Insights` staff-only while separating it from the main journal visibility rule, preventing student nav from exposing the extra analytics entry
v1.1.52
2026-03-06
- fix(custom-deadlines-student-visibility): hid `Дивні дедлайни` in the shared navbar, my-day drawer, and schedule shortcuts whenever student homework creation is disabled in system settings
- fix(custom-deadlines-student-rendering): stopped rendering student-view custom deadline sections, subject pickers, and modals on schedule when the current view should follow the homework-creation ban
- fix(custom-deadlines-permission-guard): aligned `/homework/custom` with the same permission rule so students and starostas cannot bypass the hidden UI and post custom deadlines while homework creation is turned off
v1.1.51
2026-03-06
- fix(welcome-modal-cta): restored clickability for the welcome modal action on home and schedule by moving it off the generic `glass` button shell and giving it a dedicated CTA hit area
- fix(welcome-modal-dismiss): added explicit dismiss handlers for the welcome modal buttons so they close reliably even when Bootstrap's attribute-based dismiss path is interrupted
- fix(welcome-modal-pointer-events): forced the welcome modal content stack and CTA layer to keep pointer events and z-index priority above decorative modal surfaces
v1.1.50
2026-03-06
- style(register-subjects-alert): redesigned the subject-group registration alert into an admin-style glass flash block with stronger contrast, depth, and readable icon/title/text hierarchy
- fix(register-subjects-error-copy): replaced the raw `Select group` redirect text with a proper route error code and localized display copy so missing-group errors now read cleanly for users
- style(register-subjects-empty-state): applied the same polished flash treatment to the `no subjects` info message so the whole page keeps one consistent Studerria shell language
v1.1.49
2026-03-06
- fix(register-course-contrast): increased contrast on the course selection screen so labels, helper text, and the main card stay readable in the dark purple theme instead of sinking into the glass background
- style(register-course-options): strengthened the visual states of track cards, course cards, and selects with denser surfaces, brighter text, and clearer selected outlines for both light and dark themes
- style(register-course-secondary-action): refreshed the `Назад до реєстрації` secondary button so it keeps readable text and a clearer hover state alongside the primary CTA
v1.1.48
2026-03-06
- fix(modal-backdrop-readability): added a shared modal readability layer that strengthens the backdrop blur and dimming so underlying page content no longer competes with open dialogs
- fix(modal-sheet-contrast): made Studerria modal sheets more opaque with denser glass gradients, cleaner borders, and stronger shadows so headers and body text stay readable over bright or busy screens
- fix(modal-shared-includes): connected the new modal enhancement stylesheet through the shared head partials and the `/about` page so the same readability treatment applies across auth, dashboard, admin, journal, schedule, teamwork, and changelog modals
v1.1.47
2026-03-06
- fix(navbar-shell-consistency): normalized the shared `studerria-nav-shell` against page-level `.topbar` overrides so the navbar now keeps the same glass background, border, shadow, and text colors on the home page and the rest of the app screens
- fix(navbar-shell-width): locked the authenticated navbar to one shared width model with matching desktop and mobile gutters, removing page-specific drift in shell size between home, schedule, profile, journal, teamwork, and related views
- fix(navbar-shell-overflow): disabled the legacy title-spotlight overlays for the new shared navbar shell and forced visible overflow on the shell container so dropdown positioning and overall tint stay identical across pages
v1.1.46
2026-03-06
- fix(about-topbar-shell): switched the `/about` page into the same local topbar mode used across the rest of the authenticated Studerria shell so the navbar alignment and spacing now match the other app screens
- copy(about-vision): updated the hero and about-card copy on the Studerria page to the new wording about the shared learning space, daily route, unified navigation, and role ownership
- style(about-bullet-dots): added a soft staggered pulse animation to the purple list markers on the about cards while keeping reduced-motion users on a static version
v1.1.45
2026-03-06
- feat(navbar-unread-marker): added an unread message marker beside `Особисте` in the shared navbar whenever the current user has unread messages and messaging is enabled
- feat(navbar-messages-marker): mirrored the same unread chip beside the `Повідомлення` item inside the `Особисте` dropdown so the marker stays visible on hover/open states
- fix(navbar-unread-sync): wired the shared navbar to `/messages.json` and the schedule unread updates so the new markers react to message reads without waiting for a full page reload
v1.1.44
2026-03-06
- style(profile-card-scale): reduced the desktop width of the profile edit shell so the `Редагування профілю` block reads as a more compact centered card instead of a wide form slab
- style(profile-card-density): tightened the profile card inner spacing, stat tile padding, and control heights for a cleaner, smaller editing panel while keeping the same glass visual language
- fix(profile-mobile-width): preserved full-width behavior for the profile card on phones so the compacting only affects desktop and larger tablet layouts
v1.1.43
2026-03-06
- fix(changelog-modal-interactions): moved the shared changelog modal into the document body at runtime so page-specific overflow, transform, and glass wrappers no longer break its backdrop hit area on schedule, teamwork, and other deep-shell screens
- fix(changelog-modal-touch-scroll): added dedicated touch scrolling behavior for the changelog sheet body, restoring swipe and inertial scroll on pages where old modal overrides previously trapped the content
- fix(changelog-backdrop-close): restored reliable tap and click closing for the changelog by syncing the active backdrop and closing the top-level changelog modal when the user presses outside the sheet
v1.1.42
2026-03-06
- feat(about-page): added a new authenticated `/about` page in the shared Studerria shell with vision-style glass cards for purpose, modules, roles, and a direct jump back to the main dashboard
- fix(navbar-brand-route): pointed the shared `Studerria` brand in the navbar to `/about` while leaving `Головна` mapped to the existing dashboard route
- fix(teacher-pending-about-access): whitelisted `/about` in the teacher-pending gate so the new brand route stays reachable for authenticated users in every role state
v1.1.41
2026-03-06
- style(navbar-logout-icon-shape): swapped the navbar logout glyph for a slimmer door-and-arrow silhouette closer to the requested reference while keeping the plain text-colored treatment
v1.1.40
2026-03-06
- style(navbar-logout-glyph): removed the logout pill shell and left only a plain exit icon in the same color as the navbar text, so the action now reads like a lightweight glyph instead of a button
v1.1.39
2026-03-06
- fix(navbar-theme-label): made the shared navbar theme item show the opposite target theme name, so dark mode now offers `Світла` and light mode offers `Темна` instead of the generic `Зміна теми` text
v1.1.38
2026-03-06
- style(footer-sync-pill): resized the schedule online status pill to match the footer version badge geometry and typography while keeping the green online and amber offline indicator colors intact
v1.1.37
2026-03-06
- style(navbar-logout-icon): replaced the circular `Вийти` text pill with a compact icon-only logout control that keeps the glass feel but reads as a flatter, more intentional exit action
v1.1.36
2026-03-06
- fix(navbar-inner-padding): added dedicated left and right inner spacing inside the shared navbar capsule so the Studerria brand, primary links, and session controls no longer sit too close to the block edges
v1.1.35
2026-03-06
- fix(navbar-left-anchor): anchored the primary `Адмінка`, `Головна`, `Навчання`, and `Особисте` links directly beside `Studerria` by overriding the spotlight topbar auto-brand spacing and pushing the session controls to the far right
v1.1.34
2026-03-06
- fix(navbar-brand-alignment): pulled the `Адмінка`, `Головна`, `Навчання`, and `Особисте` text navigation cluster closer to the `Studerria` brand by removing inherited brand spacing and tightening the brand-to-menu gap
v1.1.33
2026-03-06
- fix(page-text-encoding): restored the `my-day` and `schedule` EJS sources from the last good revision so Ukrainian copy and labels no longer render as mojibake on page surfaces
- fix(navbar-text-layout): rebuilt the shared app navbar so `Адмінка`, `Головна`, `Навчання`, and `Особисте` sit as left-aligned text navigation beside the Studerria brand instead of reading like a row of glass pills
- fix(navbar-dropdown-positioning): moved the shared dropdown behavior to open directly under top-level nav items, kept nested flyouts for deeper entries, and removed topbar clipping so hover menus are no longer cut off
v1.1.32
2026-03-06
- fix(navbar-partial-locals): made the shared navbar partial tolerate missing optional include locals like `forceAppNavbar`, `userNav`, `navItems`, and `navMeta` so layout-rendered pages no longer crash with `ReferenceError`
v1.1.31
2026-03-06
- refactor(nav-config): replaced the duplicated page-level menu logic with one shared navbar config, one nav middleware, and one recursive EJS renderer that now injects consistent navigation locals across Studerria pages
- feat(nav-dropdown-flyouts): rebuilt the app navigation structure into `Studerria -> Адмінка -> Головна -> Навчання -> Особисте`, with role-aware filtering, current-page removal, Journal -> Insights flyouts, and desktop hover plus mobile tap plus keyboard interactions
- chore(nav-legacy-drawers): retired the old desktop drawer and mobile menu partial behavior, wired shared navbar JS/CSS globally, and kept logout plus changelog access aligned with the existing liquid-glass shell
v1.1.30
2026-03-06
- style(light-shell-panels-and-tables): brightened the shared light-theme card and table tokens with softer blue-tinted glass gradients, cleaner table head surfaces, and a more consistent table shell across the Studerria UI system
- style(journal-light-polish): tightened the journal top spacing, improved light-theme table striping and hover states, refreshed journal cards and attendance surfaces, and replaced the broken details chevron glyph with a stable CSS arrow
- style(subjects-and-pathways-polish): added dedicated page-level polish for `subjects`, `journal-insights`, and `admin-pathways` so their cards, chips, controls, and analytics surfaces now sit on the same liquid-glass shell in both dark and light themes
v1.1.29
2026-03-06
- style(shared-table-shell): rebuilt the shared table geometry to use one continuous table surface instead of per-row floating pills, and added a canonical `.table-shell` wrapper so headers and body rows now align across analytics, admin, and journal screens
- style(journal-table-wrappers): moved `journal`, `journal-config`, and `attendance` table wrappers onto the same radius, border, blur, and shell background used by the shared Studerria table system
- refactor(schedule-sync-footer): moved the schedule online/offline sync indicator out of the topbar and into the footer dock so header actions stay cleaner while live cache status remains visible at the bottom of the page
v1.1.28
2026-03-06
- fix(schedule-publication-clarity): made the `Publish at` slot readable in its inactive state, added a scheduling hint, and synced the publication row state so delayed publishing is clearer inside homework modals
- style(light-topbar-tint): replaced the washed-out gray light-theme topbar treatment with the same indigo liquid-glass family used by the shared Studerria shell, including matching topbar pills and spotlight variant surfaces
- fix(disabled-datetime-contrast): improved disabled `date`, `time`, and `datetime-local` contrast in the shared control system so non-active scheduling fields stay legible instead of fading into the modal background
v1.1.27
2026-03-06
- fix(theme-bootstrap-legacy-pages): added shared head and body theme bootstrap partials across legacy `dynamic-bg` pages so standalone screens now load the correct dark or light theme before local page scripts run
- style(shell-unification-legacy-pages): injected shared `studerria-ui.css` plus `studerria-theme` and `page-local-topbar` shell classes into legacy topbar pages so headers, controls, cards, and footer dock stay visually aligned with the main Studerria shell
- fix(theme-toggle-standalone-pages): rebuilt standalone theme handlers on pages like `admin-pathways`, `journal-insights`, `teacher-hub`, `teacher-subjects`, and `teacher-workspace` so mobile menu toggles now persist one canonical theme and sync `data-theme` on both `html` and `body`
v1.1.26
2026-03-06
- style(design-system-controls): added a shared liquid-glass control system for inputs, selects, textareas, file pickers, checkboxes, radios, labels, and focus rings so forms now read as one coherent Studerria surface in both themes
- style(design-system-data-surfaces): rebuilt shared table, table-shell, section subtitle, and empty-state styling so dense admin and analytics screens inherit cleaner hierarchy, softer data rows, and more intentional empty states
- refactor(admin-form-overrides): trimmed legacy inline form/select visuals in `admin.ejs` and `admin-overview.ejs`, keeping only select arrow behavior and theme-safe option colors so the shared shell styles can stay in sync across admin views
v1.1.25
2026-03-06
- style(footer-dock-cleanup): removed the top gloss sheen from the shared footer dock entirely so the footer capsule reads as one clean liquid-glass shape without a separate upper oval
v1.1.24
2026-03-06
- style(footer-dock-sheen): refined the top highlight inside the footer dock so the upper gloss no longer reads like a separate oval, using a narrower and softer liquid-glass sheen
v1.1.23
2026-03-06
- style(footer-dock-brightness): lightened the shared footer dock surface, border, and text so the footer capsule sits closer to the rest of the indigo glass shell instead of reading as an overly dark strip
v1.1.22
2026-03-06
- style(footer-dock-unification): moved footer dock styling into the shared Studerria shell so footer capsules now use one consistent liquid-glass surface, border, and text treatment across pages instead of drifting between local implementations
- refactor(page-footer-overrides): removed duplicate footer overrides from `schedule` and `my-day`, leaving only page-specific spacing while the shared footer surface and interactions stay synchronized in both dark and light themes
v1.1.21
2026-03-05
- style(topbar-color-unification): aligned shared `topbar` and `admin-nav` surfaces to one consistent indigo glass tone across light and dark theme contexts instead of letting light-mode pages drift into separate white capsules
- style(topbar-control-unification): matched topbar action controls, theme toggles, and admin session chips to the same shared topbar tint so header controls no longer change color family from page to page
v1.1.20
2026-03-05
- fix(theme-sync): added an early shared theme bootstrap in the global layout so all layout-driven pages start with the same canonical dark or light state before page scripts run
- fix(theme-storage-canonical): normalized `ui-theme` handling in the shared background manager so both `dark/light` and `theme-dark/theme-light` are read safely and persisted back in one canonical format
- fix(theme-toggle-unification): moved shared theme toggles onto one global click handler so topbar, drawer, mobile menu, and shell toggles stop diverging across pages like admin pathways and other local-topbar screens
v1.1.19
2026-03-05
- ux(admin-students): removed the collapsible students filters block from the admin students panel so the table opens immediately without the extra filter accordion
v1.1.18
2026-03-05
- fix(modal-surface-clarity): removed backdrop blur from the shared modal surface and sticky modal bars so dialogs read as solid foreground panels instead of feeling like they sit under the page blur
v1.1.17
2026-03-05
- fix(modal-backdrop-close-flash): kept the backdrop color consistent between base and `show` states so closing a modal no longer flashes a gray overlay before the backdrop fades out
v1.1.16
2026-03-05
- style(schedule-card-hover): replaced the flat gray class-card hover with a richer blue-indigo liquid-glass hover state and removed the remaining hover lift so timetable cards feel calmer and more premium
v1.1.15
2026-03-05
- style(schedule-sync-indicator): added a subtle pulse animation to the green online status dot in the schedule topbar, while keeping the offline state static and honoring reduced-motion preferences
v1.1.14
2026-03-05
- fix(local-topbar-alignment): tightened the gap between local topbars and page content, and narrowed local topbar capsules so they align with the same content frame as schedule and other shell blocks
v1.1.13
2026-03-05
- style(journal-insights-hero): rebuilt the `Journal insights` hero into a two-column glass header with live KPI tiles so the page opens with a stronger summary instead of a flat text block
- style(journal-insights-tables): replaced the default bright Bootstrap tables with themed glass tables, softer headers, striped body rows, and consistent empty states across comparison, ranking, and subject mix
- fix(journal-insights-copy): normalized the page encoding/copy and replaced the broken subtitle and selector separators so the screen no longer shows garbled text in the hero and filter dropdowns
v1.1.12
2026-03-05
- fix(homework-modal-actions): moved the `Save homework` primary action into the sticky modal footer next to `Close`, keeping the form fields focused and making the final action row less confusing
v1.1.11
2026-03-05
- tune(shell-gutters): increased the outer viewport gutters for the global navbar and admin topbar so capsules sit a bit farther from the screen edges on desktop
- tune(shell-gutters-mobile): slightly widened mobile edge spacing for the same top-level bars to keep the frame cleaner on narrower screens
v1.1.10
2026-03-05
- style(admin-topbar): rebuilt the admin topbar into a rounded liquid-glass capsule with tighter spacing, better shell alignment, and more polished course/session/action grouping
- style(admin-controls): refined admin topbar controls (`course chip`, `session status`, `preview/schedule/logout`) with softer glass backgrounds, stronger pill geometry, and improved light-theme surfaces
- style(shared-toggle-roundness): restored circular geometry for shared `theme-toggle`, drawer, and mobile action buttons so toolbar controls no longer feel squared off
v1.1.09
2026-03-05
- tune(modal-overlay-feel): removed the heavy backdrop blur from shared modals and reduced overlay opacity so the underlying page stays visible again while dialogs are open
- tune(modal-scroll-behavior): restored page scrolling under `modal-open` so long pages can still reveal lower content behind the translucent modal layer without breaking dialog interaction
v1.1.08
2026-03-05
- style(schedule-cleanup): removed the standalone `Focus week`, `Week pulse`, and `test view` utility blocks from the schedule header area to keep the page focused on the actual timetable
- style(schedule-status-topbar): moved the online/cache sync status into the schedule topbar so operational state stays visible without consuming a separate content panel
- refactor(schedule-focus-retire): removed the old `focus-week` toggle hookup and cleared its stored state so the schedule no longer carries inactive focus-mode UI logic
v1.1.07
2026-03-05
- style(shell-width): increased the shared app shell width from 1240px to 1560px so content blocks, local topbars, and the global navbar have 20-30% more breathing room on large screens
- style(container-width): widened desktop `.container` usage inside the shared shell so pages like `schedule`, `my-day`, and other Bootstrap-based screens no longer feel overly narrow within the new layout
v1.1.06
2026-03-05
- fix(schedule-week-pill-contrast): restored the dedicated bright gradient styling for the `week` badge in schedule hero so its label remains readable after the 1.1.05 shell adjustments
v1.1.05
2026-03-05
- fix(local-topbar-shell): added a dedicated `page-local-topbar` layout flag and tightened page container spacing so legacy in-page topbars sit closer to the viewport top with cleaner rounded geometry
- fix(modal-layering): restored Bootstrap modal stacking by removing the shared `position: relative` override from `.modal`, raising modal/backdrop z-index, and locking page interaction behind the overlay
- fix(modal-scroll-coverage): tuned scrollable modal height/overflow behavior so long dialogs cover the page correctly and remain fully interactive above glass/blur layers
- feat(changelog-grouping): reorganized the changelog modal into grouped `major.minor` release sections (`1.1.x`, `1.0.x`, `0.9.x`) to reduce visual overload and keep release notes responsive
v1.1.04
2026-03-05
- fix(button-hover-sheen): disabled legacy `btn-primary` pseudo-element glare that produced a left-edge color stripe on gradient buttons during hover
- fix(card-hover-lift): removed translate-based hover lift from shared cards, schedule entries, cockpit panels, stat tiles, and other glass blocks so surfaces stay stable across the app
- style(page-polish): refined `schedule`, `my-day`, and `profile` with cleaner liquid-glass surfaces, larger radii, softer panel contrast, and typography/alignment closer to the `vision` draft
v1.1.03
2026-03-05
- style(global-vision-polish): aligned shared UI tokens with the `vision` draft by introducing richer glass variables for text, panels, pill surfaces, and CTA gradients
- style(navbar-topbar): upgraded global navbar and in-app topbars with stronger liquid-glass backgrounds, highlight sheen, deeper shadows, and cleaner spacing closer to the showcase page
- style(cards-buttons): refreshed shared cards and button surfaces with larger radii, heavier blur, softer inset highlights, and vision-like pill CTA/outline treatments across the app shell
v1.1.02
2026-03-05
- fix(global-cursor-bloom): removed the global `studerria-cursor-glow` layer from shared background markup and disabled its CSS so the old white semi-transparent mouse-follow bloom no longer renders
- fix(glow-positioning): corrected runtime glow positioning logic to use absolute `left/top` anchoring instead of viewport-center offset math, preventing displaced right-bottom cursor glow if the layer is ever reintroduced
v1.1.01
2026-03-05
- fix(global-bg-follow-residual): disabled pointer-driven parallax transforms for all background layers to eliminate remaining distant mouse-follow artifacts (including moving dot-pattern clusters)
v1.1.00
2026-03-05
- fix(global-bg-diagonal-follow): disabled pointer parallax for large morph blobs on all global-layout pages so distant circular shapes no longer chase the cursor diagonally
- tune(global-bg-motion): kept ambient drift and trail behavior while limiting pointer reaction to non-blob decorative layers for cleaner visual focus
v1.0.x 100 релізів ›
v1.0.99
2026-03-05
- fix(auth-trail-restore): restored symbol trail rendering on `page-auth` while keeping cursor glow and pointer parallax disabled there
- tune(auth-background): retained previous cleanup of duplicate ambient mouse-follow so auth pages keep the 1.0.97 feel without extra overlay effects
v1.0.98
2026-03-05
- fix(auth-cursor-quiet-mode): disabled symbol trail rendering and pointer-based trail spawning on `page-auth` to fully remove residual mouse-follow visuals on login/register
v1.0.97
2026-03-05
- fix(auth-parallax-follow): disabled pointer-driven background parallax on auth pages (`page-auth`) to remove residual cursor-follow motion while preserving soft blob drift and symbol trail
v1.0.96
2026-03-05
- fix(auth-mouse-follow-duplicate): disabled legacy `design-system` ambient pointer layer on pages rendered with global `studerriaBg` to remove secondary cursor-follow effect on login/register
- fix(ambient-compat): added safe cleanup for stale `.ambient-layer` nodes when switching to global layout pages with native studerria background runtime
v1.0.95
2026-03-05
- fix(layout-auth-shell): global render wrapper now marks `login/register*` as auth pages, appends stable `page-auth/page-register` body classes, and disables global navbar there
- fix(auth-background-glow): disabled global cursor glow on auth pages to remove distant white circle artifact while keeping the ambient gradient/morph layers
- feat(trail-grid-global): replaced generic mouse trail with grid-based brush stamps (`o`, `>`, `_`) using per-cell cooldown and path interpolation for readable non-overlapping symbols
- perf(trail-continuity): added interpolated stamping between pointer samples and throttled resize handling so fast cursor jerks keep a continuous trail without UI stalls
- style(light-balance): tuned light theme background/particle contrast and increased trail symbol size/weight for better visibility across pages
v1.0.94
2026-03-05
- fix(studerria-bg-freeze): hardened global background runtime with one-time init guard (`window.__studerriaBackgroundInitialized`) to prevent duplicate RAF/observer setup on heavy pages
- fix(studerria-theme-sync): reworked theme synchronization with guarded apply flow to avoid recursive attribute churn and reduce risk of browser "page not responding" after auth redirects
- perf(studerria-bg-low-power): introduced low-power mode for data-heavy pages (schedule/journal/admin/teamwork) with slower morph cadence, reduced particle pool, and lighter effect budget
- style(studerria-bg-optimization): lowered trail density/velocity and added low-power blur overrides for morph blobs to keep UI responsive while preserving visual identity
v1.0.93
2026-03-05
- feat(layout-main): introduced global `views/layouts/main.ejs` shell with unified app frame (`studerria-theme` body, shared background layer, optional global navbar, and universal `page-container`)
- feat(render-wrapper): added server-side render wrapper in `app.js` that applies `layouts/main` to all EJS pages by default (except explicitly excluded views), preserving existing route logic without per-route duplication
- feat(global-background-system): added namespaced background stack (`studerria-bg`, morph blobs, cursor glow, particles, grain, dot-pattern) via `studerria-background.ejs` + `public/css/studerria-background.css` + `public/js/studerria-background.js`
- feat(global-ui-system): added `public/css/studerria-ui.css` with namespaced visual system (`studerria-navbar`, `studerria-card`) and scoped adaptation rules for existing buttons/topbars/cards to align all pages with one product style
- fix(background-collision): layout parser now strips legacy page-level background markup/assets (`dynamic/login/schedule/vision`) before composing final HTML so effects do not overlap or block UI
v1.0.92
2026-03-05
- fix(dynamic-bg-stability): removed recursive theme-attribute feedback path that could cause UI stalls on some pages and stabilized theme sync to html-only updates
- feat(dynamic-bg-trail): added global lightweight mouse trail layer (`o`, `>`, `_`) to shared background so all dynamic-bg pages now have visible cursor-follow trace
- perf(dynamic-bg-runtime): capped trail particles/pacing (pool + spawn interval) and kept single RAF pipeline for morph/parallax/highlight/trail updates to prevent tab hangs
- style(dynamic-bg-polish): introduced theme-aware trail color/blend variables and reduced-motion fallbacks for smoother, subtler cross-site behavior
v1.0.91
2026-03-05
- feat(global-vision-bg): upgraded shared `dynamic-bg` to vision-style ambient engine with layered gradient, dual morphing SVG blobs, noise, edge dot-patterns, and subtle mouse highlight
- feat(global-vision-motion): added single-RAF morph interpolation (`primary/secondary` blob shape sets) with smoothstep easing plus depth-based parallax and coarse-pointer auto-drift
- refactor(page-bg-unification): switched `login.ejs` and `schedule.ejs` from dedicated `login-bg/schedule-bg` assets to shared `dynamic-bg` partial/CSS/JS so visual language matches across site
- ux(theme-sync-bg): added dynamic background theme sync via body class observation to keep light/dark morph palette consistent during runtime theme toggles
v1.0.90
2026-03-05
- feat(vision-morph-layer): rebuilt `/vision` ambient background shapes into dedicated `bg-morph-layer` with primary/secondary SVG blobs behind UI
- feat(vision-blob-morph): added smooth path morphing between 3 organic states per blob using a throttled single-RAF interpolation engine (`toBlobPath` + `smoothstep`)
- motion(vision-blob-float): introduced subtle long-cycle breathing transforms (scale/rotate/translate) with separate timings for primary (30s) and secondary (45s) blobs
- tune(vision-parallax-theme): updated cursor parallax to depth-based pointer delta mapping and added light/dark morph gradient variables with lower light opacity for readability
v1.0.89
2026-03-05
- style(vision-glass): made core `/vision` glass surfaces more transparent by lowering global panel alpha for both light and dark themes
- style(vision-cards): reduced opacity of nested thread and conversation cards so background depth reads cleaner through content blocks
- style(vision-code-diff): softened code-diff card gradient opacity to align with lighter liquid-glass layering
- style(vision-compose): lowered input field fill opacity in both themes to keep controls visually consistent with updated transparent panels
v1.0.88
2026-03-05
- fix(vision-trail-continuity): added segment interpolation between pointer positions so fast mouse jerks no longer create broken/gapped trails
- perf(vision-trail-sampling): increased particle pool and switched to multi-stamp path sampling (capped per event) for stable continuous brush rendering under high cursor speed
- tune(vision-trail-density): reduced stamp interval threshold and minimum movement gate while keeping grid spacing/cell cooldown anti-overlap safeguards
- ux(vision-trail-pointer-reset): reset pointer sample anchors on leave/reduced-motion state switches to avoid accidental trail jumps at re-entry
v1.0.87
2026-03-05
- fix(vision-trail-grid-lock): bound each trail symbol to discrete grid cells and added per-cell cooldown so symbols do not render on top of each other
- ux(vision-trail-spacing): increased brush lane offsets and stamp spacing for clearer readable rows closer to reference style
- perf(vision-trail-density): reduced stamp frequency and required minimum cursor travel distance before placing a new symbol stamp
- motion(vision-trail-cleanup): extended stamp cell memory cleanup window and softened residual drift/rotation to keep traces tidy
v1.0.86
2026-03-05
- fix(vision-trail-overlap): added anti-overlap brush stamping with grid snapping, minimum movement distance, and per-cell cooldown to prevent unreadable symbol stacking
- feat(vision-trail-pattern): switched brush offsets to ordered lanes (`_ > o > _`) around cursor direction for clearer stroke-like rows instead of dense random clusters
- ux(vision-trail-fade-order): preserved layered fade timing so far symbols disappear first, then middle, then center, with softer micro-drift for cleaner traces
- style(vision-trail-scale): reduced glyph size and shadow intensity for sharper legibility in dense cursor paths
v1.0.85
2026-03-05
- feat(vision-trail-brush): replaced orbit trail with brush-like stamps that draw near cursor using ordered symbols `o > > _ _` (center + 2 middle + 2 outer)
- motion(vision-trail-fade): implemented layered lifetime so outer symbols fade first, then middle, then center, creating progressive fade toward cursor after pointer stop
- style(vision-trail-size): reduced trail glyph size and glow for cleaner micro-detail while preserving visibility on both themes
- refactor(vision-trail-engine): rewrote trail runtime to pooled stamp particles with movement-direction offsets and light drift, while keeping existing background parallax/focus logic
v1.0.84
2026-03-05
- style(vision-buttons): recolored key CTA buttons (Sign up, Hero primary, Conversation submit) to GPT icon palette with indigo?violet gradient fill
- ux(vision-buttons-hover): added soft brightness/saturation hover and glow for accent buttons while keeping existing spacing and proportions unchanged
- style(vision-thread-actions): added subtle GPT-tinted hover state for thread action pills to align micro-interactions with new accent system
- refactor(vision-theme-vars): introduced dedicated accent CSS variables (`--gpt-accent-*`) for easy future button palette tuning in light/dark themes
v1.0.83
2026-03-05
- ux(vision-trail): cursor symbols now persist for several seconds after pointer stops (hold + smooth fade-out), instead of disappearing almost immediately
- motion(vision-burst): changed under-cursor burst behavior from scatter to near-stationary fade pulse, so symbols dissolve cleanly without flying away
- fix(vision-left-shape): reduced sharp clipping on the left organic blob by expanding SVG filter bounds and allowing visible overflow for softened edges
- style(vision-light-contrast): darkened light-theme background accents and trail symbol blending to improve visibility/contrast on bright surfaces
v1.0.82
2026-03-05
- feat(vision-layout): switched `/vision` to new `vision.ejs` scaffold with dedicated background partial and isolated content partials for schedule/profile/settings cards
- feat(vision-bg-balance): rebuilt ambient background with cleaner symmetric gradient distribution, mirrored organic SVG blobs, reduced noise intensity, and edge dot-patterns for less visual "mud"
- feat(vision-trail-symbols): replaced dot particles with 18 symbol particles (`?`, `?`, `?`, `0`, `?`) driven by `TrailParticle` engine: rotating wave ring around cursor plus burst symbols appearing/fading directly under pointer
- feat(vision-focus-accessibility): added nearest-shape focus/defocus behavior with 10-20% scale emphasis, dimmed neighbors, single-RAF parallax loop, and fallback mode for coarse pointers/reduced-motion users
v1.0.81
2026-03-05
- feat(vision-page): added new `/vision` page with Codex-inspired layout (header nav + sign-up CTA, hero copy, dual-action buttons, and right-side code diff module)
- feat(vision-background): introduced dedicated layered SVG ambient background with organic gradient clouds, slow morph-like drift, grain texture, side dot-patterns, and mouse-reactive particle field
- feat(vision-interaction): implemented pointer parallax, focus/defocus for nearest shape, particle follow-and-return behavior, and one-RAF animation loop with reduced-motion/coarse-pointer fallbacks
- refactor(vision-partials): extracted reusable Studerria content partials for threads blocks (`schedule`, `profile`, `settings`) to simplify future content swaps without touching visual engine
v1.0.80
2026-03-05
- feat(schedule-bg): added dedicated schedule background partial with layered gradient, 4 animated blobs, grain overlay, side dot-patterns, and mouse trail container
- feat(schedule-bg-motion): added schedule-only interactive engine with one RAF loop for inertial pointer parallax, 16 pooled trail particles (circle/cross/star), and lightweight fade lifecycle
- feat(schedule-bg-focus): nearest blob now receives temporary focus state (scale + tint boost) on pointer activity and auto-defocus after 3s idle
- a11y(schedule-bg): added reduced-motion and coarse-pointer safeguards that disable trail/focus interactions while preserving readable static gradient and schedule content layering
v1.0.79
2026-03-05
- feat(login-bg): added dedicated dynamic login background partial with layered gradient, 4 blobs, grain overlay, side dot-patterns, and cursor highlight
- feat(login-bg-parallax): implemented login-only pointer-follow and blob parallax with inertial lerp, coarse-pointer fallback drift, hidden-tab pause, and reduced-motion safeguards
- ux(login-theme-sync): synchronized `data-theme` attribute with login theme toggle so background variables render correctly in light and dark modes
- chore(login-wiring): switched login page from global dynamic-bg assets to dedicated `/css/login-bg.css` and `/js/login-bg.js` without altering form behavior
v1.0.78
2026-03-05
- feat(dynamic-bg-structure): rebuilt global background partial to Codex-like layer stack (`gradient-layer`, `blob1..3`, `noise-overlay`, edge `dot-pattern`, `mouse-highlight`)
- feat(dynamic-bg-style): replaced dynamic background stylesheet with light/dark theme variables (`--bg-base`, blob colors, noise/dot/highlight opacity), smooth blob drift, and reduced-motion fallback
- feat(dynamic-bg-runtime): rewrote global mouse-follow/parallax script with one RAF loop, pointer-aware behavior (coarse pointer auto-drift), visibility pause/resume, and safe theme fallback
- chore(dynamic-bg-assets): added reusable grain texture asset at `/public/assets/grain.png` for subtle noise overlay across all pages
v1.0.77
2026-03-05
- ux(footer-release): removed duplicate plain version label in footer and kept only the new release pill style
- feat(footer-release-pill): added fallback to `appVersion` so the pill still renders even if changelog latest version is missing
- motion(footer-dot): added subtle pulse animation for release dot with `prefers-reduced-motion` fallback
v1.0.76
2026-03-05
- fix(dynamic-bg-stability): prevented `data-theme` mutation observer feedback loop by syncing body theme attribute only when value actually changes
- perf(dynamic-bg-runtime): pause RAF animation when tab is hidden and resume only when visible to reduce CPU spikes and avoid unresponsive-page risk
- perf(dynamic-bg-safemode): added low-end device safe mode (reduced parallax amplitude + lighter grain/dot layers) for smoother rendering under weak hardware
v1.0.75
2026-03-05
- feat(dynamic-bg-global): added global dynamic background partial with Codex-style layered blobs, grain overlay, edge dot-grid, and glass-friendly depth composition
- feat(dynamic-bg-parallax): added one-RAF mouse-follow/parallax engine with lerp inertia, subtle multi-depth movement, and mobile auto-drift fallback
- feat(dynamic-bg-accessibility): added prefers-reduced-motion support that disables drift/parallax and keeps a static readable gradient state
- chore(dynamic-bg-wiring): connected `/css/dynamic-bg.css`, `partials/dynamic-bg`, and `/js/dynamic-bg.js` across all top-level EJS pages for full-project coverage
v1.0.74
2026-03-05
- feat(journal-insights-compare): added compare mode filter (groups/courses), comparison table, and extended summary KPIs (risk/excellence/consistency/reliability/momentum)
- feat(journal-insights-export): added `GET /journal/insights/export.csv` with scope metadata, summary, ranking, comparison, subject mix, and trend sections
- feat(admin-subjects-bulk-assign): added upsert mode for existing target subjects and optional admission-level pathways visibility sync from source subject
- perf(pathways-insights): added migration `034_pathways_bulk_assign_and_insights_indexes` with indexes for normalized subject lookup, pathways mapping, and insights-heavy grade queries
v1.0.73
2026-03-05
- feat(teacher-subjects): added dedicated `/teacher/subjects` page with teacher-specific navigation flow and save confirmation path
- feat(react-islands-teacher): integrated checklist toolbar island into teacher subjects selection for search and bulk all/none/invert actions
- feat(admin-subjects-bulk-assign): added `POST /admin/subjects/bulk-assign` to assign one subject to multiple target courses with duplicate-skip guard
- ux(teacher-navigation): updated topbar/drawer/mobile menu to handle dedicated `teacher-subjects` active state and avoid duplicate links
v1.0.72
2026-03-05
- feat(pathways-copy): added admission-to-admission copy actions for course mapping and subject visibility with same-program guards
- feat(pathways-react-islands): added checklist toolbar island (search, all/none/invert, live selected counter) for pathway mapping and subject visibility forms
- feat(journal-insights-react-islands): added period preset island for one-click period switching in `/journal/insights` filters
- ux(design-system): introduced liquid-glass styles for island toolbars and period preset chips to keep controls consistent across pages
v1.0.71
2026-03-05
- feat(journal-insights-student-course): added new `student-course` scope (`Student (all subjects)`) to analyze one student across all subjects in a selected course
- feat(journal-insights-student-course-trends): grade and attendance trend queries now support personal course-wide dynamics with month/semester/year/all periods
- ux(journal-insights-filters): student selector is now enabled for `student-course`, while subject selector is auto-locked for aggregate scopes
v1.0.70
2026-03-05
- feat(journal-insights-all-courses): added a new `all-courses` scope in `/journal/insights` to aggregate ranking and summary metrics across all accessible courses
- feat(journal-insights-trends): grade and attendance trends now support multi-course aggregation with shared period filters for deanery/admin-style overview
- ux(journal-insights-filters): in all-courses scope, course/subject selectors auto-lock to prevent invalid combinations and show active course count in the insights hero
v1.0.69
2026-03-05
- feat(journal-insights): added a dedicated `/journal/insights` analytics page with scope filters (course/subject/group/student), period windows, ranking, and grade/attendance trends
- feat(journal-insights-publish): added `POST /journal/insights/publish-rating` to publish top-N rankings into messages for course-wide or subject-group audiences
- ux(journal-navigation): added Journal Insights entry to desktop drawer and mobile menu, and wired topbar drawer behavior for the new page
- ux(journal-shortcut): added direct `Journal insights` shortcut from the main journal page with current course/subject preselection
v1.0.68
2026-03-05
- feat(admin-pathways): added dedicated /admin/pathways workspace to manage track programs, admission years, course mapping, and admission-level subject visibility
- feat(pathway-rollover): creating a new admission year now auto-copies course mapping and subject visibility from the latest year in the same program
- ux(pathways-navigation): added Pathways entry to topbar/drawer/mobile menu for roles with subjects/courses admin access
- feat(teacher-subject-catalog): teacher subject picker now includes program+admission labels in search and course meta for faster filtering
v1.0.67
2026-03-05
- feat(teacher-hub): added dedicated `/teacher` hub page with teacher snapshot metrics and quick actions for schedule/workspace/subjects/journal
- ux(teacher-navigation): wired Teacher Hub into topbar, desktop drawer, and mobile menu to separate teacher flow from admin-centric navigation
- ux(teacher-workspace-navigation): connected teacher workspace to shared drawer navigation and added direct Teacher Hub shortcut in workspace hero
v1.0.66
2026-03-05
- feat(teacher-workspace-bulk-delete): added multi-select bulk delete flow for template list with explicit confirmation modal
- feat(teacher-homework-templates): introduced `POST /teacher/workspace/templates/bulk-delete` with ownership enforcement and aggregated deletion report
- ux(teacher-workspace-toolbar): template bulk actions now include separate bulk clone and bulk delete buttons with live selected-count state
v1.0.65
2026-03-05
- feat(teacher-workspace-bulk-clone): added multi-select template workflow with "Select all" and bulk clone action in saved templates list
- feat(teacher-homework-templates): introduced `POST /teacher/workspace/templates/bulk-clone` to clone multiple source templates to multiple target subjects with ownership/access checks
- ux(teacher-workspace-bulk-clone): added dedicated bulk clone modal with source summary, target subject search, and inline validation for source/target selection
v1.0.64
2026-03-05
- feat(teacher-workspace-clone): added template clone flow to copy one homework template to multiple selected subjects/courses in one action
- feat(teacher-homework-templates): introduced `POST /teacher/workspace/templates/:id/clone` with ownership checks, target-subject access validation, and duplicate-skip guard
- ux(teacher-workspace): added clone modal with subject search/filter, multi-select checklist, and inline validation before submit
v1.0.63
2026-03-05
- feat(schedule-template-capture): added "Save as template" controls to teacher homework modal and custom-deadline modal
- feat(teacher-homework-templates): teacher homework creation routes now support optional auto-save into `teacher_homework_templates` with normalized title/url/scope
- ux(template-title): template title field is revealed only when capture is enabled and auto-prefills from description or selected template
v1.0.62
2026-03-05
- feat(teacher-workspace): added template edit flow with inline modal and prefilled fields for fast updates in teacher workspace
- feat(teacher-homework-templates): introduced template update endpoint (`POST /teacher/workspace/templates/:id/update`) with ownership checks and scoped access validation
- refactor(teacher-template-scope): extracted reusable scope resolver for template create/update to enforce consistent course-subject validation
v1.0.61
2026-03-05
- feat(homework-journal-sync): teacher homework creation routes (`/homework/add`, `/homework/custom`) now trigger immediate journal column sync without waiting for journal page open
- feat(homework-journal-sync): added safe post-create sync helper with grading settings bootstrap and closed-subject guard
- chore(homework-journal-observability): when teacher sync is skipped or fails, activity log now records `homework_journal_sync_skipped` with context
v1.0.60
2026-03-04
- feat(teacher-workspace): added a dedicated teacher workspace page with liquid-glass UI for managing reusable homework templates
- feat(teacher-homework-templates): introduced DB-backed teacher homework templates (`teacher_homework_templates`) with migration, create, and delete flows
- feat(schedule-template-apply): added template quick-apply in class homework modal (auto-filters by subject/course and pre-fills description/links/control/tags)
- ux(teacher-navigation): added "Teacher workspace" entry to desktop topbar, schedule drawer, and mobile menu for teacher role
v1.0.59
2026-03-04
- feat(registration-pathways): introduced structured registration pathways with study track (bachelor/master/teacher), program, and admission year linked to courses
- feat(registration-subject-visibility): added admission-level subject visibility support (`subject_visibility_by_admission`) and connected register-subjects flow to pathway-aware subject selection
- ux(design-system): upgraded global ambient background with animated gradients, subtle mouse-follow spotlight, and reduced-motion fallback
- feat(react-islands): added first React island runtime with footer release pill and integrated it globally through app footer
- ux(teacher-subjects): added quick search in teacher subject selection to speed up finding courses/subjects during onboarding and profile edits
v1.0.58
2026-03-04
- fix(admin-security-analytics): switched visit analytics and security dashboard to system scope for admin role, so data is aggregated across all courses
- fix(admin-recent-visits): eliminated cross-course "Guest" misclassification effect caused by selected-course filtering in security analytics recent visits
- fix(admin-security-recompute): risk recompute in security analytics now processes all active users for admin scope instead of only selected course
v1.0.57
2026-03-04
- fix(register-i18n): localized register validation fallbacks to Ukrainian (consent, full name, password, confirm password, password mismatch)
v1.0.56
2026-03-04
- fix(register-validation-ux): on blur we now validate only the active field without forced refocus, so users can return to PIB/name and edit earlier inputs freely
- fix(register-submit-guard): full step-by-step validation is kept on submit, including password match and consent checks
v1.0.55
2026-03-04
- fix(register-navigation): added explicit back navigation on course selection and preserved selected course when revisiting the step
- fix(register-pending-flow): returning to the first register step now pre-fills pending PIB and updates existing pending account instead of creating duplicates
v1.0.54
2026-03-02
- feat(session-generator-draft-v2): moved session-generator drafts to DB (`session_generator_drafts`) with autosave/restore for manual slot plan across devices and sessions
- feat(session-generator-live): added live conflict API and inline slot-level conflict badges/messages while planning, plus manual "Оновити live-конфлікти" recheck action
- feat(session-generator-bulk): added drag-to-fill bulk assignment mode for exam/consultation/credit across multiple slots and days
- feat(session-generator-filters): added slot-grid filters by teacher, subject, group, and event type for faster manual session planning
- ux(session-generator-blocking-hints): added contextual blocking explanation panel (teacher conflict, duplicate-in-plan, regular-schedule overlap, out-of-window hint)
v1.0.53
2026-03-02
- fix(session-generator-controls): updated consultation button styling in manual session assignment with clear hover feedback and dedicated selected-state color
v1.0.52
2026-03-02
- fix(session-generator-layout): prevented overlap between manual controls and slot grid by making manual type buttons responsive (wrapping text/grid) and constraining both columns with `min-width: 0`
v1.0.51
2026-03-02
- ux(schedule-homework-form): removed "Залік" toggle from regular and custom homework creation forms in schedule modal for a cleaner add-homework flow
- feat(schedule-session-visibility): added explicit session detection from homework descriptions (`[Сесія] ...`) and propagated `session_type`/session meta into schedule data
- ux(schedule-session-cards): session slots in timetable now get dedicated background accent and chip marker by type (Екзамен / Залік / Консультація), plus session marker in class homework modal list
v1.0.50
2026-03-02
- fix(schedule-messages-badge): unread marker on menu button no longer auto-disappears on page load because messages are not auto-marked as read in background
- fix(schedule-messages-badge): split unread-badge sync from message-list loading and keep global unread count stable even when subject filter is active
- fix(schedule-messages-race): added request token guards to prevent stale async responses from hiding/glitching unread chip state
v1.0.49
2026-03-02
- feat(session-generator-types): manual session planner now supports three event types in slots: exam, credit, and consultation
- feat(session-generator-publish): session publish flow now persists consultation events as session timetable items and includes them in duplicate checks/delete flow
- fix(session-generator-journal-sync): session consultations (`[Сесія] Консультація`) are excluded from journal grade column sync so only exam/credit controls create grade columns
v1.0.48
2026-03-02
- fix(admin-course-switch): restored course selector availability on /admin by passing allowCourseSelect to admin template locals, so admin can switch and review other courses/settings again
v1.0.47
2026-03-02
- feat(session-generator-manual): switched session generator to weeks-overlay workflow by default (manual placement on regular timetable slots, e.g. weeks 14-15)
- feat(session-generator-conflicts): added teacher conflict check for manual session plan (same teacher/date/class collisions across schedule/session data) with dedicated "Перевірити конфлікти" action and publish blocking on conflicts
- feat(session-generator-delete): added session delete action for selected session window weeks (removes [Сесія] events and re-syncs journal columns); removed auto-plan fallback from publish
v1.0.46
2026-03-02
- ux(session-generator-cleanup): removed separate "Що буде опубліковано" and "Коротко про логіку" cards to simplify the manual planner screen
- ux(session-generator-cleanup): removed extra "Підказки/сценарії" block and kept a compact publish panel with source + event counter
- ux(session-generator-publish): replaced table-based publish preview UI with lightweight publish state sync (manual plan vs auto plan) while preserving publish behavior
v1.0.45
2026-03-02
- ux(session-generator-settings): adapted settings panel for the new manual slot-based workflow (basic calendar controls first, advanced auto-plan options collapsed)
- ux(session-generator-settings): added dynamic window-mode field switching (days vs weeks) so only relevant inputs are shown and submitted
- tune(session-generator-defaults): updated auto-plan defaults to calmer baseline for manual-first flow (no reserve by default, exam-only sequence, consultations disabled)
v1.0.44
2026-03-02
- feat(session-generator-manual): redesigned session generator with manual slot-based constructor (select exam/credit + subject + group, then click regular schedule slots to assign events)
- feat(session-generator-publish): publish endpoint now accepts `manual_assignments_json` and prioritizes manual plan over auto-preview generation
- ux(session-generator): added interactive publish table syncing with manual slot selections, inline remove actions, and clearer source hint (manual vs auto)
v1.0.43
2026-03-02
- fix(visit-analytics-chart): normalized daily analytics aggregation to UTC date keys (`YYYY-MM-DD`) so chart points match summary totals instead of rendering zeros
- fix(visit-analytics-chart): hardened day-key parsing in API mapper and frontend chart dataset mapping for backward-compatible payload shapes
v1.0.42
2026-03-02
- feat(admin-homework): added bulk delete form action for selected homework IDs in the Homework table
- fix(admin-homework-bulk): bulk action bar is now always visible and includes a dedicated "Delete selected" control
- fix(admin-homework-delete): added scoped /admin/homework/delete-multiple route with subgroup cleanup and attachment file unlink
v1.0.41
2026-03-02
- ux(journal-competency-signals): removed fraction-style score display (e.g. "1 / 5") in competency signal chips and left compact single-value score
v1.0.40
2026-03-02
- fix(session-generator-journal-order): session homework/events ("[Сесія] ...") are now forced to a tail position band and journal column sorting now keeps them pinned at the end, so generated session columns no longer jump to the beginning
v1.0.39
2026-03-02
- fix(admin-template-locals): added unified default locals for admin.ejs and applied them to /admin, /starosta, and /deanery renders to prevent ReferenceError crashes (e.g. teacherRequests/homeworkTags missing in role-specific views)
v1.0.38
2026-03-02
- fix(auth-footer-build-tooltip): enabled global Bootstrap tooltip initialization in design-system so the footer build timestamp hover works on login/register and other pages without local tooltip bootstrapping
v1.0.37
2026-03-02
- fix(student-homework-toggle): schedule modal now hides the "Add homework" form for student-side roles when "Allow student homework" is disabled and shows an inline info state instead
- fix(homework-disabled-ux): /homework/add and /homework/custom now redirect back to /schedule with an error flash instead of returning a blank 403 "Homework disabled" page
v1.0.36
2026-03-02
- fix(homework-submit-access): relaxed student submit/complete access for lecture/general homework by allowing subject-level enrollment fallback with schedule-based lecture detection and legacy NULL semester/week slots
v1.0.35
2026-03-02
- fix(admin-schedule-groups): in normal admin schedule view, fallback now loads a single effective group per subject instead of all groups, preventing all-group pair duplication on the schedule page
v1.0.34
2026-03-02
- fix(teacher-schedule-groups): seminar/lab/practice cards now display concrete group labels ("Група N" or "Групи: ...") instead of forcing "Усі групи" for teachers with all-group access
v1.0.33
2026-03-02
- fix(roles-primary): role grant flow now preserves the user's current primary role when it remains selected, instead of switching primary implicitly
- fix(session-role-stability): session legacy role now stays on the current role when still assigned, preventing accidental homepage mode flips after role updates
- fix(my-day-view): users with teacher+deanery keep teacher My Day layout so adding deanery to teacher does not replace teacher blocks
v1.0.32
2026-03-02
- fix(homework-teacher-slot): when teacher creates homework from a lecture/general class slot, records are now created for all teacher-accessible groups, not only a single schedule row group
- fix(schedule-homework-lookup): student schedule homework target builder now keeps lecture-slot groups so shared lecture homework is not dropped by strict student-group filtering
- fix(schedule-homework-ui): lecture cards now use slot-level homework fallback for chip/meta and modal list when strict group match returns empty
v1.0.31
2026-03-02
- fix(schedule-viewas-mobile): when admin uses student self-view without assigned student_groups, fallback now targets one valid group per subject instead of expanding to all groups
- fix(schedule-homework-visibility): added slot-level homework meta fallback for admin/view-as so teacher homework chips and modal entries appear even if stored group differs
- fix(admin-teacher-requests): approve/reject now resolve user by id and validate existing teacher_request, preventing false "User not found" on cross-course requests
v1.0.30
2026-02-28
- ux(journal-light-theme): increased contrast for text, chips, table headers, and grade cells in light theme
- fix(journal-light-theme): status chips (success/warning/danger) now use readable dark text and stronger borders
- ux(journal): improved light-theme card/table surfaces and success alert readability
v1.0.29
2026-02-28
- feat(session-generator): credit events now try to use real schedule slots of the same subject/group on that weekday
- fix(session-generator): if no same-day slot exists for a credit, publish now falls back to the class time of the latest known pair for that subject/group
- fix(session-generator): credit class_date is normalized to date-only during publish to avoid duplicate/match inconsistencies
v1.0.28
2026-02-28
- fix(schedule-admin): in admin view-as=self mode with empty student_groups, schedule now falls back to all subject groups for the course so class-level homework is visible
- fix(schedule-homework): normalized day/date matching and added legacy key fallback so homework marker chips and modal items resolve reliably
- ux(admin-homework): added "Перейти до ДЗ" quick action button in the admin Homework section
v1.0.27
2026-02-28
- fix(analytics-chart): added automatic fallback to include-admin analytics data when "Без адмінів" filter returns an empty dataset
- ux(analytics): visit chart/cards/top pages/roles now show fallback stats with a clear hint instead of rendering a flat zero chart
v1.0.26
2026-02-28
- fix(admin-topbar): forced theme toggle button to keep strict 1:1 circle geometry (min/max size + fixed flex-basis) so it no longer appears squashed
v1.0.25
2026-02-28
- ux(admin-light-theme): increased light theme contrast for muted text and health/security cards on admin dashboard
- fix(admin-toasts): improved success/error toast readability in light theme (stronger text and border contrast)
- fix(session-generator-route): added compatibility redirects for /admin/session-generator/ and /admin/session-generator/index to canonical /admin/session-generator
v1.0.24
2026-02-28
- ux(schedule): removed numeric fraction from week carousel pill and kept only the current week label
v1.0.23
2026-02-28
- perf(admin-roles): optimized role-change confirm modal typing by disabling heavy backdrop blur while the modal is open
- ux(admin-roles): improved confirmation input responsiveness with uppercase normalization, immediate button state sync, and Enter-to-confirm support
v1.0.22
2026-02-28
- feat(session-generator): added one-click publish flow that creates session exams/credits in homework schedule slots and skips duplicates safely
- feat(journal): publishing session credits now auto-syncs and creates empty subject journal columns for credit control points
- ux(session-generator): simplified generator page by removing local slot planner/heuristic debug blocks and replacing them with a clear publish preview table
- fix(schedule-admin): admins now see teacher homework in regular schedule view by loading all course subject-group targets when not in view-as mode
- ux(schedule): added red credit highlight for schedule cards with published credit events
v1.0.21
2026-02-28
- fix(schedule-list): switched dropdowns to native select rendering to remove repeated chevron tiling artifacts
- feat(schedule-list): added footer Changelog trigger and release modal to the schedule list page
v1.0.20
2026-02-27
- feat(journal): added reopen-subject flow after closure with full journal unlock (subject state + locked columns) and activity log event
- ux(journal): added "Відкрити предмет" action for closed subjects and updated closure confirmation copy to reflect reversible flow
- feat(deanery): added deanery monitoring snapshot for courses/subjects (closure status, locked columns, homework and student coverage) on /deanery
- ux(generators): removed visible draft wording in session/schedule generator controls (renamed to plan labels)
v1.0.19
2026-02-26
- feat(session-generator): added configurable session event scenarios (exam/credit flows) including minimal credit-only and consult+exam+credit chains
- feat(session-generator): added session window mode by semester weeks (custom week set or last N weeks) with session-week highlighting logic
- feat(session-generator): added free-slot planner board based on current schedule entries with click-to-assign local slot selection for session events
- ux(session-generator): removed "Що ще уточнити" prompt block and replaced it with actionable session scenario controls and concept summary
v1.0.18
2026-02-26
- feat(session-generator): added session-scoped draft controls in Session Generator (new draft, clear draft, draft switcher) with persisted form settings in admin session
- ux(session-generator): removed draft wording from generator navigation labels and aligned naming to "Генератор сесій" / "Генератор розкладу"
- ux(admin-generators): renamed admin generator section to "Генератори" and updated quick links/buttons for both schedule and session generators
v1.0.17
2026-02-25
- feat(session-generator): added a separate admin draft Session Generator page with heuristic exam/credit timeline preview
- ux(session-generator): introduced special session marks legend (EX/CR/DIF/CONS/RES/RET/OPT/Gx/CAP) with liquid-glass timeline cards and analytics chips
- ux(admin-generator-nav): added quick links to open the draft Session Generator from Admin and Semester Generator pages
v1.0.16
2026-02-23
- ux(menu-drawer): extend desktop drawer shell height further (near edge-to-edge viewport) across shared and page parity styles
v1.0.15
2026-02-23
- ux(menu-drawer): push desktop drawer shell even closer to full-height viewport (~98%) across shared and page parity styles
v1.0.14
2026-02-23
- ux(menu-drawer): increase desktop drawer shell height to about 95% viewport across shared and page parity styles
v1.0.13
2026-02-23
- ux(menu-drawer): stretch desktop drawer height to near full viewport across shared, Home and Schedule parity styles
v1.0.12
2026-02-23
- ux(menu-drawer): raise desktop drawer shell closer to topbar across pages
- ux(topbar): make title underline stripe thinner and softer
v1.0.11
2026-02-23
- fix(schedule-menu): restore `page-schedule` body class so Schedule drawer parity overrides apply
- ux(topbar): replace curved title underline with centered capsule highlight and soft pulse animation
v1.0.10
2026-02-23
- ux(schedule-menu): force full drawer parity with Home/Journal by duplicating final drawer shell and item styles in schedule page CSS
v1.0.09
2026-02-23
- ux(schedule-menu): match Schedule desktop drawer visual and animation to Journal/My Day and keep overlay behavior (no content shift)
v1.0.08
2026-02-23
- ux(menu-drawer): make Schedule and My Day desktop drawer match Journal visual style and open animation
- ux(schedule,my-day): disable content shift while desktop drawer is open for Journal-like overlay behavior
v1.0.07
2026-02-23
- fix(topbar): enforce exactly one menu button per breakpoint across all topbar pages (desktop drawer vs mobile modal)
- ux(menu-drawer): unify desktop drawer visuals and open animation across Journal, Subjects, Teamwork, Profile, Schedule and My Day
v1.0.06
2026-02-23
- fix(topbar): enforce one menu button per breakpoint in Journal and Subjects (desktop drawer vs mobile menu)
v1.0.05
2026-02-23
- ux(topbar): refine title spotlight into cleaner capsule highlight with softer glow
v1.0.04
2026-02-23
- ux(topbar): unify shared menu/topbar visuals across pages to match Journal styling
v1.0.03
2026-02-23
- ux(topbar): straighten title spotlight underline and reduce curved glow artifacts
- chore(versioning): normalize recent topbar release versions from 0.10.xx to 1.0.xx
v1.0.02
2026-02-23
- fix(topbar): hide mobile menu button on desktop to prevent duplicate menu icons in Journal and Subjects
v1.0.01
2026-02-23
- ux(topbar): add subtle gradient background tint behind the title spotlight underline
v1.0.00
2026-02-23
- ux(topbar): keep only a subtle liquid-glass spotlight underline under the page title
v0.9.x 100 релізів ›
v0.9.99
2026-02-22
- ux(menu-desktop): added the same drawer menu to Journal, Teamwork, Subjects, and Profile pages with a shared reusable partial
- ux(menu-mobile-subjects): unified Subjects mobile menu with the full navigation menu used on other pages
- fix(menu-hover): normalized blue hover/focus highlight styles for drawer actions so all menu items highlight consistently
- fix(home-welcome): moved the post-registration welcome modal to /home and refreshed its onboarding text for the new Home dashboard
- ux(home-role-layouts): admin Home now uses the same student-style block composition, while teacher Home is simplified to three blocks (classes+reminders, competency compass, review queue)
- ux(home-teacher-competency): teacher competency compass now supports selecting a taught subject directly on /home
- copy(home-welcome): refined the Home welcome modal text to emphasize Studerria as a student-built platform for students
- fix(admin-dark-dropdowns): normalized dark-theme dropdown menu/button colors in Users actions so labels and hover states stay readable
- fix(home-dark-select): forced dark native dropdown styling for Home select controls (What-if / subject pickers) to prevent bright popups in dark theme
- feat(competencies-hybrid): added auto competency source support with source_ref idempotency for first-time homework submissions (+1/+0 for self_organization based on on-time status)
- ux(home-competency-compass): competency compass now shows manual vs auto signal counts in the UI
- refactor(my-day): removed unused heuristic competency profile code path that was not applied to the compass output
- fix(academic-week-timezone): academic week rollover now uses Europe/Kyiv calendar date so week changes at 00:00 Kyiv time instead of UTC
- fix(security-analytics-scheduler): hardened scheduler interval resolver against init-order issues and clear legacy runtime incident signature before scheduler startup
- fix(security-analytics-incidents): suppress legacy resolveSchedulerIntervalMs runtime signature from incident feed/system-health summaries and remove direct resolver symbol dependency
- fix(menu-partials): desktop/mobile drawer menu partials now safely handle missing viewAs/settings/customAdmin locals on Journal, Teamwork, Subjects and Profile pages
v0.9.98
2026-02-22
- ux(home-student-layout): reordered student Home blocks to deadlines/classes -> competency compass -> pulse/inbox -> reminders
v0.9.97
2026-02-22
- fix(home-footer): initialized Bootstrap tooltips on Home page so the footer build hover info appears
- ux(home-light-theme): tweaked Changelog modal background and header/footer surfaces in light theme for cleaner contrast
v0.9.96
2026-02-22
- fix(my-day-layout): reminders card now renders as the last student block on Home (replaced invalid order-6 utility with valid order-last)
v0.9.95
2026-02-22
- ux(menu-home-schedule): reordered student menu items on Home and Schedule drawers to a consistent navigation order (home/schedule, journal, teamwork, subjects, weird deadlines, messages, profile, theme, logout)
- ux(menu): added emoji icons to drawer and mobile menu actions, including themed label text for the theme toggle
v0.9.94
2026-02-22
- fix(my-day-next-classes): on Sunday, nearest classes now correctly resolve Monday from the next academic week instead of the past Monday of the current week
v0.9.93
2026-02-22
- ux(my-day): styled Leadership Brief week label as a colored oval chip to match the Schedule week badge look
v0.9.92
2026-02-22
- ux(my-day): moved reminders into a separate dashboard card instead of nesting them inside "Пульс та інбокс"
- ux(my-day): added standalone reminder block styling so reminders keep the same controls without extra nested separator spacing
v0.9.91
2026-02-22
- ux(my-day-student): made competency compass more compact with smaller orb, tighter insight cards, and denser spacing
- ux(my-day-student): switched competency rows to a two-column desktop layout with mobile/tablet fallback to a single column
v0.9.90
2026-02-22
- ux(home-url): switched My Day page links to canonical /home route ("Головна") while keeping /my-day as backward-compatible redirect
- ux(auth): login success, student registration completion, and authenticated root/login entry now open /home as the first landing page
v0.9.89
2026-02-22
- ux(my-day-student): merged "Найближчі дедлайни" and "Пари найближчим часом" into one combined dashboard card with two panes
- ux(my-day-student): added adaptive dual-pane layout (desktop side-by-side, tablet/mobile stacked) for deadlines/classes block
v0.9.88
2026-02-21
- ux(my-day): renamed page title from "Studeria Cockpit" to "Головна" in topbar and browser title to "Studerria"
- ux(menu): increased drawer menu item spacing/padding in Schedule and My Day for roomier navigation
- ux(menu): renamed "Мій день" menu entry to "Головна" in Schedule drawer and shared mobile menu
v0.9.87
2026-02-21
- ux(my-day-student): reordered student dashboard blocks to deadlines -> competency compass -> upcoming classes -> pulse/inbox
- ux(my-day-student): temporarily hid "Прогрес і ризик" block for student view while keeping Leadership Brief position unchanged
v0.9.86
2026-02-21
- ux(my-day-menu): replaced self-link "Мій день" with "Розклад" in My Day desktop drawer menu
v0.9.85
2026-02-21
- fix(theme-overscroll): set root html/body background color from theme tokens so overscroll swipe area no longer shows white outside page bounds
- ux(theme): page edge bounce now keeps dark/light app background continuity across screens using design-system base styles
v0.9.84
2026-02-21
- ux(my-day-menu): matched desktop drawer menu item set/order with Schedule (added messages, weird deadlines, self-link; removed separate back-to-schedule row)
- ux(my-day-menu): My Day drawer now mirrors Schedule menu structure for consistent navigation between pages
v0.9.83
2026-02-21
- fix(my-day-menu): desktop ☰ button now opens a left drawer menu like Schedule instead of the mobile modal
- ux(my-day-menu): added schedule-style drawer panel with close button and actions for desktop widths while keeping mobile modal behavior on small screens
- fix(my-day-topbar): split My Day menu trigger into desktop drawer button and mobile modal button to match responsive behavior from Schedule
v0.9.82
2026-02-21
- ux(my-day-topbar): replaced separate theme/back buttons with a single menu (☰) trigger in My Day header
- ux(my-day-topbar): restored compact role+username label next to the menu button to match other pages and target menu layout
v0.9.81
2026-02-21
- fix(journal-close): close subject transaction now uses SAVEPOINT-based compatibility steps so fallback SQL no longer aborts the whole transaction
- fix(journal-close): subject_grading_settings close upsert now tries boolean is_closed first (TRUE) with integer fallback for legacy schemas
- fix(journal-close): prevented Cloud SQL error "column is_closed is of type boolean but expression is of type integer" during close action
v0.9.80
2026-02-21
- fix(admin-data-quality): diagnostics now degrade per-check with partial fallback payloads instead of collapsing to full Unavailable state
- fix(admin-data-quality): endpoint now tolerates active-semester lookup incompatibilities and still returns best-effort diagnostics
- fix(journal-close): subject close now uses multi-step legacy SQL fallback when locking journal columns (semester/archive/lock metadata compatibility) to avoid Database error on close action
v0.9.79
2026-02-21
- fix(my-day-changelog): loaded shared design-system styles on My Day so changelog modal uses correct contrast and liquid sheet styling
- fix(footer-partial): app footer now supports optional extra class for consistent dock style on specific pages
- fix(login-footer): applied shared glass-dock footer meta style on login page and removed local footer overrides
v0.9.78
2026-02-21
- fix(admin-data-quality): endpoint now always returns safe unavailable payload instead of surfacing fetch errors in Security Analytics
- fix(admin-data-quality-ui): removed error toast spam when data-quality cannot be loaded and kept inline unavailable state only
- fix(incident-center): hardened scheduler startup interval resolution and auto-cleared stale schedulerIntervalMs runtime incidents
- chore(schedule-ui): archived Day/Week/Month mode switch from schedule page and pinned view to week mode
- feat(my-day-competency): switched competency details to mark counts (not percent), with zeroed detail rows when no marks exist
- feat(my-day-competency): competency orb now recalculates segment sizes from live mark distribution and uses equal neutral split when empty
v0.9.77
2026-02-21
- fix(journal-cell): switched modal async form submit to URL-encoded payloads so /journal handlers receive req.body and no longer crash on column_id
- fix(journal-appeals): wired create/update appeal forms to async save + immediate cell refresh for teacher and student flows
- fix(schedule-generator-publish): preview always shows confirm_phrase input; button enforces typed PUBLISH only when backend marks overwrite confirmation as required
- fix(security-analytics): cast legacy text created_at values to timestamptz in security recompute/dashboard queries to prevent operator mismatch errors
- fix(admin-data-quality): /admin/data-quality.json now returns a safe unavailable payload for compatibility errors instead of HTTP 500
- fix(forms): parseBinaryFlag now supports repeated form fields (array values) from hidden+checkbox inputs
v0.9.76
2026-02-21
- fix(my-day): deadlines now show who added homework and keep the submit action available for repeat submissions
- fix(schedule-weird-deadlines): added "Додав" metadata for custom deadline cards in weekly and weekend blocks
- fix(journal-competencies): removed manual 0-5 competency form, leaving only +1/+0 checklist mode
- fix(journal-competencies): checklist save now runs via fetch and instantly refreshes the opened journal cell data
- fix(journal-retakes): retake create/update forms now submit via fetch and refresh the current journal cell without full page reload
- fix(journal-db): switched key journal matrix/attendance queries from dynamic IN placeholders to ANY(int[]) to prevent bind-parameter mismatches
- fix(journal-dark): restyled journal cell modal container for theme-dark (content/background/borders/close icon)
- fix(schedule-generator-publish): publish validation errors now redirect back to preview (with message) so Type PUBLISH input is visible
v0.9.75
2026-02-20
- feat(system-settings): added "My Day: студентські ДЗ у дедлайнах" toggle in Admin -> System Settings (Homework block)
- feat(my-day): deadline feed now always includes teacher homework and conditionally includes student-created homework based on the new system toggle
v0.9.74
2026-02-20
- fix(journal-dark): forced dark bootstrap table variables for attendance tables to remove white cell backgrounds in theme-dark
- fix(journal-attendance-ui): restored readable contrast for attendance headers/cells in dark mode
v0.9.73
2026-02-20
- fix(journal): fixed /journal SQL bind mismatch in current-slot attendance lookup by passing group params only when group filter is present
- fix(journal): resolved Cloud Run error "bind message supplies 8 parameters, prepared statement requires 5" for all-groups journal subjects
v0.9.72
2026-02-20
- fix(journal): switched /journal rendering to callback-based safe render so EJS/runtime render failures no longer bubble into uncaught 500 responses
- fix(journal-compat): added plain compatibility fallback response + broader legacy DB error detection for schema/data-shape mismatches
v0.9.71
2026-02-20
- fix(journal-compat): expanded legacy DB compatibility detector for journal queries (includes type/constraint mismatch codes like 42P10, 42883, 42804)
- fix(journal): added last-resort compatibility render path for `/journal` so requests do not return 500 when DB schema is partially outdated
v0.9.70
2026-02-20
- fix(journal-page): added schema-compatibility fallback so Journal page no longer crashes with `Database error (journal.page)` on legacy DB structures
- fix(journal-compat): guarded grading/columns/attendance queries against missing legacy tables or columns (`42P01`/`42703`) and render baseline journal data instead
v0.9.69
2026-02-20
- fix(admin-users): restored Active/Inactive/All status switch in Users tab
- fix(admin-users): /admin/users.json now applies `status` filter, so inactive users can be opened and managed from Users tab
v0.9.68
2026-02-20
- fix(admin-users): removed inactive/all status switch from Users tab so this section stays active-only
- fix(admin-users): added extra front-end guard to hide inactive rows even if they appear in a payload
v0.9.67
2026-02-20
- fix(admin-data-quality): added legacy-schema fallback for `/admin/data-quality.json` so missing tables/columns no longer break the endpoint
- fix(admin-security-analytics): Data Quality card now renders explicit "Unavailable" state without error toast when diagnostics are not supported by current DB schema
v0.9.66
2026-02-20
- fix(my-day-footer): restyled My Day footer metadata block to compact glass-pill layout (v/build/changelog) matching other pages
- fix(my-day-footer): removed default button look for build/changelog controls and restored consistent hover/contrast in dark and light themes
v0.9.65
2026-02-20
- fix(deploy): restored missing closure lines around scheduler/admin settings block in app.js that caused "Unexpected end of input" on startup
- fix(cloud-run): unblocked container boot so service can bind to PORT and pass startup health checks again
v0.9.64
2026-02-20
- fix(my-day-footer): removed page-level footer overrides on My Day so footer now uses unified design-system styling and correct theme contrast
- fix(my-day-footer): restored consistent app-footer spacing/border behavior with other platform pages
v0.9.63
2026-02-20
- feat(journal-competencies): added quick competency checklist in journal cell modal with 8 checkboxes and +1/+0 scoring model
- feat(api): added POST /journal/competency/checklist/save to persist checklist snapshots per student and column
- feat(journal-competencies): modal now preloads latest checklist values so teachers can review and edit competency marks in place
- ux(journal-competencies): competency signal history now labels checklist entries as +1/+0 with 1-point scale
v0.9.62
2026-02-20
- feat(journal-attendance): added quick attendance actions in journal with a dedicated block for current class, selected class, and editor toggle
- feat(journal-attendance): implemented one-student-at-a-time attendance modal with statuses present/absent/excused and automatic step-by-step progression
- feat(journal-attendance): teachers can now jump from "current class" detection to instant attendance marking using schedule + bell-time matching
- ux(journal-attendance): attendance editor is now collapsible and accessible from the same block for review and post-marking corrections
v0.9.61
2026-02-20
- feat(admin-activity): added activity points reset controls in Activity Log for course-wide reset and per-user reset
- feat(api): added POST /admin/activity/reset-points with course-scoped permission checks and active-semester awareness
- feat(activity-points): introduced `activity_points_adjust` entries so point resets keep audit history instead of deleting logs
- audit(admin): added history_log actions `activity_points_reset_course` and `activity_points_reset_user` with reset metadata
v0.9.60
2026-02-20
- fix(messages-send): all-course broadcast now creates one global message instead of duplicating one DB row per course
- fix(messages-feed): /messages.json now includes global broadcasts with NULL course/semester scope for all eligible users
- fix(admin-messages): admin/starosta message lists now show global broadcasts alongside course-scoped messages
- fix(admin-message-reads): reads endpoint now resolves global broadcasts (NULL course/semester) in current course context
- ux(admin-messages): clarified target selector labels/hints for current course vs all courses vs specific users
v0.9.59
2026-02-20
- feat(admin-security-analytics): renamed admin Visit Analytics section to Security analytics in sidebar and panel header
- feat(security-dashboard): added risk scan action button in admin Security dashboard to recompute suspicious-account signals on demand
- feat(security-dashboard): added configurable auto-refresh controls (1/3/5/10 min) with persistent local setting and live status line
- feat(api): added POST /admin/security-dashboard/recompute to batch recompute security cases for active users in current course scope
- ux(security-dashboard): highlighted high-risk/watch rows in suspicious accounts table for faster visual triage
v0.9.58
2026-02-20
- fix(admin-visit-analytics): repaired SLA renderer crash caused by invalid Array.isArray usage, restoring visit chart/top pages/roles/recent blocks
- fix(admin-data-quality): restored checks table rendering (rows now read from payload array instead of boolean result)
- fix(system-health): removed stray scheduler route closures that caused runtime "schedulerIntervalMs is not defined" incidents
- improvement(system-health): refined open-incident window to 2 hours so stale one-off errors do not remain marked as open all day
- hardening(admin-visit-analytics): SLA render failures are now isolated and no longer reset all visit analytics widgets
v0.9.57
2026-02-20
- fix(journal): inactive students are now excluded from journal student resolution across cell view, grade actions, retakes, appeals, moderation and competency updates
- fix(teamwork): inactive users are hidden from teamwork member/free-student lists and excluded from new task random distribution
- fix(teamwork): group capacity checks now count only active members, preventing inactive accounts from occupying seats
- fix(admin-users): users/students lists (including `/admin/users.json` and starosta users feed) are now active-only
v0.9.56
2026-02-20
- fix(admin-ui): removed floating "Зберегти все" button in admin panel to avoid misleading bulk-save behavior when section-level Save buttons are used
- chore(admin-ui): deleted unused save-all tracking/submission client code tied to the removed global button
v0.9.55
2026-02-20
- fix(schedule-list-ui): eliminated repeated chevron tiling in dropdowns by avoiding `background` shorthand resets on themed `.form-select` styles
- fix(schedule-list-ui): normalized select rendering with explicit `-webkit-appearance`/`-moz-appearance`, so each dropdown shows a single arrow and stable background
v0.9.54
2026-02-20
- fix(security-dashboard): cast `login_history.created_at` from TEXT to timestamp in security analytics queries to prevent `/admin/security-dashboard.json` failure
- fix(security-dashboard): restored loading of top suspicious IP/device blocks on databases with legacy login_history schema
v0.9.53
2026-02-20
- feat(security-admin): added full Security dashboard in Admin Visit Analytics (risk cases, open alerts, top suspicious IPs/devices, overdue SLA counters)
- feat(users-forensics): user modal now includes editable risk-case controls (normal/watch/high-risk, status, reason, resolution), active-session listing/revoke-all, and account-link graph
- feat(step-up): enforced interactive step-up in UI for critical role reassignment (`ROLE`) and journal bulk grading (`BULK`), plus typed confirm propagation for finalize actions
- fix(system-settings): settings persistence now runs in a transaction with awaited writes, which fixes non-saved fields (including admin IP allowlist)
- fix(system-settings-ui): added missing security settings fields (auto-quarantine, IP retention, device retention) to Admin System Settings form
- fix(visit-analytics): recent visits now include course-scoped rows with `course_id IS NULL` fallback to prevent empty "Останні візити" block
- fix(forensics-api): `/admin/users/:id/forensics.json` now returns recalculated `security_case` state and graph payload for immediate modal rendering
v0.9.52
2026-02-20
- fix(system-settings): settings save now posts as URL-encoded payload instead of multipart FormData, so backend correctly receives all fields including admin IP allowlist
- fix(system-settings): backend save handler now safely handles missing/invalid req.body object and no longer throws TypeError on malformed requests
- fix(system-settings): admin IP allowlist persistence is restored for async Save flow
v0.9.51
2026-02-20
- fix(system-settings): save request now safely parses non-JSON responses on frontend to avoid "Unexpected token ... is not valid JSON" crash toast
- fix(api-errors): database/unhandled errors now return JSON for requests with `Accept: application/json` instead of plain text stack
- ux(system-settings): save flow now surfaces real backend error message instead of JSON parse exception
v0.9.50
2026-02-20
- fix(visit-tracking): admin/deanery/starosta visits now always resolve course_id via selected course/session fallback, so "Останні візити" is no longer empty because of null course scope
- fix(visit-analytics): staff-route tracking now respects `?course=...` and session adminCourse consistently for event writes
- fix(system-health): normalized DB init status mapping to `ok|fail|starting` (removed stale `ready` check) in `/_health` and `/admin/system-health.json`
v0.9.49
2026-02-20
- fix(system-settings): settings save is now backward-compatible when security fields are missing (fallbacks to cached values instead of Invalid settings)
- fix(system-settings): security allowlist value is preserved if older/stale form does not send textarea field
- fix(teamwork-settings): min team members input now allows value 1 in System Settings UI
v0.9.48
2026-02-20
- fix(visit-analytics): recent visits now fallback to unfiltered rows when "Без адмінів" yields empty list, so the block is never blank while there are real visits
- ux(visit-analytics): added inline hint in recent visits block to explain when fallback with admin visits is shown
- feat(api): /admin/visit-analytics.json now returns recent_fallback and recent_is_fallback for resilient rendering of recent visits table
v0.9.47
2026-02-20
- feat(security-settings): added admin IP allowlist and registration-anomaly controls (threshold/window) in System Settings with audit+rollback support
- feat(forensics): account forensics now ignores allowlisted IPs, exposes ignored IPs separately, and returns risk status/reasons with recent security alert count
- feat(security-alerts): registration flow now emits deduplicated security incidents for multi-account IP/session/fingerprint patterns (excluded for allowlisted admin IPs)
- ux(admin-users): user modal now shows forensics risk badge, ignored-IP indicator, and alert counter for faster suspicious-account triage
- feat(system-health): incident severity map now treats security events as high priority
v0.9.46
2026-02-20
- fix(admin-visit-analytics): hardened recent visits renderer with full HTML escaping for user/role/page/path fields to prevent row breakage by malformed data
- fix(admin-visit-analytics): improved recent visits date parsing fallback so invalid timestamps no longer break table rendering
v0.9.45
2026-02-20
- fix(admin-users): user modal now fills Last Login IP/Device from registration trace when login has not happened yet
- fix(admin-users): users list API and initial admin render now fallback to latest registration IP/user-agent for immediate display without full login
- ux(forensics): modal now auto-populates Last Login timestamp with register-event time when login timestamp is missing
v0.9.44
2026-02-20
- feat(admin-users): added account forensics panel in user modal with probable owner detection and confidence scoring
- feat(api): added /admin/users/:id/forensics.json with matching by shared session/IP/device across login history, visit events, and registration footprint
- feat(security): registration flow now stores dedicated registration events (IP, user-agent fingerprint, session) via migration 028_user_registration_events
- fix(auth-audit): login IP/user-agent normalization now uses forwarded client IP resolver for more stable tracking
v0.9.43
2026-02-20
- ci: removed remaining GitHub Actions workflow to fully disable GitHub-side CI/CD runs
- ops: prepared repository for Cloud Build-only deployment path (no GitHub deploy secrets required)
v0.9.42
2026-02-20
- ci: disabled automatic GitHub Actions runs on push (manual запуск only)
- ci: removed GitHub-based GCP deploy steps to avoid duplicate pipeline and extra GitHub usage
v0.9.41
2026-02-20
- ci(deploy): added preflight validation for required deploy secrets (project/region/service)
- ci(deploy): made Cloud SQL flags conditional so deploy no longer fails when INSTANCE_CONNECTION_NAME is empty
v0.9.40
2026-02-20
- ci(deploy): switched GitHub Actions GCP auth from service-account key to Workload Identity Federation (OIDC)
- ci(deploy): added workflow permissions for OIDC token issuance (id-token: write)
v0.9.39
2026-02-20
- fix(ci): unblocked `Test` stage in GitHub Actions by replacing placeholder failing `npm test` script with non-failing message
- chore(release): patch version bump for successful deploy pipeline rerun
v0.9.38
2026-02-20
- fix(ci): unblocked GitHub Actions lint step by excluding `eslint.config.js` from lint target set
- chore(release): patch version bump for deploy retrigger
v0.9.37
2026-02-20
- feat(journal-moderation): added second-reviewer workflow for exam/credit cells with pending/approved/adjusted/rejected states and score override support
- feat(api): added `POST /journal/moderation/update` and `POST /journal/competency/add` with full journal scope checks, subject-close guards, and audit activity logging
- feat(journal-ui): extended cell modal with moderation panel and competency signals panel (history + quick add form) for teacher/admin/deanery flows
- feat(competencies): added migration `027_journal_moderation_competencies` with `journal_grade_moderations` and `competency_evaluations` tables + indexes
- feat(my-day): competency profile now consumes real competency signals (student personal profile and staff cohort scope) with heuristic fallback when signals are missing
- fix(calculations): My Day grade vectors and what-if forecast now respect moderated adjusted scores instead of only raw journal grades
- feat(admin-overview): added Course Pulse card with risk/SLA/attendance KPIs and per-subject pulse table
v0.9.36
2026-02-20
- feat(admin-data-quality): added Data quality block inside Visit Analytics with live counters, severity status, and issue table with examples
- feat(api): added `/admin/data-quality.json` endpoint with diagnostics for duplicate teacher homework, orphan homework columns, invalid group mappings, and grading weight mismatches
- feat(admin-analytics): wired data-quality refresh into the Visit Analytics panel open/refresh flow and dark-theme-safe sample row styling
v0.9.35
2026-02-20
- feat(admin-semesters): added `Finalize semester` action (archive semester + lock all non-archived journal columns for that semester)
- feat(admin-semesters): finalize now generates backup CSV snapshots for semester journals (per-subject detailed files + summary + manifest in uploads/semester-archives)
- feat(admin-semesters): added `/admin/semesters/archive-export/:id` to download latest semester archive summary CSV directly from semesters dropdown
- feat(audit): added `semester_finalize` action/activity logging with generated archive metadata (subjects/students counters + file paths)
v0.9.34
2026-02-20
- feat(journal-template): added `Імпортувати шаблон` action in journal grading settings to clone manual columns from previous semester in one click
- feat(api): added `POST /journal/template/import-previous` with teacher scope checks, subject-closed guard, and previous-semester lookup by course timeline
- feat(journal-template): import is deduplicated by column fingerprint (title/type/max/final/credit) and preserves include-in-final, type, max points, and credit ordering
- feat(audit): added `journal_template_import_previous` activity log entry with imported/skipped counters and source semester metadata
v0.9.33
2026-02-20
- feat(journal-closure): added semester subject closure flow via `/journal/subject/close` with grade freeze + statement CSV export
- feat(journal-closure): added `/journal/subject/close-export` and persisted closure audit/export events in `journal_subject_close_events`
- feat(journal): enforced subject-closed guard across grade mutations (save/bulk/delete/restore, retakes, appeals, column toggles, config/column create) and returned read-only flags in `/journal/cell.json`
- feat(journal-ui): added closure status/actions in journal header and split attendance edit mode from grading edit mode (`canEditAttendance`)
- feat(db): added migration `026_journal_subject_closure` and wired it into migration index
v0.9.32
2026-02-20
- feat(admin-incident): added Incident center block in Admin Visit Analytics (open/critical/high/unique counters + incident table)
- feat(api): /admin/system-health.json now returns incidents feed aggregated from runtime telemetry (severity, first/last seen, count)
- feat(ops): added incident aggregation logic with severity mapping and 72-hour incident window for degradation visibility
v0.9.31
2026-02-20
- feat(admin-health): added System health block in Admin Visit Analytics with runtime, DB/session/scheduler statuses, migration state, and recent error insights
- feat(api): added /admin/system-health.json endpoint with health snapshot (uptime/memory, migrations applied vs pending, scheduler metrics, runtime error summary)
- feat(telemetry): started in-memory runtime error tracking for DB/session/scheduler/unhandled errors to power Health dashboard diagnostics
v0.9.30
2026-02-20
- feat(admin-analytics): added Homework Review SLA panel in Visit Analytics with overdue/ungraded metrics and per-subject backlog table
- feat(api): /admin/visit-analytics.json now returns homework_sla payload (threshold, totals, risk subjects, max wait, subject rows)
- feat(scope): Homework SLA data is role-scoped via Role Studio access (teacher sees assigned subjects, deanery/admin see full course scope)
v0.9.29
2026-02-20
- feat(admin-audit): added audit trail storage for System Settings and Role Studio changes with snapshots before/after
- feat(admin-audit-api): added /admin/audit/settings.json and /admin/audit/role-studio.json endpoints for latest change history
- feat(admin-rollback): added rollback actions for settings, legacy role permissions, and RBAC roles (create/update/delete)
- feat(db): added migration 025_admin_change_audit with indexed admin_change_audit table and rollback metadata
- ux(admin): added Audit + rollback panels in Admin Settings and Role Studio with one-click rollback controls
v0.9.28
2026-02-20
- feat(journal-appeals): added grade appeal flow in journal cell modal with student submission form, timeline cards, SLA indicator, and decision history
- feat(api): added `/journal/appeals/create` and `/journal/appeals/update` endpoints with role-aware access checks, group scope validation, and locked-column protection
- feat(journal-cell): extended `/journal/cell.json` with appeals payload (`appeals`, `appeal_meta`, `can_create_appeals`, `can_manage_appeals`)
- feat(db): added migration `024_journal_grade_appeals` (`journal_grade_appeals` table, single-open-appeal guard, SLA/status indexes)
- feat(journal): approved appeal can optionally sync resolved score back into `journal_grades` directly from appeal review form
v0.9.27
2026-02-20
- feat(journal-retakes): added `Перездачі / Відпрацювання` flow in journal cell modal with attempt timeline, statuses, deadlines, and per-attempt teacher notes/comments
- feat(api): added `/journal/retakes/create` and `/journal/retakes/update` endpoints with subject/group access checks and locked-column protection
- feat(journal-cell): extended `/journal/cell.json` payload with retake metadata, attempt list, and manage permissions for role-aware rendering
- feat(db): added migration `023_journal_retake_attempts` (`journal_retake_attempts` table + uniqueness/lookup indexes + single-final-attempt guard)
- feat(journal): when a graded retake is marked `Врахувати у фіналі`, score is synced into `journal_grades` as the active cell grade source
v0.9.26
2026-02-20
- feat(my-day): added `Прогрес і ризик` student dashboard block with per-subject forecast, admission-risk level, and compact progress bars
- feat(my-day-data): extended cockpit payload with `progress_dashboard` based on weighted journal forecast (`current` vs `max reachable`) and per-subject on-time submission share
- feat(my-day): added quick `What-if` jump from risk rows to subject calculator and direct journal link for each subject
- feat(api): added `/api/my-day/progress-risk` endpoint for progress/risk dashboard data
v0.9.25
2026-02-20
- feat(attendance): added Attendance MVP in journal with per-class marking flow (`присутній`, `запізнення`, `відсутній`, `поважна причина`) and optional reason/comment
- feat(journal): added attendance context controls by date and class number, plus student read-only attendance summary and recent records in subject journal
- feat(api): added `/journal/attendance/save` with journal-role access validation, group scope checks, and transactional upsert/delete behavior per student record
- feat(db): added migration `022_attendance_mvp` with new `attendance_records` table, uniqueness guards, and analytical indexes
v0.9.24
2026-02-20
- feat(my-day): added staff `Черга перевірки` block with priority buckets (`прострочені`/`нові`/`без коментаря`) and quick counts for teacher workflow
- feat(my-day-data): extended cockpit payload with role-aware review queue assembled from journal/homework submissions, including direct deep-links to target journal cells
- feat(journal): added auto-open support via `open_column_id/open_student_id` and `prefill_comment` query params for one-click review from queue
- ux(journal): added reusable teacher comment template buttons in the grade modal for faster feedback loops
v0.9.23
2026-02-20
- feat(my-day): added student `What-if` calculator in cockpit (`Пульс та інбокс`) with subject selector and target presets 60/75/90
- feat(api): added `/api/my-day/what-if` endpoint that forecasts required average on remaining journal columns using current weighted grading model
- feat(my-day-data): extended `/my-day` payload with `what_if_subjects` and default subject selection for instant calculator bootstrap
v0.9.22
2026-02-20
- fix(my-day): resolved cockpit DB crash by removing non-existent `teamwork_tasks.status` field from the `/my-day` deadlines query
v0.9.21
2026-02-19
- feat(my-day): redesigned `/my-day` into a new 5-block `Studeria Cockpit` layout (personal brief, priority deadlines, upcoming classes, pulse inbox, competencies)
- feat(my-day): added inline homework submit modal on dashboard cards with safe `redirect_to` support in `/homework/:id/submit` to return back to cockpit
- feat(my-day): expanded `buildMyDayData` with role-aware scope, today+tomorrow classes, deadline focus, inbox signals, activity summary, and competency snapshot scoring
v0.9.20
2026-02-19
- fix(admin-visit-analytics): fixed chart rendering when panel is opened from another admin tab (lazy refresh + chart resize on tab activation)
v0.9.19
2026-02-19
- feat(admin-settings): added configurable data-retention controls for `site_visit_events`, `login_history`, and `activity_log` (14-3650 days)
- feat(admin-maintenance): background cleanup now respects retention settings and auto-prunes visit/login/activity logs on schedule
- feat(role-studio): added live permission simulator that previews admin sections and feature-level access from selected RBAC permissions
v0.9.18
2026-02-19
- feat(admin-visit-analytics): added `Без адмінів` switch to filter visit/login analytics and recent visits without admin activity
- fix(admin-visit-analytics): API `/admin/visit-analytics.json` now supports `exclude_admin` filter for all counters, charts, top pages, role split, and recent events
v0.9.17
2026-02-19
- fix(journal-dark-theme): removed bright disabled/read-only glow in grade modal fields by adding explicit dark overrides for `:disabled` and `[readonly]` inputs
v0.9.16
2026-02-19
- fix(journal-topbar): limited journal topbar actions to only theme toggle and `Повернутись до розкладу`
- fix(journal-dark-theme): forced dark styling for journal form fields and select dropdown options to remove white/glare rendering in dark mode
v0.9.15
2026-02-19
- ux(journal): made grading-system panel collapsible and closed by default with click-to-expand summary
- feat(journal): exposed grade-formation block for students in read-only mode (`Вид діяльності` / `Бал за 1 роботу` / `Внесок у фінал`)
v0.9.14
2026-02-19
- fix(journal-ui): normalized compact action-button sizing so `Bulk` matches `Фінал`/`Lock` controls in column headers
v0.9.13
2026-02-19
- fix(journal-ui): compacted per-column action controls in header (smaller labels/buttons and tighter spacing)
- fix(journal-ui): removed right-side final breakdown chips (`ДЗ/Залік/Кастом`) from the final score column to reduce visual noise
v0.9.12
2026-02-19
- fix(journal-ui): forced dark-theme table surfaces in journal/config blocks (removed white table backgrounds)
- fix(journal-ui): removed extra oval/glare pseudo-elements on journal glass cards in dark theme
- fix(journal-ui): softened top block visuals by disabling clipped top diffusion overlays for journal page containers
v0.9.11
2026-02-19
- feat(journal): implemented soft-delete for grades with 30-second undo restore action in the journal UI
- feat(journal): added bulk grading modal for teachers (paste from Excel by student order) and new `/journal/grades/bulk-save` endpoint
- feat(journal): added per-column lock/unlock controls to freeze grading edits and protect finalized columns
- feat(journal): expanded final score transparency with per-type contribution breakdown chips in the final column
- feat(journal-config): added grading presets and automatic weight normalization to 100 for enabled activity types
- feat(db): added migration `021_journal_grade_undo_and_lock` (`journal_grades` soft-delete fields + `journal_columns` lock fields)
v0.9.10
2026-02-19
- feat(journal): added teacher/admin/deanery ability to delete an existing grade directly from the grade cell modal
- feat(journal): added per-column `include_in_final` toggle to exclude/include columns in final score calculations
- feat(journal): introduced flexible weighted grading config per activity type (enable/disable, per-item max, and contribution weight out of 100)
- feat(db): added migration `020_journal_weighted_config` for journal final-inclusion flags and extended subject grading settings fields
v0.9.09
2026-02-18
- feat(schedule): added student-facing homework submission signal in homework modal list (`Здано` chip + submitted timestamp)
- ux(schedule): submission action now shows `Оновити здачу` for already submitted homework
- fix(schedule): student homework query now joins `homework_submissions` so submission status is visible immediately after page reload
v0.9.08
2026-02-18
- fix(journal): homework-to-journal sync now imports only teacher-created assignments (`is_teacher_homework = 1`)
- fix(journal): auto-archives previously synced homework columns whose source assignment is not teacher-created
v0.9.07
2026-02-18
- fix(schedule): restored always-visible `Meet` chip on class cards (removed `chip-now` visibility dependency)
- fix(schedule): deduplicated teacher-created homework/custom deadlines in teacher weekly lists and grouped affected groups into one card/meta row
- fix(homework): narrowed student homework targets to own subject-group assignments to prevent `Forbidden (homework submit)` on visible tasks
- fix(journal): deduplicated teacher batch columns (with grade merge + archive for duplicates) and mapped submissions/status by student group inside one shared column
- fix(journal): improved role-mode fallback so users without teacher assignments can still open their student subject journal list
v0.9.06
2026-02-18
- feat(journal): added a new `/journal` page with interactive gradebook table (rows by student, columns by assignments) and per-cell review modal
- feat(journal): added grading workflow with required score, optional teacher comment, submission status colors (on-time/late/missing), and student self-view restrictions
- feat(journal): added per-subject grading system settings (homework/seminar/exam/credit/custom defaults) with strict final normalization to 100 points
- feat(journal): synced gradebook columns with homework/custom deadlines, added manual columns, and pinned `Залік` columns before final result
- feat(homework): added student homework submissions (`text/link/file`), teacher-facing submission review data, and storage for `is_teacher_homework`/`is_credit` markers
- fix(schedule): fixed teacher homework distribution logic by target schedule groups; added schedule chips for `Викл.ДЗ`, `Залік`, and `Meet`, plus explicit `Додав:` author labels
v0.9.05
2026-02-18
- fix(subjects-ui): improved dark-theme contrast/glow for material form fields and dropdowns to prevent washed-out white inputs and option lists
- feat(subjects): added `Силабус` material type in create form and highlighted syllabus cards in the feed
- feat(subjects): syllabus materials are now pinned to the top of the subject feed via `is_syllabus` ordering
v0.9.04
2026-02-18
- fix(nav): removed `Предмети` shortcut from Teamwork topbar
- fix(nav): for `subjects` page limited actions to only theme toggle and `Повернутись до розкладу` (desktop and mobile menu)
v0.9.03
2026-02-18
- fix(ui): stabilized topbar theme-toggle geometry (fixed width/height and disabled flex shrinking) to prevent squashed icon button
v0.9.02
2026-02-18
- feat(subjects): added new `/subjects` page with glass-based subject navigation and materials feed for lectures/files/links
- feat(subjects): teachers can now publish subject materials with audience targeting (all groups, specific group, or all assigned groups)
- feat(subjects): students can view only materials available for their subject groups, including attachments and external links
- feat(nav): added `Предмети` shortcuts to topbar/mobile menu and schedule drawer for faster access
- feat(db): added `subject_materials` table migration with indexes and app-level normalization for existing rows
v0.9.01
2026-02-18
- fix(teamwork-ui): removed persistent top oval glare in `Ваші предмети` by disabling both `::before` and `::after` overlays for the targeted subject card variant
v0.9.00
2026-02-18
- fix(teamwork-ui): removed remaining top oval glare in the `Ваші предмети` panel by disabling top-glare pseudo-element for that specific glass card
v0.8.x 100 релізів ›
v0.8.99
2026-02-18
- fix(teamwork-ui): removed oversized oval/semicircle glare from floating glass panels by replacing radial top refraction with compact linear highlight
- fix(changelog-ui): removed semicircle artifact from Changelog glass sheet and replaced it with a subtle top hairline highlight
- fix(teamwork-ui): disabled ambient circular blobs on Teamwork page to eliminate random large circle in panel backgrounds
- fix(teamwork-ui): improved subject-switch responsiveness with immediate pending-state fill and faster chip transition timing
v0.8.98
2026-02-18
- feat(ui): added new floating glass variant (`.glass-float`) with stronger blur/refraction and applied it to key Teamwork panels
- feat(ui): introduced `living-separator` utility with scroll-reactive light shift for depth between major Teamwork sections
- feat(teamwork-ui): upgraded primary team/member/free-student lists with contextual hover cloud glow via `context-cloud-item`
- feat(teamwork-ui): prototyped liquid segmented chips for lesson scope switch with spring-style active animation
- style(changelog): restyled Changelog modal as a glass sheet with soft deep shadow, thin border, and layered liquid highlight
v0.8.97
2026-02-16
- feat(teamwork): seminar tasks now create separate team sets per selected seminar group (`group_count` teams for each selected seminar group)
- feat(teamwork): random distribution for seminar tasks now happens only within each student's seminar group (no cross-group mixing)
- feat(teamwork): students now see/join only teams of their seminar group in seminar-scope tasks; teacher view shows seminar group label for each team
- feat(teamwork): added `seminar_group_number` storage for teamwork groups to persist per-seminar team ownership
v0.8.96
2026-02-16
- fix(teamwork-ui): corrected dark-theme rendering of member move dropdown list in group cards
- fix(teamwork-ui): added explicit dark option/focus styling and `color-scheme` for member transfer select to keep readable contrast
v0.8.95
2026-02-16
- fix(teamwork-ui): normalized lesson scope segmented switch geometry so both options have consistent rounded shape
- fix(teamwork-ui): removed Bootstrap button-group seam on lesson type toggle to avoid mismatched active/inactive form edges
v0.8.94
2026-02-16
- fix(teacher-pending): synced waiting-for-approval page theme with global `ui-theme` localStorage state instead of hardcoded dark mode
- ux(teacher-pending): added in-page theme toggle button to switch between light and dark appearance like other auth/profile pages
v0.8.93
2026-02-16
- feat(teamwork): added teacher controls to move any student between created teamwork groups directly from the task card
- feat(teamwork): added task-level group lock option that blocks students from leaving/changing groups while keeping teacher management available
- feat(teamwork): added lesson scope selection for teamwork tasks (`lecture` default, `seminar` with group targeting and `all groups` default)
- fix(teamwork): updated student task visibility/join eligibility to respect seminar group targeting and teacher subject-group access
v0.8.92
2026-02-16
- feat(ui): introduced shared footer partial and switched all main pages to a unified schedule-style footer layout (`v`, `build`, `Changelog`)
- fix(ui): removed custom teamwork footer overrides so footer appearance is consistent with other pages
- fix(ui): toned down footer dock highlight by disabling the top gradient sheen on `.app-footer .footer-meta.glass-dock`
v0.8.91
2026-02-16
- ux(users): removed `Course` and `Schedule group` columns from Users table to make layout cleaner in course-scoped admin view
- ux(students): removed `Course` and `Schedule group` columns from Students table (including `A/B` schedule group display)
- fix(users): updated dynamic Users table renderer skeleton/column layout to match the simplified table structure
v0.8.90
2026-02-16
- fix(students): set default Students tab status filter to `All` instead of `Active` when opening `admin-students` without explicit `users_status`
- fix(admin): keep Users tab default status behavior unchanged (`Active`) while applying new default only for Students tab context
v0.8.89
2026-02-16
- feat(teamwork): added teacher-focused teamwork flow with subject cards that show course/group labels and separate teacher/student behavior on the page
- feat(teamwork): expanded task creation settings with random distribution, configurable group count, and optional min/max team size using a dual-handle slider
- fix(teamwork): restricted task/group access by teacher assignments so students only see and join tasks from teachers who teach their subject group
- ux(teamwork): added footer Changelog button and modal on the teamwork page
v0.8.88
2026-02-16
- ux(students): removed explanatory deanery-mode banner from Students section to reduce visual noise
- fix(students): replaced missing i18n label output (`admin.status`) with explicit `Статус` in Students filter
- ux(students): removed status column and active/inactive badges from Students table, keeping only action controls
v0.8.87
2026-02-16
- feat(admin): added new reduced `Students` section (separate from full `Users`) for deanery/student management without sensitive login telemetry UI
- feat(rbac): added `admin-students` permission to Role Studio catalog and deanery default template, with dedicated sidebar tab
- feat(students): introduced scoped students routes for group assignment/removal and activate/deactivate actions, explicitly excluding permanent delete flow
v0.8.86
2026-02-16
- feat(analytics): added site visit tracking (page key, route, role, user/session, course) with retention cleanup and dedupe window to reduce noisy duplicates
- feat(admin): added new `Visit analytics` section with live metrics, trend chart, top pages, role split, and recent visits via `/admin/visit-analytics.json`
- feat(rbac): added `admin-visit-analytics` permission to admin section catalog so access can be managed in Role Studio
v0.8.85
2026-02-16
- ux(admin): returned quick self-schedule action to topbar with compact label `Розклад`
- ux(admin): removed duplicate self-schedule action from preview modal to keep preview focused on course/group test mode
v0.8.84
2026-02-16
- ui(admin): unified topbar control sizing (buttons, theme toggle, session chip) for consistent Liquid Glass rhythm
- ux(admin): moved bulky admin test-preview controls into a dedicated modal and replaced them with a single compact `Превʼю` trigger button in topbar
- style(admin): added glass-styled preview modal cards with cleaner course/group selectors and quick access to personal schedule
v0.8.83
2026-02-16
- feat(health): expanded `/_health` with session-store diagnostics (checks/failures/last probe/latency) and optional strict mode (`?strict=1`) for alerting
- feat(session): added periodic Postgres session-store probes with structured `SESSION_HEALTH` logs (`probe_ok`, `probe_failed`, `probe_recovered`, scheduler start) for Cloud Monitoring filters
- ui(admin): added liquid-glass session health chip in admin topbar with live polling and manual refresh click
v0.8.82
2026-02-16
- fix(upload): decode mojibake filenames from multipart uploads (UTF-8 names shown as `Ð...`) so Ukrainian attachment names display correctly
- fix(upload): normalize stored upload filenames with safer fallback while preserving decoded `originalname` for homework attachment labels
- fix(ui): normalize previously saved homework `file_name` values at render time to recover readable attachment titles in schedule/admin views
v0.8.81
2026-02-16
- feat(session): switched from in-memory express sessions to Postgres-backed sessions via `connect-pg-simple` (`user_sessions` table) to persist logins across Cloud Run scale/restarts
- feat(session): enabled rolling session expiry with dynamic TTL from `session_duration_days`, compact session cookie name (`sid`), and periodic server-side session pruning
- ops(cloud-run): updated deploy config with session affinity and instance limits (`min=1`, `max=1`) to reduce session turbulence between releases
v0.8.80
2026-02-16
- fix(rbac): unlock `Schedule list` and `Semester summary` for custom roles with `admin-schedule` permission (removed hard `requireAdmin` guards)
- feat(rbac): route-level section permissions wired across admin pages/APIs (overview, settings, schedule, generator, import/export, users, subjects, courses, semesters, homework, history, activity, messages, teamwork, role studio)
- feat(role-studio): added `admin-role-access` permission to Role Studio catalog and runtime RBAC permission sync so new section keys are auto-registered in DB
- ux(rbac): Role Studio tab can now be shown by section permission (not only legacy `admin` role)
v0.8.79
2026-02-16
- fix(rbac): allow custom roles with `admin-schedule` permission from Role Studio to use schedule write routes (`/admin/schedule/add|edit|delete|delete-multiple|clear-all`) without `Forbidden (update page)`
- fix(rbac): apply section-based access check (`admin-schedule`) to related schedule APIs (week clone, subject clone, study days, week time, validate) so custom schedule managers can use full schedule tooling
- fix(ux): redirect non-deanery custom staff schedule actions back to `/admin?course=...` instead of `/deanery`, while deanery keeps deanery redirect
v0.8.78
2026-02-16
- fix(rbac): allow custom roles with admin-section permissions to open `/admin` panel (new `requireAdminPanelAccess` check)
- fix(rbac): pass `allowedSections` to admin view for non-admin custom roles so section visibility follows Role Studio permissions
- ux(rbac): show "Back to admin" entry in schedule drawer/mobile/desktop menus for custom roles that have admin panel access
v0.8.77
2026-02-16
- fix(deanery): allow users with `deanery` role to use schedule mutation routes (`/admin/schedule/add|edit|delete|delete-multiple|clear-all`) without `Forbidden (update page)`
- fix(deanery): persist selected deanery course into session (`adminCourse`) and use role-aware course resolver for schedule writes
- fix(deanery): redirect schedule write results back to deanery panel for non-admin staff instead of `/admin`
v0.8.76
2026-02-16
- fix(admin): prevent `ReferenceError` in `admin.ejs` when `defaultRolePermissions` local is missing (safe `typeof` fallback for Role Studio client bootstrap)
v0.8.75
2026-02-16
- fix(admin): remove `liquid-card` treatment from Role Studio container to eliminate dark-theme semicircle glare artifact
v0.8.74
2026-02-16
- fix(admin): resolve global script parse failure by removing duplicate `escapeHtml` declaration in `admin.ejs` (restores theme toggle, user row clicks, filters, and draft autosave logic)
- fix(schedule): hide dark-theme top glare pseudo-elements for week hero, online panel, and day cards to remove remaining oval artifacts
v0.8.73
2026-02-16
- fix(admin): harden Role Studio client initialization with safe guard to prevent downstream UI handlers from breaking on runtime errors
- fix(admin): simplify Role Studio preset UI (restore regular buttons/status text) and keep autosave drafts in localStorage with restore toast
- fix(admin): revert risky table container styling and raise admin topbar z-index to keep header controls clickable
- fix(schedule): remove dark-theme liquid glare ovals on week hero, online panel, and day cards
v0.8.72
2026-02-16
- feat(admin): add Liquid Header Rail and depth-card table surfaces for a clearer Apple Liquid Glass hierarchy in admin
- feat(role-studio): add glass segmented presets and ambient status chips for role state visibility
- feat(role-studio): add local draft autosave/restore via localStorage with per-role "Draft saved" indicators
- ux(changelog): restyle Changelog modal with liquid glass treatment and release-notes chip
v0.8.71
2026-02-16
- refactor: remove legacy Role Access matrix UI and keep a single Role Studio section in admin
- feat: add Role Studio presets (Default Deanery, Default Starosta, Reset system defaults) with unsaved revert action for RBAC role forms
- fix: keep backward compatibility for old tab key admin-role-access by redirecting it to admin-role-studio
v0.8.70
2026-02-16
- refactor: merge legacy Role Access controls into the Role Studio page so all role management lives in one section
- ux: remove separate Role Access sidebar tab and keep backward-compatible tab alias from admin-role-access to admin-role-studio
v0.8.69
2026-02-16
- feat: add dedicated "Role Studio" section in admin sidebar with one-click tab switching
- ux: separate legacy Role Access matrix from new RBAC Role Studio screen to make new role settings immediately discoverable
v0.8.68
2026-02-15
- fix: add independent admin-tab fallback script that always enforces single visible panel and left-menu switching
- fix: make tab switching resilient even if the main admin script fails later in execution
v0.8.67
2026-02-15
- fix: restore strict single-panel admin behavior by default (`.admin-panel` hidden, first panel visible as fallback)
- fix: decouple early admin tab initialization from bootstrap runtime (guard `Modal` constructor usage) to prevent full-page multi-panel fallback
v0.8.66
2026-02-15
- fix: make admin tab script resilient when browser blocks `localStorage` by using safe get/set wrappers
- fix: restore one-section-at-a-time admin tab behavior in restricted storage environments (no script abort before tab init)
v0.8.65
2026-02-15
- fix: make admin tab panels fail-safe by hiding panels only after JS tab system is initialized (`admin-tabs-ready`)
- fix: harden admin tab activation with fallback to an existing tab (or show all panels if no valid target)
- fix: guard `themeToggle` initialization against null to prevent early script crash that blocked left-menu tab switching
v0.8.64
2026-02-15
- fix: force full section visibility for `admin` in `admin.ejs` by ignoring `allowedSections` filtering for admin role
v0.8.63
2026-02-15
- feat: add RBAC foundation with `access_roles`, `access_permissions`, `access_role_permissions`, `access_role_course_access`, and `user_roles` via migration `012_rbac_roles` (including seeds/backfill)
- feat: add multi-role user management in admin with new APIs (`/admin/users/:id/roles.json`, `/admin/users/roles`) and replace modal single-role editor with primary-role + role-set editing
- feat: add Role Studio in admin for creating/updating/deleting roles and configuring admin-section permissions + course-kind access
- fix: update admin users table/filter/render to rely on `role_keys`/`primary_role`, remove stale modal fields, and prevent admin-row destructive actions based on any assigned role
- fix: apply role-aware permission/course access in staff flows (starosta/deanery/admin-or-deanery APIs, starosta/deanery panel permissions, and admin checks via multi-role session state)
v0.8.62
2026-02-15
- fix: block `starosta` and `deanery` roles from accessing teacher courses by role-aware filtering in `buildStaffCourseAccess`
- fix: add explicit 403 guard on starosta/deanery overview routes when no allowed non-teacher course is available
v0.8.61
2026-02-15
- fix: prevent `ReferenceError` in deanery schedule form by guarding optional `activeScheduleDays` local with `typeof` fallback in `admin.ejs`
v0.8.60
2026-02-15
- fix: auto-switch schedule to the actual week exactly at Kyiv midnight by recalculating week from semester start and updating `?week=` when stale
- fix: align midnight timer trigger to fire at boundary time (removed +500ms delay) for precise day/week rollover behavior
v0.8.59
2026-02-15
- fix: prevent `ReferenceError` in admin overview for starosta/deanery by adding a safe `dashboardStats` fallback in `admin.ejs`
v0.8.58
2026-02-15
- fix: prevent `ReferenceError` in admin template for deanery/starosta views by guarding optional `adminSectionOptions` and `rolePermissions` locals with `typeof` fallbacks
v0.8.57
2026-02-15
- fix: remove Week Pager block-shift animation on swipe/click (week pill now updates without motion translation)
- fix: remove pre-navigation schedule fade-out during week switches to eliminate brief full-black flash before page reload
- ux: keep deterministic week navigation behavior while simplifying visual state changes for cleaner desktop feel
v0.8.56
2026-02-15
- refactor: replace dot-based week carousel with a new Week Pager concept (prev/next + central week pill + progress line) for more stable desktop rendering
- refactor: remove complex carousel geometry/state animation pipeline and switch week navigation to a compact deterministic flow with debounce and directional feedback
- ux: keep swipe week switching using the new pager control while preserving keyboard arrows and existing schedule content transitions
- style: add Apple-like glass week pill micro-motion and progress indicator, plus disabled states for week navigation buttons
v0.8.55
2026-02-15
- fix: restore smooth desktop tab motion by removing bounce transform conflict with indicator translate animation
- fix: keep glass-tab bounce as opacity/shadow pulse only, preserving single-oval rendering and stable movement
v0.8.54
2026-02-15
- fix: remove desktop glass-tab dual-oval artifact by simplifying active tab indicator shadow model to a single clean contour
- fix: switch tab bounce animation from shadow morphing to subtle scale motion for consistent oval size rendering on desktop GPUs
- fix: enforce neutral native button rendering for glass tabs (appearance/focus/active) to prevent extra browser-drawn outlines
v0.8.53
2026-02-15
- refactor: rework week carousel switching logic to a single requestAnimationFrame-based animation path for more stable frame pacing
- ux: add Apple-like eased spring interpolation for week transitions, replacing timer/transitionend race-prone flow
- style: tune week rail and active indicator timing curves/durations for smoother iOS-like movement
v0.8.52
2026-02-15
- fix: remove duplicated oval highlight on schedule Glass Tabs by excluding tab buttons from global Focus Halo treatment
- fix: disable generic focus ring shadow on glass tabs so only the moving tab indicator remains visible during click/focus
v0.8.51
2026-02-15
- fix: reduce dark-theme Liquid Card glare on schedule cards by removing oversized reflection overlays and softening gradient rim intensity
- fix: rebalance schedule card border/shadow treatment in dark mode for cleaner color rendering without bright wash artifacts
- fix: add explicit Changelog button fallback handler in schedule page so modal opens reliably on click
v0.8.50
2026-02-15
- style: add new design-system components for Ambient Layer background, Glass Dock footer action panel, Liquid Card surface, and Focus Halo interactive focus animation
- ux: automatically apply Glass Dock and Focus Halo behavior via design-system.js, plus inject Ambient Layer globally without per-page markup duplication
- ui: implement schedule view Glass Tabs (Day/Week/Month) with spring-like animated indicator, swipe switching, and persisted mode in localStorage
- ui: add Month Snapshot prototype panel and apply Liquid Card treatment to week hero, schedule panel, day cards, and class cards
v0.8.49
2026-02-14
- ux: add shared modal behavior helper in design-system.js to consistently close the top visible modal on Escape
- ux: support closing the top visible modal by clicking the backdrop area (while respecting static backdrop configuration)
- a11y: restore keyboard focus to the original modal trigger after the modal closes for better navigation flow
v0.8.48
2026-02-13
- content: update February 14 special schedule phrase to exact quoted text "Любов варта всього."
v0.8.47
2026-02-13
- feat: add a one-day special daily-phrase override for February 14 (Kyiv time) in the schedule hero block
- fix: keep normal rotating phrase list behavior for all non-special dates without changing existing phrase timing
v0.8.46
2026-02-13
- fix: restore schedule status-chip behavior by removing global inline-flex override from generic .chip tokens (prevents simultaneous "Зараз"/"Далі" visibility)
- fix: eliminate theme-sync mutation loop in design-system.js by guarding data-theme writes and skipping observer callbacks during sync
- perf: reduce UI freeze risk on dynamic pages by avoiding redundant theme attribute updates
v0.8.45
2026-02-13
- style: remove hover/press jump on cards and buttons by disabling translate/scale transforms in shared design-system interactions
- style: keep calm Apple-like feedback through shadow and border transitions only, without block repositioning on hover/active
v0.8.44
2026-02-13
- style: introduce shared Apple-like design system at /public/css/design-system.css with unified typography (400/500/600), calm glass surfaces, spacing/radius/motion tokens, hairlines, and accessibility focus/reduced-motion rules
- style: apply the shared design system across all EJS pages (schedule, my-day, teamwork, profile, admin, generator, auth, deanery, landing) by loading design-system.css as a global visual layer
- style: add lightweight /public/js/design-system.js helper to sync data-theme with existing dark/light class toggles and auto-apply semantic badge styling for Контроль (amber) and ДЗ (blue) labels
v0.8.43
2026-02-13
- style: refine calm "No classes" state with lighter 12px medium text, soft hairline rhythm, subtle glyph prefix, and extra vertical breathing
- style: polish class-card micro-motion with 200ms Apple-like cubic timing, smoother hover/press shadows, and paint containment to reduce scroll flicker
- style: quiet footer metadata (v/build/changelog) to 12px medium low-contrast text with subtle text-link hover behavior
- style: add semantic badge styles for Контроль and ДЗ with distinct dark-theme accents (amber control, blue homework) while preserving layout geometry
v0.8.42
2026-02-13
- fix: improve dark-theme readability for "Дивні дедлайни" by replacing low-contrast brown text with light amber/yellow text tones
- style: increase dark-theme deadline block/item contrast while preserving yellow visual identity and existing layout
v0.8.41
2026-02-13
- ui: move "Дивні дедлайни" entry point from week hero action row into the left drawer menu
- ui: keep custom deadlines modal behavior unchanged while simplifying hero action area to week badge only
v0.8.40
2026-02-13
- style: refactor schedule typography to Apple-like system stack with shared size/weight/line-height tokens (400/500/600 hierarchy only)
- style: rebalance hierarchy for hero/day/subject/time/meta/chips and remove uppercase-heavy day headers for calmer visual rhythm
- style: soften secondary system copy and align week-density/day/status chips to lighter medium-weight typography
v0.8.39
2026-02-13
- fix: increase extreme-state edge content nudge to shift dots and active oval further right for cleaner first/last week fit
- fix: reduce first-week indicator left allowance using edge-aware bounds so the oval no longer appears cut at the start edge
v0.8.38
2026-02-13
- fix: add dedicated edge-content nudge token and apply it to first/last rail clamp bounds so dots and oval shift right together on extreme weeks
- fix: extend last-week indicator right bound by edge nudge to prevent oval clipping while preserving existing animation flow
v0.8.37
2026-02-13
- fix: add subtle global week-carousel content x-shift so oval and dots sit slightly further right inside the rail window
- fix: apply indicator y-offset token and clamp so active oval aligns higher with dot centerline
v0.8.36
2026-02-13
- fix: add asymmetric last-week indicator clamp with slight extra right allowance so active oval fully fits at the final edge state
- fix: centralize indicator min/max bounds logic to keep initial geometry and runtime transform clamping consistent
v0.8.35
2026-02-13
- fix: update extreme week-carousel distribution to 0+3 at first week and 3+0 at last week for cleaner edge states
- fix: keep existing near-edge and middle distribution unchanged while reducing visual crowding at both ends
v0.8.34
2026-02-13
- fix: add extreme-edge carousel gap token and apply stronger nearest-dot clearance in 0+4 and 4+0 states
- fix: keep moderate edge clearance for 1+3 and 3+1 states while preserving existing balanced 2+2 split behavior
v0.8.33
2026-02-13
- fix: reduce week-carousel indicator edge travel by a safety inset so the active oval no longer appears clipped on the last week
- fix: lock active oval and morph-blob height to exact dot size for consistent 1:1 vertical geometry
v0.8.32
2026-02-13
- fix: add dedicated week-carousel edge-gap token and apply small nearest-dot clearance in edge-biased states to prevent dot-over-oval overlap
- fix: keep balanced 2+2 states on larger mid-split while using only minimal split near edges for cleaner geometry
v0.8.31
2026-02-13
- fix: remove duplicated legacy week-carousel inline styles that were overriding token-based dot geometry and causing dot overlap artifacts
- fix: keep week dots controlled only by unified wc-token CSS system for stable spacing and active indicator layering
v0.8.30
2026-02-13
- fix: limit week-carousel center split offset to balanced 2+2 states only
- fix: keep edge-biased layouts (1+3 and 3+1) unshifted so near-edge single-side dots remain stable
v0.8.29
2026-02-13
- fix: enforce edge-biased week-dot visibility distribution (0/4, 1/3, 2/2, 3/1, 4/0) around active oval
- fix: align visible-dot selection with clipped rail window so near-edge states keep expected left/right counts consistently
v0.8.28
2026-02-13
- fix: add explicit penultimate-week visibility rule in week carousel so the clamped edge state shows 3 dots instead of 4
- fix: route dot visibility and mid-split logic through shared visible-index computation to keep spacing consistent during transition
v0.8.27
2026-02-13
- fix: disable one-sided week-dot mid-split on edge-pinned states so nearest dots no longer get pushed away from the active oval
- fix: keep center-gap split only when both sides exist around indicator, improving first/last week transition consistency
v0.8.26
2026-02-13
- fix: allow week-carousel active oval to use slider side padding as edge travel so first/last week transitions move with full logical step instead of appearing static
- fix: keep center split spacing anchored to indicator-focused dot center while rail is clamped, preserving smooth edge behavior without redesign
v0.8.25
2026-02-13
- fix: remove target-dot stretch morph so switching dots no longer visually fly into the center oval during rail movement
- fix: move oval re-expand phase to transition-end timing so morph remains synchronized with the rail finish instead of ending early
v0.8.24
2026-02-13
- fix: synchronize week-carousel morph by delaying active-dot swap until transition end and running oval shrink + target-dot stretch in one timed phase
- fix: stabilize center split spacing by anchoring mid-gap to the physically centered dot index during rail movement
- style: slightly tighten center split distance (wc-mid-gap 12px) to bring neighbor dots a bit closer to the active oval
v0.8.23
2026-02-13
- fix: restore week-carousel active oval width to 28px to prevent oversized center pill overlap after token refactor
v0.8.22
2026-02-13
- fix: enforce single-source carousel tokens with wc-mid-gap and oval height locked to dot size for stable 8px indicator geometry
- fix: synchronize rail and indicator transform updates in one animation frame with device-pixel snapping to remove oval jitter
- fix: add dynamic mid-split spacing classes for the two center-visible dots so the active oval no longer visually overlaps them
v0.8.21
2026-02-13
- style: add static iOS-like edge fade mask to the week-dot window so dots softly fade near left/right bounds without affecting rail geometry
v0.8.20
2026-02-13
- refactor: switch week-carousel from 4-slot virtual windowing to a full-dot rail that renders all weeks
- fix: animate navigation by moving the entire rail with clamped translate3d geometry so every dot scrolls with no edge blank space
- fix: preserve centered active oval overlay with stable 250ms debounce + transition lock for arrows, dot clicks, and swipes
v0.8.19
2026-02-13
- fix: resolve schedule.ejs compile error (Unexpected token else) by merging week-carousel edge-count else-if chain into a single EJS scriptlet block
v0.8.18
2026-02-13
- fix: add edge-biased 4-dot distribution logic (0/4, 1/3, 2/2, 3/1, 4/0) so week-carousel pins naturally near start/end
- fix: rebuild visible week indices from left/right dot counts with bounded backfill to keep stable 4-slot nodes without jitter
- fix: animate entering/exiting dots by old/new index diff and include directional edge-slot motion using data-motion attributes
v0.8.17
2026-02-13
- fix: unify week-carousel geometry via shared --wc-* tokens and compute slot positions from one 4-dot spacing formula
- fix: widen center gap and clamp morph target positions so the active oval remains centered and no longer overlaps adjacent dots
- fix: stabilize week-switch animation pipeline with rAF-batched state commit, morph lock, and smoother enter/exit timing
v0.8.16
2026-02-13
- fix: increase middle spacing between week-dot pairs (1-2 / 3-4) so the centered active oval no longer overlaps neighboring dots
- fix: synchronize carousel geometry and slot math with a dedicated middle-gap token for stable indicator and morph target alignment
- feat: restore edge enter/exit dot motion during week switches with directional fade-slide while keeping 4-dot rail and one active oval
v0.8.15
2026-02-13
- fix: restore week-carousel navigation with single source of truth state and explicit goToWeek flow for arrows and dots
- fix: rebind dot clicks via data-week-index on stable dot nodes to prevent dead interactions after carousel refactor
- fix: re-center active indicator by fixed window geometry and keep morph animation bounded before week content switch
v0.8.14
2026-02-13
- fix: refactor week-carousel windowing to a stable 4-dot rail with constant geometry and no trailing blank space
- feat: restore Apple-like pour morph using a temporary morph-blob from centered indicator to target dot before week switch
- fix: harden vanilla JS carousel transitions with animation lock, 250ms debounce, pixel-snapped transforms, and stable dot node reuse
v0.8.13
2026-02-13
- fix: refactor week-carousel to atomic transition state so rail and active indicator update in one frame without desync
- fix: hard-clamp indicator position inside the visible rail window to prevent edge overflow and half-cut oval states
- fix: switch dot visibility/active state to stable data-attributes with 250ms transition debounce to reduce intermittent jerk during rapid switching
v0.8.12
2026-02-13
- fix: expand week-carousel window to stable symmetric 7-dot visibility (3 before + active + 3 after) with edge pinning
- fix: reduce micro-lag by caching carousel geometry, precomputing dot centers, and keeping transform math device-pixel aligned
- style: make carousel glass tone uniform by removing internal gradient overlays and keeping a single semi-transparent container surface
v0.8.11
2026-02-13
- fix: align carousel glass container tone with arrow controls using shared rgba/border/shadow/blur tokens
- fix: enforce symmetric 5-dot (+2 active +2) windowing with stable edge pinning and no spacing drift
- fix: snap rail and indicator transforms to device pixels to remove micro-jitter while preserving transform-only motion
v0.8.10
2026-02-13
- fix: rebuild week-carousel geometry from single 8px/10px dot-gap tokens with explicit rail/window width math and translate clamping
- fix: move active oval to a separate overlay layer and center it by row-height math so it no longer drifts or clips at edges
- fix: stabilize near-edge pin behavior with constant 7-dot windowing, direction-aware bounds, and smooth non-destructive dot fade transitions
v0.8.09
2026-02-13
- fix: lock week-carousel dot geometry to fixed 8px circles and remove baseline drift during transitions
- fix: stabilize rail math using CSS token dimensions to avoid indicator misalignment and width jitter
- fix: enforce transform-only rail movement with smooth 200/220/150ms timing and non-destructive dot fade windowing
v0.8.08
2026-02-13
- fix: refactor week carousel to fixed-geometry window + transform-only rail shifting with no scroll-snap jitter
- feat: add floating active indicator morph animation (220ms ease-out) so active oval slides without resizing dots
- fix: smooth edge dot enter/exit via opacity-scale transitions while keeping DOM nodes stable and avoiding layout reflow
v0.8.07
2026-02-13
- fix: stabilize week carousel geometry to remove right-side empty space and prevent background stretching during dot transitions
- fix: pre-render visible week-dot window on server to avoid flash of all dots before animation state applies
- style: fine-tune carousel horizontal offset and align arrow group closer to schedule card start line
v0.8.06
2026-02-13
- style: expand schedule page background gradients for a fuller but still calm atmosphere
- style: add subtle transparency to class cards while preserving dark-theme contrast and hover lift
- fix: tighten week carousel width, reduce dot-scroll jitter, and restore neat semi-transparent arrow controls with improved horizontal alignment
v0.8.05
2026-02-13
- fix: hide test-preview banner together with week pulse in Focus week mode without leaving blank spacing
- fix: remove week-arrow background artifacts, align week rail offset, and polish edge dot enter/exit motion
- fix: rebalance dark-theme schedule tones with darker base cards, lighter hover, improved deadline subject contrast, and light-style week badge/test-preview accents
v0.8.04
2026-02-12
- style: restore compact week-dot carousel with smooth transitions and adaptive nearby-week visibility
- style: move Focus week toggle into sync status row and show week-pulse chips only inside expanded details
- style: soften class tonal contrast, improve Dense day readability in dark theme, remove left card stripe, and return yellow deadline styling
v0.8.03
2026-02-12
- style: redesign week carousel into a scroll-snap capsule rail with subtle edge fades and W1..W15 labels
- style: refine day header hierarchy, spacing rhythm, and divider clarity for calmer section anchors
- style: soften schedule status area, collapse deadline blocks by default, and minimalize footer metadata presentation
v0.8.02
2026-02-12
- feat: refactor My Schedule cards to calm semantic surfaces using div role=button, soft motion, and subtle now/next emphasis
- feat: replace multi-color subject mapping with single-hue tonal HSL system and per-day repeat lightness variation
- feat: add desktop slide-out action drawer, scroll-snap week rail, collapsed density summary chips, and optional Focus week mode
v0.8.01
2026-02-12
- feat: redesign schedule density block with clearer language and quick visual guidance
- feat: add heatmap summary chips for evening load, day balance, and peak day
- feat: add intensity legend (low/medium/high) and clearer slot/day labels in heatmap tooltips
v0.8.00
2026-02-12
- fix: restore missing closing blocks near scheduler route to prevent app.js parse failure on startup
- fix: update patch versioning rule to roll over at .99 (example: 0.7.99 -> 0.8.00)
- fix: normalize version formatter to major.minor.XX for patch output
v0.7.x 99 релізів ›
v0.7.101
2026-02-12
- feat: add generator toggle for lecture-before-seminar priority
- fix: schedule lectures ahead of seminars for subjects that contain both lesson types
- fix: block seminar slots that would be placed earlier than an existing lecture in the same week
- fix: postpone lecture-dependent mirror seminar pairs until after lecture planning phase
v0.7.100
2026-02-12
- fix: remove stray scheduler route braces that could break app.js route parsing
- fix: rebalance generator day-load scoring to reduce Monday-first clustering
- fix: strengthen late-slot penalty response to the evening-avoidance slider
- fix: prefer same-slot placement for non-general seminars across groups (parallel teachers)
v0.7.99
2026-02-12
- fix: use location-aware semester mapping consistently in generator run and preview flows
- fix: wrap generator preview/publish write paths in DB transactions to avoid partial delete/insert states
- fix: recalculate slot scores on each scheduling pass to improve day balancing and late-slot control
- feat: expose top no-slot rejection reasons in conflict diagnostics UI
- feat: add generator indexes and slot-level uniqueness guard migration for schedule_generator_entries
v0.7.98
2026-02-11
- fix: allow parallel seminars for non-general subjects across different groups (unless teacher conflict exists)
- fix: keep parallel-slot block only for general seminars where one shared teacher is assumed
v0.7.97
2026-02-11
- fix: split all-group seminars into per-group generator items regardless of is_general flag
- fix: schedule high pair counts across multiple slots per subject to reduce partial generation (e.g. 13/26 cases)
- fix: prevent parallel same-subject seminars for shared/no-teacher multi-group cases
- fix: strengthen day-balance and late-slot scoring so evening avoidance and Monday spread work more predictably
- fix: improve generator validation messaging for multi-slot-per-week scenarios and fixed-slot overcommit
v0.7.96
2026-02-11
- feat: add Safe auto-tune action for generator settings based on diagnostics
- feat: add strict no-evening mode to hard-block 6-7 class slots
- fix: surface no-allowed-classes conflicts in validation, analytics, and conflict priority sorting
v0.7.95
2026-02-11
- feat: add per-location generator health insights with actionable recommendations
- fix: normalize generator distribution settings and rebalance defaults for new drafts
- fix: sort generation conflicts by severity and improve generator copy for multi-location flow
v0.7.94
2026-02-11
- fix: resolve generator location panel overlap when switching Kyiv/Munich
- fix: rebalance slot scoring to reduce Monday clustering and strengthen late-slot avoidance
- fix: enforce cross-subject A/B mirror pairing and flag mirror mismatches
- fix: warn when requested pairs exceed available generation weeks
v0.7.93
2026-02-11
- feat: add admin modal to find shared free slots across courses
v0.7.92
2026-02-11
- fix: split general seminars into per-group generator items when selecting all groups
- fix: allow auto mirror pairing for general seminar items
v0.7.91
2026-02-11
- fix: improve topbar button contrast in dark theme
v0.7.90
2026-02-11
- fix: refine subject color legend modal layout and list
v0.7.89
2026-02-11
- fix: show subject color legend in modal
v0.7.88
2026-02-11
- fix: restore classic week carousel and improve schedule hover contrast
v0.7.87
2026-02-11
- fix: delete broadcast messages across all courses
v0.7.86
2026-02-11
- feat: add subject color legend on schedule hover
v0.7.85
2026-02-11
- fix: prevent duplicate messages when loading all-course announcements
v0.7.84
2026-02-11
- feat: redesign schedule UI with calmer cards, day headers, and timeline week rail
v0.7.83
2026-02-11
- feat: add admin quick switch to personal schedule groups
v0.7.82
2026-02-11
- feat: add admin test view selector for student schedule by course/group
- fix: improve dark-theme contrast on teacher pending page
v0.7.81
2026-02-10
- fix: show lectures for all students regardless of group mapping
v0.7.80
2026-02-10
- fix: resolve schedule summary redeclared variable and guard scheduler loop
v0.7.79
2026-02-10
- feat: move semester summary to separate admin page
v0.7.78
2026-02-10
- feat: add semester subject count summary in schedule list
v0.7.77
2026-02-10
- fix: avoid DISTINCT string_agg order-by error in schedule list
v0.7.76
2026-02-10
- fix: use string_agg for schedule list group labels on Postgres
v0.7.75
2026-02-10
- feat: add CSV import scope validation, dry-run errors, and injection-safe exports
- feat: add generator preview/publish diff with backup and confirmations
- feat: add role access guardrails and system settings manual save status
v0.7.74
2026-02-10
- feat: add tooltip with group list for multi-group schedule rows
v0.7.73
2026-02-10
- feat: show multi-group badge in schedule list rows
v0.7.72
2026-02-10
- feat: add multi-group badge in schedule editor
v0.7.71
2026-02-10
- feat: add semester hard delete action to remove linked data
v0.7.70
2026-02-10
- feat: reorder schedule editor fields and lock group on lectures
- feat: add multi-group modal for non-general subjects
v0.7.69
2026-02-10
- feat: add dry-run UI for subject merge preview in generator
v0.7.68
2026-02-10
- feat: add subject merge report payload in settings
- feat: add schedule generator merge preview endpoint
v0.7.67
2026-02-10
- fix: only merge subjects when lecture/seminar suffix is detected
v0.7.66
2026-02-10
- fix: enforce lecture/seminar lesson types during subject merge
- fix: align generator item lesson types with merged subjects
v0.7.65
2026-02-10
- feat: merge lecture/seminar duplicate subjects into one and backfill lesson types
- feat: migrate subject references across schedule, homework, messages, and generator data
v0.7.64
2026-02-10
- feat: store lesson types on schedule entries and show lecture/seminar badges
- feat: add lesson type controls to schedule editor and schedule list
- feat: include lesson_type in schedule CSV import/export and generator publish
v0.7.63
2026-02-10
- feat: redesign admin IA with sidebar navigation, breadcrumbs, and overview panels
- feat: add CSV import/export workflow with dry-run validation, templates, and history links
- feat: add confirm/toast UX, role access templates, and user bulk actions
- fix: sanitize CSV exports and stabilize generator preview confirm modal
v0.7.62
2026-02-10
- fix: allow general subjects in auto mirror pairing
v0.7.61
2026-02-10
- feat: add subject day auto-assign and lecture+seminar same-day controls
- feat: add late-slot avoidance weight to generator
v0.7.60
2026-02-09
- feat: keep each subject on a single day across schedule
v0.7.59
2026-02-09
- feat: show auto-mirror exclusion reasons in generator
v0.7.58
2026-02-09
- feat: add auto mirror pairing modal for seminars
v0.7.57
2026-02-09
- fix: prevent lecture overlap with seminars and balance day load across course
v0.7.56
2026-02-09
- fix: prevent general-subject seminars from overlapping between groups
v0.7.55
2026-02-09
- fix: hide inactive location panels in schedule generator
- feat: add arrow-key navigation in schedule preview
- feat: allow admins to broadcast messages to all courses
v0.7.54
2026-02-09
- fix: repair starosta dashboard query flow after syntax error
- fix: add horizontal scroll to role access matrix
v0.7.53
2026-02-09
- feat: restrict starosta/deanery to own course with teacher-course exception
v0.7.52
2026-02-09
- feat: add admin role access settings for dashboard sections
v0.7.51
2026-02-09
- feat: add validation gate, conflict insights, and problem filter for generator items
- feat: add mirror key helpers, mirror summary, and schedule density heatmap
- feat: add course-only regeneration, slot locking, and evenness bias control
v0.7.50
2026-02-09
- fix: align preview carousel and improve header contrast
v0.7.49
2026-02-09
- fix: widen generator plan table columns
v0.7.48
2026-02-09
- fix: improve generator dark theme readability
v0.7.47
2026-02-09
- fix: improve generator theme toggle and table readability
v0.7.46
2026-02-09
- fix: guard missing body on generator render
v0.7.45
2026-02-09
- fix: harden generator config parsing and add scheduler alias
v0.7.44
2026-02-09
- fix: use explicit GROUP BY expressions for weekly stats
v0.7.43
2026-02-09
- fix: add schedule generator repair migration
v0.7.42
2026-02-09
- fix: add migration and safe backfill for course location
v0.7.41
2026-02-09
- fix: fallback course location when column is missing
v0.7.40
2026-02-09
- feat: add mirror keys per subject and highlight mirror pairs in preview
- fix: improve dark-theme contrast in generator and preview
v0.7.39
2026-02-09
- feat: add Kyiv/Munich toggle and separate semester configs in generator
v0.7.38
2026-02-09
- feat: add A/B mirror groups mode to semester generator
- feat: allow selecting semesters per course in generator settings
v0.7.37
2026-02-09
- feat: add semester schedule generator with preview + publish flow
- feat: add Kyiv/Munich campus flag for courses
- feat: add teacher availability/load constraints for generator
v0.7.36
2026-02-09
- feat: add system settings for custom deadlines, messages, and schedule auto-refresh
v0.7.35
2026-02-09
- revert: remove day card hover sheen change
v0.7.34
2026-02-09
- fix: make schedule hover fill uniform without bright edge
v0.7.33
2026-02-09
- fix: keep schedule visuals stable during scroll
v0.7.32
2026-02-09
- fix: disable heavy glass effects while scrolling schedule
v0.7.31
2026-02-09
- fix: restore blue hover and purple press for schedule cards
- fix: keep now/next highlights during hover
v0.7.30
2026-02-09
- fix: reduce schedule hover artifacts with paint containment
v0.7.29
2026-02-09
- fix: reduce schedule hover flicker while scrolling
v0.7.28
2026-02-09
- feat: hide empty filters section on schedule
- feat: add now/next chips for smart highlights
- feat: soften schedule highlights with green palette
v0.7.27
2026-02-09
- fix: set selected course id for schedule cache key
v0.7.26
2026-02-09
- feat: add smart current/next class highlights
- feat: add liquid-glass filter + sync status panel on schedule
- feat: cache schedule locally with auto refresh
- feat: smooth schedule card hover/active motion
v0.7.25
2026-02-08
- feat: add week local-time toggle for schedule display
v0.7.24
2026-02-06
- fix: reduce hover flicker on schedule class cards
v0.7.23
2026-02-06
- fix: reduce schedule topbar hover flicker
v0.7.22
2026-02-05
- fix: lift schedule carousel and respect iOS safe area in footer
v0.7.21
2026-02-05
- fix: keep optional subject toggle aligned with long titles
v0.7.20
2026-02-05
- fix: clear unread badge after opening messages
- fix: keep teacher subject toggle from overflowing long names
v0.7.19
2026-02-05
- feat: show unread messages badge on mobile menu button
v0.7.18
2026-02-05
- fix: prevent light-theme select arrow tiling
v0.7.17
2026-02-05
- fix: normalize light-theme select arrows in teacher subjects
v0.7.16
2026-02-05
- fix: dim disabled group select in teacher subjects (dark theme)
v0.7.15
2026-02-05
- fix: dedupe teacher subject catalog
- fix: align teacher subject selector styles with dark theme
v0.7.14
2026-02-05
- chore: remove remember me from login/register
v0.7.13
2026-02-05
- fix: allow optional links on mobile for custom deadlines
v0.7.12
2026-02-05
- fix: ensure teamwork back button is visible in dark theme
- fix: pass role/username into profile view
v0.7.11
2026-02-05
- fix: align My Day topbar on mobile
v0.7.10
2026-02-05
- fix: simplify teamwork topbar actions
v0.7.09
2026-02-05
- fix: pass role into teamwork view for unified topbar
v0.7.08
2026-02-05
- fix: restore bootstrap styles on My Day to prevent modal duplication
v0.7.07
2026-02-05
- fix: schedule list theme polish + select arrow animation
- fix: align My Day layout width with schedule
- fix: profile labels and light-theme button contrast
- fix: keep light-theme hover text readable
- fix: stabilize admin show/hide all sections
v0.7.06
2026-02-05
- feat: unify topbar and menu modal on profile, my-day, teamwork
v0.7.05
2026-02-05
- feat: add changelog modal in footer
v0.7.04
2026-02-04
- fix: include teacher requests in toggle all
- fix: tune schedule list theme
- fix: restore missing closures
- fix: restore admin route structure
v0.7.00
2026-02-04
- feat: move schedule list to paged admin view
- fix: homework logging for teacher multi-group
- fix: define teacher subject view mode
- fix: persist subject general flag
v0.6.x 1 релізів ›
v0.6.98
2026-02-03
- feat: teacher course flow and schedule integration
- Unify mobile menu modal across pages; tweak forbidden message
- Add mobile menu modal to My Day