- Header: trim menu to My Work section (My Lessons, My Classes, Lesson Plans), School Admin (gated), Platform Admin (gated) - MyClassesPage: fix loading/error state destructure (classesLoading not myClassesLoading) - NotFound: fix ErrorOutline -> ErrorOutlineIcon to prevent 404 page crash - timetableService: getMyClasses now calls both /me/teacher and /me/student, merges with role annotation - timetableStore: myClasses type updated to ClassWithRole[] - timetable.types: add ClassWithRole interface and code/institute_id optional fields to Class Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
272 lines
6.2 KiB
TypeScript
272 lines
6.2 KiB
TypeScript
/**
|
|
* Timetable System Type Definitions
|
|
* Comprehensive types for classes, timetables, lessons, and enrollment
|
|
*/
|
|
|
|
// ============================================================================
|
|
// Enums
|
|
// ============================================================================
|
|
|
|
export type EnrollmentStatus = 'pending' | 'approved' | 'rejected';
|
|
export type LessonStatus = 'scheduled' | 'completed' | 'cancelled';
|
|
export type TimetableType = 'adhoc' | 'recurring';
|
|
export type DayOfWeek = 0 | 1 | 2 | 3 | 4 | 5 | 6; // 0 = Sunday
|
|
|
|
// ============================================================================
|
|
// Base Interfaces
|
|
// ============================================================================
|
|
|
|
export interface Class {
|
|
id: string;
|
|
name: string;
|
|
subject: string;
|
|
school_year: string;
|
|
academic_term: string;
|
|
description?: string;
|
|
created_by: string;
|
|
created_at: string;
|
|
updated_at: string;
|
|
is_active: boolean;
|
|
code?: string;
|
|
institute_id?: string;
|
|
}
|
|
|
|
export interface ClassWithRole extends Class {
|
|
role: 'teacher' | 'student' | 'assistant';
|
|
status: string;
|
|
class_id?: string;
|
|
is_primary_teacher?: boolean;
|
|
}
|
|
|
|
export interface ClassTeacher {
|
|
id: string;
|
|
class_id: string;
|
|
teacher_id: string;
|
|
is_primary: boolean;
|
|
assigned_at: string;
|
|
}
|
|
|
|
export interface ClassStudent {
|
|
id: string;
|
|
class_id: string;
|
|
student_id: string;
|
|
enrolled_at: string;
|
|
}
|
|
|
|
export interface Timetable {
|
|
id: string;
|
|
class_id: string;
|
|
name: string;
|
|
type: TimetableType;
|
|
start_date: string;
|
|
end_date: string;
|
|
recurrence_rule?: string;
|
|
is_active: boolean;
|
|
created_by: string;
|
|
created_at: string;
|
|
updated_at: string;
|
|
}
|
|
|
|
export interface TimetableTeacher {
|
|
id: string;
|
|
timetable_id: string;
|
|
teacher_id: string;
|
|
is_primary: boolean;
|
|
assigned_at: string;
|
|
}
|
|
|
|
export interface TimetableLesson {
|
|
id: string;
|
|
timetable_id: string;
|
|
day_of_week: DayOfWeek;
|
|
start_time: string; // HH:MM format
|
|
end_time: string; // HH:MM format
|
|
room?: string;
|
|
max_students?: number;
|
|
created_at: string;
|
|
}
|
|
|
|
export interface Lesson {
|
|
id: string;
|
|
timetable_id: string;
|
|
lesson_definition_id: string;
|
|
scheduled_date: string;
|
|
start_time: string;
|
|
end_time: string;
|
|
room?: string;
|
|
status: LessonStatus;
|
|
cancellation_reason?: string;
|
|
created_at: string;
|
|
updated_at: string;
|
|
}
|
|
|
|
export interface LessonWhiteboard {
|
|
id: string;
|
|
lesson_id: string;
|
|
whiteboard_id: string;
|
|
student_id?: string;
|
|
created_at: string;
|
|
}
|
|
|
|
export interface EnrollmentRequest {
|
|
id: string;
|
|
class_id: string;
|
|
student_id: string;
|
|
status: EnrollmentStatus;
|
|
request_message?: string;
|
|
response_message?: string;
|
|
created_at: string;
|
|
updated_at: string;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Profile Interfaces (for joins)
|
|
// ============================================================================
|
|
|
|
export interface UserProfile {
|
|
id: string;
|
|
email: string;
|
|
full_name?: string;
|
|
avatar_url?: string;
|
|
role: 'teacher' | 'student' | 'admin';
|
|
}
|
|
|
|
// ============================================================================
|
|
// Extended Interfaces (with relations)
|
|
// ============================================================================
|
|
|
|
export interface ClassWithRelations extends Class {
|
|
teachers?: Array<ClassTeacher & { profile: UserProfile }>;
|
|
students?: Array<ClassStudent & { profile: UserProfile }>;
|
|
timetables?: Timetable[];
|
|
enrollment_requests?: Array<EnrollmentRequestWithProfile>;
|
|
student_count?: number;
|
|
}
|
|
|
|
export interface TimetableWithRelations extends Timetable {
|
|
class?: Class;
|
|
teachers?: Array<TimetableTeacher & { profile: UserProfile }>;
|
|
lessons?: TimetableLesson[];
|
|
lesson_instances?: Lesson[];
|
|
}
|
|
|
|
export interface LessonWithRelations extends Lesson {
|
|
timetable?: TimetableWithRelations;
|
|
whiteboards?: Array<LessonWhiteboard & { whiteboard: { id: string; name: string } }>;
|
|
}
|
|
|
|
export interface EnrollmentRequestWithProfile extends EnrollmentRequest {
|
|
student?: UserProfile;
|
|
class?: Class;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Request/Response Types
|
|
// ============================================================================
|
|
|
|
export interface CreateClassRequest {
|
|
name: string;
|
|
subject: string;
|
|
school_year: string;
|
|
academic_term: string;
|
|
description?: string;
|
|
}
|
|
|
|
export interface UpdateClassRequest {
|
|
name?: string;
|
|
subject?: string;
|
|
school_year?: string;
|
|
academic_term?: string;
|
|
description?: string;
|
|
is_active?: boolean;
|
|
}
|
|
|
|
export interface CreateTimetableRequest {
|
|
class_id: string;
|
|
name: string;
|
|
type: TimetableType;
|
|
start_date: string;
|
|
end_date: string;
|
|
recurrence_rule?: string;
|
|
}
|
|
|
|
export interface UpdateTimetableRequest {
|
|
name?: string;
|
|
start_date?: string;
|
|
end_date?: string;
|
|
recurrence_rule?: string;
|
|
is_active?: boolean;
|
|
}
|
|
|
|
export interface CreateTimetableLessonRequest {
|
|
day_of_week: DayOfWeek;
|
|
start_time: string;
|
|
end_time: string;
|
|
room?: string;
|
|
max_students?: number;
|
|
}
|
|
|
|
export interface UpdateTimetableLessonRequest {
|
|
day_of_week?: DayOfWeek;
|
|
start_time?: string;
|
|
end_time?: string;
|
|
room?: string;
|
|
max_students?: number;
|
|
}
|
|
|
|
export interface GenerateLessonsRequest {
|
|
start_date: string;
|
|
end_date: string;
|
|
}
|
|
|
|
export interface CancelLessonRequest {
|
|
reason: string;
|
|
}
|
|
|
|
export interface EnrollmentResponseRequest {
|
|
status: 'approved' | 'rejected';
|
|
response_message?: string;
|
|
}
|
|
|
|
export interface CreateEnrollmentRequest {
|
|
message?: string;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Filter and Pagination Types
|
|
// ============================================================================
|
|
|
|
export interface ClassFilters {
|
|
subject?: string;
|
|
school_year?: string;
|
|
academic_term?: string;
|
|
search?: string;
|
|
skip?: number;
|
|
limit?: number;
|
|
}
|
|
|
|
export interface TimetableFilters {
|
|
class_id?: string;
|
|
type?: TimetableType;
|
|
is_active?: boolean;
|
|
skip?: number;
|
|
limit?: number;
|
|
}
|
|
|
|
export interface LessonFilters {
|
|
timetable_id?: string;
|
|
start_date?: string;
|
|
end_date?: string;
|
|
status?: LessonStatus;
|
|
skip?: number;
|
|
limit?: number;
|
|
}
|
|
|
|
export interface PaginatedResponse<T> {
|
|
items: T[];
|
|
total: number;
|
|
skip: number;
|
|
limit: number;
|
|
}
|
|
|