feat: integrate client requirements (courseware, communication, notifications, FAQ, enhanced approvals)

Add 4 new Odoo modules coverage:
- encoach_courseware: chapters, materials, chapter progress, AI workbench
- encoach_communication: discussion boards, announcements, messaging
- encoach_notification: notification engine, rules, preferences
- encoach_faq: FAQ categories and items, role-filtered

Frontend changes:
- 4 new type files (courseware, communication, notification, faq)
- 5 new service files (courseware, communication, notification, faq, plagiarism)
- 4 new hook files (useCourseware, useCommunication, useNotifications, useFaq)
- 15 new page components (teacher: chapters, chapter detail, AI workbench,
  discussions, announcements; student: chapter view, discussions, announcements,
  messages, journey; admin: FAQ manager, notification rules, approval config;
  public: official exam access, FAQ page)
- Updated App.tsx routing with all new pages
- Updated TeacherLayout, StudentLayout, AdminLmsLayout sidebars

SRS updates:
- ENCOACH_UNIFIED_SRS.md: added Parts IX-XI (Courseware, Communication,
  Notifications/FAQ), enhanced exam management (exercise vs exam, official
  access modes), enhanced approval workflows (timed stages, escalation,
  bypass), enhanced assignments (late submissions, extensions), plagiarism
  detection. Total modules: 35
- ENCOACH_ODOO19_BACKEND_SRS.md v2.0: added sections 26-31, updated module
  inventory to 35, updated endpoint count to 280+, added enhanced assignment
  models with late submission/extension support

Made-with: Cursor
This commit is contained in:
Talal Sharabi
2026-03-27 00:20:30 +04:00
parent 19d7e01be1
commit 5980451ea8
38 changed files with 4849 additions and 63 deletions

View File

@@ -153,4 +153,20 @@ export const queryKeys = {
list: (params?: Record<string, unknown>) => ["subject-registrations", "list", params] as const,
available: (params?: Record<string, unknown>) => ["subject-registrations", "available", params] as const,
},
chapters: (courseId: number) => ["chapters", "list", courseId] as const,
chapter: (id: number) => ["chapters", "detail", id] as const,
chapterMaterials: (chapterId: number) => ["chapter-materials", chapterId] as const,
chapterProgress: (chapterId: number) => ["chapter-progress", chapterId] as const,
discussionBoards: (params?: Record<string, unknown>) => ["discussion-boards", params] as const,
posts: (boardId: number, params?: Record<string, unknown>) => ["posts", boardId, params] as const,
announcements: (params?: Record<string, unknown>) => ["announcements", params] as const,
messages: (params?: Record<string, unknown>) => ["messages", params] as const,
sentMessages: (params?: Record<string, unknown>) => ["messages", "sent", params] as const,
unreadMessages: ["messages", "unread-count"] as const,
notifications: (params?: Record<string, unknown>) => ["notifications", params] as const,
unreadNotifications: ["notifications", "unread-count"] as const,
notificationRules: ["notification-rules"] as const,
notificationPreferences: ["notification-preferences"] as const,
faqCategories: (audience?: string) => ["faq", "categories", audience] as const,
faqItems: (params?: Record<string, unknown>) => ["faq", "items", params] as const,
};