Platform History

Changelog

A record of every release shipped to the ABS Case Platform.

v1.6.0SubmissionsCurrentJune 9, 2026
  • Professors can submit their own cases for editorial review from /my-proposals
  • Editors review, preview, and approve or return proposals in a new admin Submissions tab
  • Approval publishes the proposal to the catalog; rejection returns it for revision
  • Catalog now supports external and restricted cases with a proper access model
  • Exhibit uploads are available to all faculty, not just superadmins
Feature
  • Professor case submission workflow: draft → submit → editorial review → approve or reject
  • My Proposals workspace (/my-proposals) to start, track, and resubmit proposals by status
  • Submit Case flow reuses the admin case editor for sections, teaching note, exhibits, and reader preview
  • Admin Submissions tab: review proposals, preview the linked draft case in the reader, move under review, and approve or reject with notes
  • Approval publishes the linked draft case; rejection returns it to draft so the professor can revise and resubmit
  • Case access model: each case has a source type (ABS internal, external ABS faculty, Sustaineur), content access level (metadata only, abstract only, full internal), and request access (requestable or not), plus external link, contact email, and access notes
  • External and restricted cases show an Open external platform / View on Sustaineur link and access guidance instead of a request button
  • Exhibit image uploads opened from superadmin-only to all faculty roles
Improvement
  • Catalog cards and case detail respect the access model — request and read actions only appear when the case is requestable and fully internal
  • Restricted cases surface access notes and a contact email so faculty know how to obtain them
  • Compact, less cluttered Case Reader toolbar
  • Catalog filter groups are more keyboard- and screen-reader-accessible
  • Quieter professor request cards with reduced access-token noise
Fix
  • Root route now redirects reliably on the server (students to My Cases, faculty to Catalog)
  • Debug store inspector is gated to development only
Infrastructure
  • Drizzle migrations 0009 (case_submissions), 0010 (case_submission case link), and 0011 (case access model columns and constraints) applied to Supabase production
  • Backend: 305 tests passing, Frontend: 517 tests passing
  • TypeScript strict — tsc --noEmit clean on both sides
v1.5.0CohortsJune 4, 2026
  • Cohort analytics for professors, editors, and superadmins
  • Revoked student access remains visible and can be restored
  • Student redeem links route through login while preserving the token
  • Professor My Requests includes direct reader links and relative last activity
  • Admin tabs persist with URL state such as /admin?tab=users
Feature
  • Cohort analytics shows seat usage, average reading progress, completion counts, and per-student progress
  • Editors and superadmins can access cross-cohort analytics with professor attribution
  • Approved editor requests include a Check analytics shortcut filtered to the request
  • Professor request case titles link directly to the case reader
Improvement
  • Student My Cases cards show module, professor, expiry date, computed reading time, and explicit reread state
  • Cohort analytics deep links auto-expand and highlight the matching cohort
  • Last activity fields now use relative labels such as Just now, 1 hour ago, and Yesterday
  • Case Times taught is derived from approved/expired usage history
  • Case reading time is derived from actual section word count
Fix
  • Redeem links enforce expected student count and keep same-student re-entry idempotent
  • Redeem links opened without a student session redirect through login and preserve the token
  • Revoked students remain visible in rosters and can be granted access again
  • Admin case author and keyword fields preserve in-progress spaces
  • Admin section tabs persist in the URL across refresh and browser navigation
Infrastructure
  • Context files updated with production deploy and hosting migration guidance
  • Frontend and backend typecheck and Vitest suites rerun before production deploy
v1.4.1ExhibitsMay 31, 2026
  • Exhibits now support optional descriptions in admin and reader views
  • Image exhibits upload only when Save is clicked, reducing stray uploads during editing
  • Reader exhibit chips show the custom label without the redundant Exhibit N prefix
  • Section kicker headings are more legible relative to case body text
Feature
  • Optional exhibit description/caption field added to admin exhibit forms and reader exhibit surfaces
  • Admin exhibit rows now include a Preview action next to Edit and Delete
