From 3882787e50c6d90a6f4d5488e54bd337ddae099f Mon Sep 17 00:00:00 2001 From: joylessorchid Date: Mon, 16 Mar 2026 05:50:39 +0300 Subject: [PATCH] feat: add Olympiads module and redesign course UI - Add LMS Olympiad, Participant, Result doctypes with full API - Add Olympiads pages (list, detail, leaderboard, registration) - Redesign CourseCard with hover animations, badges, progress bar - Improve Courses page with hero banner and filters - Add Olympiads route and sidebar navigation entry - Add CLAUDE.md project documentation Co-Authored-By: Claude Sonnet 4.6 --- CLAUDE.md | 81 ++++ frontend/src/components/CourseCard.vue | 229 +++++---- frontend/src/pages/Courses/Courses.vue | 90 ++-- frontend/src/pages/Olympiads/OlympiadCard.vue | 131 +++++ .../src/pages/Olympiads/OlympiadDetail.vue | 452 ++++++++++++++++++ frontend/src/pages/Olympiads/Olympiads.vue | 130 +++++ frontend/src/router.js | 11 + frontend/src/utils/index.js | 6 + lms/lms/api.py | 187 ++++++++ lms/lms/doctype/lms_olympiad/__init__.py | 0 .../doctype/lms_olympiad/lms_olympiad.json | 218 +++++++++ lms/lms/doctype/lms_olympiad/lms_olympiad.py | 45 ++ .../lms_olympiad_participant/__init__.py | 0 .../lms_olympiad_participant.json | 116 +++++ .../lms_olympiad_participant.py | 41 ++ .../doctype/lms_olympiad_result/__init__.py | 0 .../lms_olympiad_result.json | 127 +++++ .../lms_olympiad_result.py | 32 ++ 18 files changed, 1741 insertions(+), 155 deletions(-) create mode 100644 CLAUDE.md create mode 100644 frontend/src/pages/Olympiads/OlympiadCard.vue create mode 100644 frontend/src/pages/Olympiads/OlympiadDetail.vue create mode 100644 frontend/src/pages/Olympiads/Olympiads.vue create mode 100644 lms/lms/doctype/lms_olympiad/__init__.py create mode 100644 lms/lms/doctype/lms_olympiad/lms_olympiad.json create mode 100644 lms/lms/doctype/lms_olympiad/lms_olympiad.py create mode 100644 lms/lms/doctype/lms_olympiad_participant/__init__.py create mode 100644 lms/lms/doctype/lms_olympiad_participant/lms_olympiad_participant.json create mode 100644 lms/lms/doctype/lms_olympiad_participant/lms_olympiad_participant.py create mode 100644 lms/lms/doctype/lms_olympiad_result/__init__.py create mode 100644 lms/lms/doctype/lms_olympiad_result/lms_olympiad_result.json create mode 100644 lms/lms/doctype/lms_olympiad_result/lms_olympiad_result.py diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..5992d97d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,81 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Frappe LMS — full-stack Learning Management System. Fork of the official Frappe LMS app. + +- **Backend:** Frappe Framework (Python 3.10+), 77 Doctypes +- **Frontend:** Vue 3 + Vite + TailwindCSS + Frappe UI +- **Testing:** Cypress E2E + +## Commands + +### Frontend Development +```bash +cd frontend +yarn dev # Dev server +yarn build # Build to /lms/public/frontend/ +yarn lint # ESLint +``` + +### Root Level +```bash +npm run dev # Same as frontend yarn dev +npm run build # Same as frontend yarn build +npm test-local # Open Cypress test runner +``` + +### Backend (requires Frappe bench) +```bash +bench start # Start all services (Frappe, Redis, Worker) +bench --site [site] migrate # Run DB migrations after pulling +bench --site [site] build # Rebuild frontend assets +bench run-tests --app lms # Run backend tests +``` + +### Docker (development) +```bash +docker compose up -d # Start all services +``` + +## Architecture + +### Frontend (`frontend/src/`) +- **`pages/`** — Page-level components (CourseDetail, Lesson, Batch, Quiz, etc.) +- **`components/`** — Reusable UI components +- **`stores/`** — Pinia state: `user`, `session`, `settings`, `sidebar` +- **`utils/`** — Helper functions +- Vue Router base path: `/lms` + +**Data fetching:** Frappe UI's `createResource` / `createListResource` for all API calls. No manual fetch() calls. + +### Backend (`lms/lms/`) +- **`doctype/`** — 77 Frappe Doctypes (Course, LMS Batch, Course Lesson, Quiz, LMS Assignment, Certification, etc.) +- **`api.py`** — All `@frappe.whitelist()` API endpoints callable from frontend +- **`utils.py`** — Shared backend helpers +- **`hooks.py`** — Frappe app configuration (permissions, integrations, scheduled tasks) +- **`plugins.py`** — Plugin system for customization +- **`patches/`** — DB migration patches (v0_0, v1_0, v2_0) + +### Key Concepts + +**DocType hierarchy:** `Course → Course Chapter → Course Lesson` +**Enrollment:** `Batch Enrollment` links user to `LMS Batch` +**Assessments:** Quiz, LMS Assignment, LMS Assessment are separate doctypes +**User roles:** Learner, Instructor, Evaluator, Course Creator, Batch Observer + +## Commit Convention + +Uses semantic commits (enforced by commitlint): +``` +feat: add new feature +fix: bug fix +chore: maintenance +docs: documentation +``` + +## Build Output + +Vite builds frontend to `/lms/public/frontend/` and copies entry to `/lms/www/lms.html`. diff --git a/frontend/src/components/CourseCard.vue b/frontend/src/components/CourseCard.vue index 0e63c036..c65499e4 100644 --- a/frontend/src/components/CourseCard.vue +++ b/frontend/src/components/CourseCard.vue @@ -1,146 +1,162 @@ + - diff --git a/frontend/src/pages/Courses/Courses.vue b/frontend/src/pages/Courses/Courses.vue index ed1c0902..1da012cf 100644 --- a/frontend/src/pages/Courses/Courses.vue +++ b/frontend/src/pages/Courses/Courses.vue @@ -46,51 +46,63 @@ -
-
-
- {{ __('All Courses') }} + + +
+
+
+ + + {{ __('Courses') }} +
-
- - -
- -
-
+
+ +
+ +
+ +
+
+