Round 22: Exam Calendar, Tablet Grading, Student Achievements, Notification Center, Announcements, Styling
- Exam Calendar View: Teacher exam planning with calendar integration - Teachers create/modify exams, admin full CRUD, students read-only - CalendarEvent integration, 2-week warning, AI test availability badge - Monthly/weekly calendar view, list view, statistics - Tablet Grading View: Stylus annotation and AI grading audit - HTML5 Canvas with PointerEvent pressure sensitivity - Tool palette: pen, highlighter, eraser, text, stamp - Quick grade buttons (German 1-6 scale) - AI grading audit with detailed feedback and suggestions - Student Achievements View: Badges, XP, leaderboard - Badge collection grid with category filters - Level/XP system with progress bars - Leaderboard with opt-in - Daily/weekly challenges - Student Study Planner View: Pomodoro timer, weekly schedule - Pomodoro timer with focus score - Weekly study schedule with drag-and-drop - AI study recommendations - Session history and statistics - Notification Center View: Categories, filters, bulk actions - 6 categories, 4 priority levels - Real-time polling (10 seconds) - Preferences with quiet hours - Statistics charts - School Announcements View: CRUD, read receipts - 6 announcement types with gradient headers - Pin-to-top, read receipts, target audience - Admin/teacher create, students/parents view - Bug fixes: AnnouncementRead model user relation, User API schoolId field - i18n: 200+ new keys, breadcrumb navigation fixes - Styling: Gradient headers, animations, hover effects across all new views
This commit is contained in:
1 parent
9e22214470
commit
490bd0650f
30 files changed
+10844
-31
No files matched your search
@@ -2702,6 +2702,43 @@ export function deleteNotifications(ids?: string[]): Promise<{ success: boolean
|
||||
return apiDelete<{ success: boolean }>(`/api/notifications${ids ? `?ids=${ids.join(',')}` : ''}`);
|
||||
}
|
||||
|
||||
/* ── Notification Preferences ──────────────────────────────────── */
|
||||
|
||||
export interface NotificationPreferencesData {
|
||||
id: string;
|
||||
userId: string;
|
||||
schoolId: string;
|
||||
academicEnabled: boolean;
|
||||
behavioralEnabled: boolean;
|
||||
administrativeEnabled: boolean;
|
||||
calendarEnabled: boolean;
|
||||
communicationEnabled: boolean;
|
||||
systemEnabled: boolean;
|
||||
quietHoursStart: string | null;
|
||||
quietHoursEnd: string | null;
|
||||
quietHoursEnabled: boolean;
|
||||
emailDigestEnabled: boolean;
|
||||
emailDigestFrequency: string;
|
||||
}
|
||||
|
||||
export function fetchNotificationPreferences(): Promise<NotificationPreferencesData> {
|
||||
return apiGet<NotificationPreferencesData>('/api/notifications/preferences');
|
||||
}
|
||||
|
||||
export function updateNotificationPreferences(data: Partial<NotificationPreferencesData>): Promise<NotificationPreferencesData> {
|
||||
return apiPut<NotificationPreferencesData>('/api/notifications/preferences', data);
|
||||
}
|
||||
|
||||
/* ── Announcement Read Receipts ────────────────────────────────── */
|
||||
|
||||
export function markAnnouncementRead(announcementId: string): Promise<{ readReceipt: { id: string; announcementId: string; userId: string; readAt: string } }> {
|
||||
return apiPost('/api/announcements/' + announcementId + '/read', {});
|
||||
}
|
||||
|
||||
export function getAnnouncementReads(announcementId: string): Promise<{ reads: Array<{ id: string; userId: string; readAt: string; user: { id: string; firstName: string; lastName: string } }>; totalReads: number }> {
|
||||
return apiGet('/api/announcements/' + announcementId + '/read');
|
||||
}
|
||||
|
||||
/* ── Batch Delete & Reorder ─────────────────────────────────────────── */
|
||||
|
||||
export async function deleteBatchProgressEntries(ids: string[]): Promise<void> {
|
||||
|
||||
Reference in new issue
Block a user