Improvement
  • Inline exhibit chips now render the custom exhibit label directly instead of repeating the Exhibit N prefix
  • Image exhibit uploads are deferred until Save, so draft file picks do not upload immediately
  • Reader section kicker headings use larger type for clearer hierarchy against body copy
Fix
  • Removed the direct exhibit image URL path so image exhibits follow a single validated upload flow
  • Admin case editing no longer fails after the exhibit description schema change once migration 0007 is applied
Infrastructure
  • Drizzle migration 0007 adds the optional description column to case_exhibits
  • Frontend and backend typecheck and Vitest suites rerun clean before production deploy
v1.4.0HardeningMay 29, 2026
  • Import case sections directly from a Word document (.docx)
  • Server-side authentication middleware — protected routes enforced before page load
  • Professor shortlists (bookmark cases) and persistent reading progress for students
  • Student content protection: copy, select-all, right-click, and print all blocked
Feature
  • Import from Word: upload a .docx file and auto-parse it into sections based on Heading 2 breaks
  • DocxImportPanel: preview detected sections, edit headings and content, auto-split long sections by word count
  • Info tooltip on the import button explaining Word formatting rules (H1 = title, H2 = section breaks)
  • Cookie-based server-side middleware guards for all protected routes (catalog, editor, admin, my-requests, my-cases)
  • Students blocked from /catalog at the middleware level
  • Professor shortlist: bookmark toggle on case detail + "Shortlisted" filter in catalog
  • Reading progress auto-saved per student per case — resume where you left off
  • Student content protection: copy, select-all (Cmd+A), right-click, Ctrl+P, and beforeprint all blocked document-wide
  • "Discussed in class" badge on student MyCaseCard when usage has expired
  • Teaching note preview modal with print-to-PDF
Improvement
  • Inline [Exhibit N] references rendered as distinct amber chips in the reader
  • Insert exhibit link button in TipTap toolbar for section editing
  • Reviewer name surfaced on approved/rejected request cards
  • Green access link box for approved professor requests
  • Toast notification system (ToastProvider + useToast hook)
  • Richer per-tab empty states in editor dashboard
  • Improved request success screen and re-request flow on rejected cards
  • Sort pill buttons and smart zero-results empty state in catalog
  • Reader: navbar hidden, fullscreen focus mode (F key), breadcrumbs removed for cleaner reading
Fix
  • Content protection listeners moved from article to document level — blocks copy/select-all even from the TOC sidebar
  • Text selection kept enabled for students so highlights and annotations still work
  • Exhibit upload auth check uses abs_role_type cookie instead of X-Mock-User header
  • Request modal replaces page instead of appending inline on case detail
  • ToastProvider properly wraps children in root layout
  • Global error boundary added for deployment version mismatches
Infrastructure
  • Drizzle migrations 0005 (shortlists) and 0006 (reading_progress) — both tables persisted in Postgres
  • Annotations fully persisted in Postgres (migration 0002) — not in-memory
  • Server-side middleware with 35 dedicated tests
  • Backend: 265 tests passing, Frontend: 421 tests passing
  • TypeScript strict — tsc --noEmit clean on both sides
v1.3.0ContentMay 25, 2026
  • Case content now stored as structured JSON for richer, more reliable rendering
  • Admin panel Users tab with full CRUD (add, edit, delete users)
  • Role-aware header normalization fixes admin access across sessions
Feature
  • Case section content stored as TipTap JSON (JSONB) alongside HTML — reader uses JSON when available
  • Teaching note content also stored as JSON with HTML fallback
  • Users tab in admin panel with add / edit / delete, role filter chips, and avatars
Improvement
  • Admin sidebar layout with counts, icon strip, and active-state ring
  • Stats strip in Cases tab doubles as status filter
  • getSectionHtml helper: JSON → generateHTML with clean HTML fallback for legacy content
