141 lines
3.8 KiB
Dart
141 lines
3.8 KiB
Dart
import '../core/utils/safe_convert.dart';
|
|
import 'attendance.dart';
|
|
import 'student.dart';
|
|
import 'timetable.dart';
|
|
|
|
class Announcement {
|
|
final int id;
|
|
final String name;
|
|
final String date;
|
|
final String summary;
|
|
|
|
const Announcement({
|
|
required this.id,
|
|
required this.name,
|
|
required this.date,
|
|
required this.summary,
|
|
});
|
|
|
|
factory Announcement.fromJson(Map<String, dynamic> json) {
|
|
return Announcement(
|
|
id: SafeConvert.toSafeInt(json['id']),
|
|
name: SafeConvert.toSafeString(json['name']),
|
|
date: SafeConvert.toSafeString(json['date']),
|
|
summary: SafeConvert.toSafeString(json['summary']),
|
|
);
|
|
}
|
|
}
|
|
|
|
class DashboardExam {
|
|
final int id;
|
|
final String name;
|
|
final String state;
|
|
final String? startDate;
|
|
|
|
const DashboardExam({
|
|
required this.id,
|
|
required this.name,
|
|
required this.state,
|
|
this.startDate,
|
|
});
|
|
|
|
factory DashboardExam.fromJson(Map<String, dynamic> json) {
|
|
return DashboardExam(
|
|
id: SafeConvert.toSafeInt(json['id']),
|
|
name: SafeConvert.toSafeString(json['name']),
|
|
state: SafeConvert.toSafeString(json['state'], 'scheduled'),
|
|
startDate: SafeConvert.toNullableString(json['start_date']),
|
|
);
|
|
}
|
|
}
|
|
|
|
class DashboardResult {
|
|
final int id;
|
|
final NamedRecord? exam;
|
|
final double percentage;
|
|
final String? grade;
|
|
final String status;
|
|
|
|
const DashboardResult({
|
|
required this.id,
|
|
this.exam,
|
|
required this.percentage,
|
|
this.grade,
|
|
required this.status,
|
|
});
|
|
|
|
factory DashboardResult.fromJson(Map<String, dynamic> json) {
|
|
return DashboardResult(
|
|
id: SafeConvert.toSafeInt(json['id']),
|
|
exam: NamedRecord.fromNullableJson(json['exam']),
|
|
percentage: SafeConvert.toSafeDouble(json['percentage']),
|
|
grade: SafeConvert.toNullableString(json['grade']),
|
|
status: SafeConvert.toSafeString(json['status'], 'pass'),
|
|
);
|
|
}
|
|
}
|
|
|
|
class DashboardStudent {
|
|
final int id;
|
|
final String fullName;
|
|
final NamedRecord? program;
|
|
|
|
const DashboardStudent({
|
|
required this.id,
|
|
required this.fullName,
|
|
this.program,
|
|
});
|
|
|
|
factory DashboardStudent.fromJson(Map<String, dynamic> json) {
|
|
return DashboardStudent(
|
|
id: SafeConvert.toSafeInt(json['id']),
|
|
fullName: SafeConvert.toSafeString(json['full_name']),
|
|
program: NamedRecord.fromNullableJson(json['program']),
|
|
);
|
|
}
|
|
}
|
|
|
|
class DashboardData {
|
|
final DashboardStudent? student;
|
|
final AttendanceSummary attendance;
|
|
final List<TimetableSlot> todayTimetable;
|
|
final List<DashboardExam> upcomingExams;
|
|
final List<DashboardResult> recentResults;
|
|
final List<Announcement> announcements;
|
|
|
|
const DashboardData({
|
|
this.student,
|
|
required this.attendance,
|
|
required this.todayTimetable,
|
|
required this.upcomingExams,
|
|
required this.recentResults,
|
|
required this.announcements,
|
|
});
|
|
|
|
factory DashboardData.fromJson(Map<String, dynamic> json) {
|
|
final studentMap = SafeConvert.toNullableMap(json['student']);
|
|
final attendanceMap = SafeConvert.toNullableMap(json['attendance']) ?? {};
|
|
|
|
return DashboardData(
|
|
student: studentMap != null ? DashboardStudent.fromJson(studentMap) : null,
|
|
attendance: AttendanceSummary.fromJson(attendanceMap),
|
|
todayTimetable: SafeConvert.toSafeList(
|
|
json['today_timetable'],
|
|
(item) => TimetableSlot.fromJson(SafeConvert.toNullableMap(item) ?? {}),
|
|
),
|
|
upcomingExams: SafeConvert.toSafeList(
|
|
json['upcoming_exams'],
|
|
(item) => DashboardExam.fromJson(SafeConvert.toNullableMap(item) ?? {}),
|
|
),
|
|
recentResults: SafeConvert.toSafeList(
|
|
json['recent_results'],
|
|
(item) => DashboardResult.fromJson(SafeConvert.toNullableMap(item) ?? {}),
|
|
),
|
|
announcements: SafeConvert.toSafeList(
|
|
json['announcements'],
|
|
(item) => Announcement.fromJson(SafeConvert.toNullableMap(item) ?? {}),
|
|
),
|
|
);
|
|
}
|
|
}
|