Files
Yamen Ahmad d5b1987bba feat(platform): full institutional roadmap — exam security, live sessions, handwritten, personalized AI plans, Turnitin, lesson polish
Backend (encoach_lms_api):
- New models: encoach.exam.security.event, encoach.live.session,
  encoach.live.session.participant, encoach.handwritten.submission.
- Extended: encoach.exam.custom (security_level, single_attempt,
  suspicious_event_threshold), encoach.course.plan (is_personalized,
  personalized_for_id, weakness_summary), encoach.entity (turnitin_*).
- New controllers / 24 endpoints:
  * exam_security: POST /api/exam/security/event,
    GET /api/exam/single-attempt-check,
    GET /api/teacher/exam/<id>/security/events,
    GET /api/teacher/exam/attempt/<id>/security/events,
    GET /api/teacher/exam/<id>/live.
  * live_sessions: full CRUD + /notify, /join, /leave, /end,
    /recording, /remove-participant, /attendance, /ics
    (RFC-5545 iCalendar with VALARM + ATTENDEE/ORGANIZER, attached to
    invite emails so Gmail/Outlook/Apple Mail prompt to add).
  * personalized_plan: GET/POST /api/student/personalized-plan
    (CEFR / weeks / focus / grammar_focus payloads).
  * handwritten: student upload + AI grading (pytesseract OCR +
    OpenAI scoring) + teacher review override.
  * reports_export: CSV + PDF export for student-performance and
    record reports.
  * turnitin: per-entity settings (admin), test connection, submit
    text. Real upload stubbed pending institutional API key.
- Manifest: depends now lists encoach_scoring, encoach_exam_template,
  encoach_ai_course so security/live-session models load cleanly.
- teacher_insights.py: fixed assignment traversal via op.batch.course_id,
  res.users mapping, and capped rate_completed at 100% (unique
  student/exam pairs).
- reports.py: branch_id / subject_id / gender filters wired into the
  Reports stack.

Frontend:
- New services: examSecurity, liveSession, personalizedPlan,
  handwritten, turnitin, reportsExport.
- New pages: LiveSessionsPage, LiveSessionRoom (Jitsi IframeAPI embed
  with host bar — Mute all / Cams off / per-row Ask-to-unmute /
  Remove + log audit reason, kickParticipant after backend audit POST),
  TurnitinSettings (admin), TeacherTestSessionConsole, AddToCalendar
  per-card .ics button.
- New components: PersonalizedPlanCard (Quick generate + Customize
  dialog: CEFR, weeks, focus, 9-checkbox grammar), AITutorAvatar,
  HandwrittenSubmissionPanel, ImageLightbox, InfographicBlock
  (six-tone callout with key-based auto-detect — did_you_know,
  key_takeaway, tip, objective, common_mistakes, etc.), ExportButtons.
- useExamSecurity hook: tab/blur, copy/paste/cut, fullscreen exit,
  suspicious shortcuts; debounced auto-post + auto-lock callback.
- StudentCourseDetail / TeacherCourseInsights: discussion now
  embedded as a per-course tab.
- StudentCourses: unified My Courses + My Course Plan with
  is_mandatory color-coding + Accredited Core / Supplementary
  sections (always rendered, with empty states).
- MaterialBookView: special-cases image keys into ImageLightbox,
  routes infographic-style keys into colored InfographicBlock cards,
  splits long strings into paragraphs, rounded-2xl shadow-sm wrapper.
- MaterialViewer: ImageViewer now uses lightbox, ArticleViewer is
  now a real <article class="prose">.
- Layout shells: Live Sessions in Student/Teacher sidebars, Turnitin
  in Admin sidebar; EN + AR i18n keys.
- App.tsx: lazy routes for /live, /live/:id,
  /teacher/exam/:assignmentId/console, /admin/turnitin.
- Visual identity refresh: warm cream bg, white sidebar with charcoal
  active pills, dark CTA buttons, bright orange accents,
  rounded-2xl cards.

Verification:
- All 12 new endpoints smoke-tested via curl (200 + sane payloads).
- /api/live-sessions/<id>/ics returns valid 23-line VCALENDAR.
- Frontend tsc --noEmit clean.
- Odoo restarted successfully (registry loaded in 0.77s, no errors).
- docs/PROJECT_SUMMARY.md updated with both today's polish + the
  full Phase 2/3/4 rollout for the record.

Status: 27/29 institutional requirements fully wired. Turnitin
upload + LMS-side breakout/poll persistence remain partial (see
PROJECT_SUMMARY for details).

Made-with: Cursor
2026-04-30 14:06:48 +04:00
..

