Release Notes
London Film Academy · Attendance System

v2.5.2 — 23 Jul 2026

Feature

  • Register Conflicts page — a new staff-only audit page (/conflicts) lists every pair of active registers scheduled for the exact same date and time whose Group/Spare/Number/Sub filters could put the same student on both. Simultaneous Group A/B/C/D splits of the same batch are correctly excluded, since those never share students. Conflicts group registers by lesson, show each register's own completion stats, and link straight to its mark page; columns are click-to-sort with a sticky header.
  • Inline conflict warning on Create/Edit register — saving a register that collides with an existing one now shows a non-blocking amber warning naming the other register and lesson, instead of saving silently.
  • "Show older registers" toggle per lesson — registers older than 7 days are now collapsed by default within each lesson group; a "Show N older registers" toggle reveals them, and the shown/hidden state is remembered per lesson.

Improvement

  • Register list stats/actions regrouped for mobile — the status pills, completion badge, and action buttons on the batch register list now form a single block (stats above buttons) that drops cleanly below the date/lesson details on narrow screens, instead of wrapping awkwardly across three separate pieces.
  • Fully-marked registers highlighted — a register row with everyone marked is now tinted green on the register list, so completion is visible at a glance without reading the badge text.

Fix

  • Sticky Conflicts table header wasn't sticking — a shared table-wrapper style silently disabled position: sticky on the header row entirely (it just scrolled away like any other element); scoped a fix to the Conflicts table only.
  • Conflicts page completion badges had no colour — the badges reused colour variables that are only defined on other pages, so they silently rendered without their intended green/amber tint; the Conflicts page now defines its own.

v2.5.1 — 23 Jul 2026

Feature

  • Remove a student from a register — staff can now remove an individual student from an already-built register without a full filter rebuild, via a "Remove" control on each marking-list row. The removal is soft (auditable, reversible by re-adding) and blocked for non-managers once the student has already been marked.
  • Release Notes page — this page. A new public /release_notes route, linked from the footer app-version, using the same Markdown renderer as the Manual pages.

Improvement

  • "Schedule" renamed to "Register" throughout — the user-facing noun is now "Register"/"Registers" everywhere (page text, flash messages, CSV exports, both manuals). Internal identifiers (database tables/columns, routes, code) are unchanged.
  • Optional BCC on student-note notification emails — a second address can now quietly receive a copy of the student-note mailout, configured via an environment variable, without appearing in the To/Cc headers.

Fix

  • Dashboard/register/report attendance totals reconciled — the dashboard card, tutor completion report, register list badges, and register mark screen previously computed "marked" and "total" differently, so the same register could show as Complete on one page and Partial on another. All four now share the same alt-class exclusion and roster rules.
  • Orphaned rows on register deletion — deleting a register left its membership, extra-batch, tutor-assignment, and attendance rows behind with no cleanup and no database-level cascade; deletion now cleans up all four related tables.
  • Duplicate student row on the marking page — a student removed from a register but still holding an attendance record could appear both in the main list and in "Not on this register" at once.
  • Student stats popup losing history after removal — a student's own attendance history dropped any register they'd since been removed from, even though it was still visible elsewhere.
  • Dashboard total ignoring register filters — a newly created group/spare-filtered register showed the full batch size on the dashboard until first opened, instead of the filtered count.
  • Duplicate subtitle line on the Manual and Release Notes pages — the version subtitle was rendering twice; it's now sourced once from the app version so it can't drift out of sync.

v2.5.0 — 22 Jul 2026

A mix of new features, UI polish, and correctness fixes across attendance marking, registers, navigation, and admin tooling. No breaking changes.

Feature

  • Clickable stat-tile filters on the attendance stats bar — every tile in the per-register stats bar is now a click-to-filter toggle, on an expanded 8-tile grid with a new dedicated "Alt" tile. Counts stay fixed to the Number/Group/Spare/Sub filters and don't change when you click a status tile.
  • Email notification on student note add/change — tutors adding or editing a student note now trigger an email to Student Support, via a new dependency-free SMTP client with links back to the student's and tutor's back-office pages.
  • Sortable, collapsible lesson-register groups — registers now sort newest-first per lesson, collapse by default with a live count badge, and remember open/closed state per batch across reloads. Adding a register auto-expands, scrolls to, and highlights its lesson group.
  • My LFA / Logout dropdown on the header user icon — the header icon, previously a direct link, now opens a small dropdown with "My LFA" and "Logout".

Improvement

  • Fixed top-right toast notifications — the flash-message alert was redesigned into a fixed, Notyf-style toast with a pause/resume-on-hover countdown, replacing the old in-flow alert that could scroll out of view.
  • Sticky, highlight-on-scroll course/batch subtitle — the course/batch subtitle on the batch attendance and lessons pages now stays pinned below the header while scrolling, highlighted yellow while stuck.
  • Dashboard register cards show marked/total counts — cards now always display a live marked/total count (e.g. 12/24) instead of text states like "Not marked" or "Complete".
  • Batch completion badge shows register total — the batch-view completion badge label now includes the total register count alongside the completion state.

Fix

  • Alt Class students excluded from completion totals — students marked "Alt Class" were silently excluded from completion totals in five places — the per-register stats bar and three code paths behind the batch-view badge — making fully-marked registers look permanently unfinished.
  • Silent 100-row API cap truncating registers and attendance — three reads on the batch attendance page omitted an explicit row limit, silently dropping up to ~95% of records on larger batches.
  • Dashboard showing 0/0 for unsnapshotted registers — registers without a stored completion snapshot now compute a real total instead of falling back to 0/0.
  • Toasts never leaving the DOM after dismissal — an animation-fill-mode: both conflict was permanently pinning the entrance animation's properties, blocking the exit transition.
  • Header dropdown links unreadable in light theme — a global light-theme link-color rule was out-specifying the new dropdown's link styling; fixed by qualifying with the header's ID selector.

Admin / Infra

  • SSO client hardened — stopped sending client_secret on the /sso/authorize redirect.
  • Duplicate-entry errors on attendance/group upsert — fixed a race that could raise duplicate-key errors when saving attendance or group assignments.