Fix
  • X-Mock-User header now always sends email (not legacy role key) — fixes 403s after role switch
  • Teaching note JSON state synced from server after save
  • CaseDetailResponse type updated to include contentJson on teaching note
Infrastructure
  • Drizzle migration 0004: content_json jsonb column on case_sections and teaching_notes
  • 63 new tests (backend round-trip + frontend getSectionHtml unit tests)
  • TypeScript strict — npx tsc --noEmit clean on both sides
v1.2.0MobileMay 20, 2026
  • Full mobile responsiveness across all views
  • Design system alignment (African Excellence Framework)
  • Security and accessibility fixes
Feature
  • Mobile filter drawer in catalog with hamburger toggle and full-screen overlay
  • Mobile TOC drawer in case reader with Contents button
  • Scrollable tab strip in Editor Dashboard on mobile
  • Responsive stats grid (2-col on mobile, 4-col on desktop)
Improvement
  • Responsive padding and spacing on all breakpoints (catalog, detail, editor, NavBar)
  • Horizontal scroll for editor table on small screens
  • Export button hidden on mobile to prevent layout overflow
  • Shadow tokens aligned to spec (--shadow-soft / --shadow-card / --shadow-elevated)
  • Button padding, accent-bar sizing, and list markers aligned to DESIGN.md
  • Focus management on mobile drawers (WCAG 2.1 AA)
  • Keyboard focus rings on TiptapEditor toolbar buttons
Fix
  • Replaced dangerouslySetInnerHTML annotation renderer with safe React node approach
  • Fixed annotation overlap bug (sequential string splitting corrupted nested spans)
  • Removed unsafe `as never` type cast in TiptapEditor setContent
  • Replaced emoji usage (📄) with Icon component across admin panel
  • Hardcoded hex colours replaced with CSS design tokens
Infrastructure
  • 37 new tests covering mobile drawer behaviours
  • TiptapEditor test suite added
  • project-specific READMEs for frontend and backend
  • ARCHITECTURE.md with ER diagram, system overview, and user flow diagrams
v1.1.0ProfessorMay 18, 2026
  • Redesigned My Requests page
  • Enrollment stats — see how many students joined each module
  • Reviewer notes surfaced on rejected requests
Feature
  • Show enrolled student names and emails on approved request cards
  • Enrollment count badge (X / Y students enrolled) on approved cards
  • Reviewer note displayed on rejected request cards
  • Token link with expiry date on approved cards
  • Greyed expired link state when usage has expired
Improvement
  • My Requests page redesigned with card-based layout (African Excellence Framework)
  • Status badges with colour-coded states (pending/approved/rejected/expired)
  • Empty state illustration when no requests exist
v1.0.0FoundationMay 10, 2026
  • Complete end-to-end MVP: catalog → request → approve → redeem → read
  • Role-based access for professors, editors, students, and superadmins
  • Admin panel for case, section, and vocabulary management
Feature
  • Case catalog with live search, 7 filter groups, and 4 sort modes
  • Case detail pages with abstract, keywords, materials, and discussion questions
  • Case reader with section-by-section navigation, progress tracking, and annotations
  • Request flow: professor selects program/module/dates, editor approves or rejects
  • Editor dashboard with Pending / Approved / Rejected / Expired tabs
  • Token-based student access: redeem URL → StudentCaseAccess
  • Student My Cases view with Read link
  • Superadmin panel: Cases CRUD, Section editor, Teaching notes, Meta vocabularies, Programs
  • Role-aware NavBar and mock login with DevRolePicker
  • PostgreSQL schema via Drizzle ORM (10 tables)
Infrastructure
  • Hono backend with repository pattern (InMemoryRepository for tests, PostgresRepository for server)
  • Next.js 15 App Router frontend with TypeScript strict
  • 180+ backend tests, 170+ frontend tests
  • 6 seed cases (OCP, Attijariwafa, M-KOPA, Dangote, Marjane, MTN)
  • 18 mock users across all roles
  • Bruno API collection for manual testing