EnCoach Frontend — v2

Branching Workflow

This repo is connected to the staging server via a Git post-receive hook. All deployment is automatic — but only after code review approval.

How to contribute

  1. Never push directly to main — branch protection will block it.
  2. Push your changes to your feature branch (e.g. feature/full-frontend-v1)
  3. Open a Pull Request on Gitea targeting main
  4. Request review from devops (Talal)
  5. Once approved and merged, the staging server rebuilds and redeploys automatically.

Environment

The .env file is not committed. It lives only on the staging server at /opt/encoach/frontend-v2/.env.


EnCoach — Adaptive Learning Platform (Frontend)

The frontend application for the EnCoach Adaptive Learning Platform, serving UTAS university students and freelance learners across IELTS, Mathematics, and IT courses.

Built with React 18, TypeScript, and Vite. Connects to an Odoo 19 backend via REST API.

Tech Stack

Layer Technology
Framework React 18 + TypeScript
Build Vite 5 (SWC)
Routing React Router v6
State / Data TanStack Query v5, React Context
UI Components shadcn/ui + Radix UI
Styling Tailwind CSS 3
Forms react-hook-form + Zod validation
Charts Recharts
Icons Lucide React

Architecture

src/
├── components/         # Shared UI, layouts, AI components
│   ├── ai/             # 14 AI-powered components (coaching, grading, insights)
│   └── ui/             # shadcn/ui primitives
├── contexts/           # AuthContext (JWT session management)
├── hooks/
│   ├── queries/        # TanStack Query hooks (exams, assignments, LMS, adaptive)
│   └── usePermissions  # Entity-scoped permission checks
├── lib/
│   ├── api-client.ts   # Centralized HTTP client with JWT + 401 interception
│   └── query-client.ts # TanStack Query configuration
├── pages/
│   ├── admin/          # Admin & LMS management (courses, batches, taxonomy, resources)
│   ├── student/        # Student portal (dashboard, courses, adaptive learning flow)
│   └── teacher/        # Teacher portal (courses, assignments, attendance, grading)
├── services/           # 21 API service modules mapped to Odoo endpoints
└── types/              # 14 TypeScript type definition files

Key Features

  • 7 User Roles — Student, Teacher, Admin, Corporate, Master Corporate, Agent, Developer
  • Adaptive Learning Engine — Diagnostic assessment, proficiency profiling, AI-generated learning plans, topic-level content delivery
  • LMS Integration — Course management, batches, timetables, attendance, grades (OpenEduCat via API)
  • Exam Portal — IELTS-style exams with AI grading, writing evaluation, speaking assessment
  • 14 AI Components — Study coach, writing helper, grading assistant, risk detection, insights panel, batch optimizer, report narratives
  • Entity-Scoped Permissions — Fine-grained access control with 77+ permission types
  • Multi-Subject Support — IELTS (English), Mathematics, IT — all using a universal subject taxonomy

Getting Started

Prerequisites

  • Node.js 18+ (or Bun)
  • Odoo 19 backend running (see docs/ODOO_BACKEND_SRS_v3.md)

Setup

# Clone the repository
git clone https://git.albousalh.com/devops/encoach_frontend_new_v1.git
cd encoach_frontend_new_v1

# Install dependencies
npm install

# Configure environment
cp .env.example .env.development

# Start development server
npm run dev

The app runs on http://localhost:8080 by default.

Environment Variables

Variable Description Default
VITE_API_BASE_URL Odoo backend API base URL http://localhost:8069/api
VITE_APP_NAME Application display name EnCoach

Scripts

Command Description
npm run dev Start dev server with HMR
npm run build Production build
npm run build:dev Development build
npm run preview Preview production build
npm run lint Run ESLint
npm run test Run tests
npm run test:watch Run tests in watch mode

Documentation

All project documentation is in the docs/ folder:

Document Purpose
ENCOACH_UNIFIED_SRS.md Master Software Requirements Specification
ODOO_BACKEND_SRS_v3.md Backend developer handoff (Odoo modules + API contract)
ENCOACH_PRODUCT_DESCRIPTION.md Non-technical product overview
UTAS_MASTER_PLAN.md Project timeline and milestones
MATH_IT_ADAPTIVE_LEARNING_SRS.md Adaptive learning engine specification

Backend API

The frontend expects an Odoo 19 backend exposing REST endpoints under /api/. All service modules in src/services/ map directly to the API contract defined in docs/ODOO_BACKEND_SRS_v3.md.

Authentication uses JWT tokens stored in localStorage, with automatic 401 interception and redirect to login.

License

Proprietary — EnCoach Platform. All rights reserved.