app/src/types/timetable.types.ts
Agent Zero 11c139b410 feat(timetable): add page components, services, stores and types
- Add timetable page components:
  - ClassesListPage.tsx (browse and search classes)
  - MyClassesPage.tsx (student enrolled classes)
  - EnrollmentRequestsPage.tsx (teacher approval interface)
  - TimetablePage.tsx (weekly schedule view)
  - LessonViewPage.tsx (TLDraw-integrated lesson view)
- Add timetableService.ts for API communication
- Add timetableStore.ts for state management
- Add timetable.types.ts for TypeScript definitions
- Add common components (LoadingSpinner, ErrorMessage, EmptyState)
- Add .env.development with local development configuration
2026-02-26 03:27:46 +00:00

263 lines
6.0 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;
}
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;
}