146 lines
4.0 KiB
Dart

import '../core/utils/safe_convert.dart';
import 'attendance.dart';
import 'fee.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;
final DashboardFeeSummary? fees;
const DashboardData({
this.student,
required this.attendance,
required this.todayTimetable,
required this.upcomingExams,
required this.recentResults,
required this.announcements,
this.fees,
});
factory DashboardData.fromJson(Map<String, dynamic> json) {
final studentMap = SafeConvert.toNullableMap(json['student']);
final attendanceMap = SafeConvert.toNullableMap(json['attendance']) ?? {};
final feesMap = SafeConvert.toNullableMap(json['fees']);
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) ?? {}),
),
fees: feesMap != null ? DashboardFeeSummary.fromJson(feesMap) : null,
);
}
}