Attendance
Teachers can mark attendance for their assigned classes. This is a write action — disabled in evaluation mode.
Get Attendance
GET /teacher/attendance/get-attendance?classId={uuid}&divisionId={uuid}&date={date}
{
"data": {
"classId": "uuid",
"divisionId": "uuid",
"date": "2024-04-01",
"students": [
{ "studentId": "uuid", "name": "John Doe", "rollNo": "1", "status": null },
{ "studentId": "uuid", "name": "Jane Smith", "rollNo": "2", "status": null }
]
}
}
Mark Attendance (Write)
POST /teacher/attendance/update-attendance
{
"data": {
"classId": "uuid",
"divisionId": "uuid",
"date": "2024-04-01",
"records": [
{ "studentId": "uuid", "status": "PRESENT" },
{ "studentId": "uuid", "status": "ABSENT" }
]
}
}
| Status | Description |
|---|---|
PRESENT | Student attended |
ABSENT | Student absent |
LATE | Arrived late |
UI — Attendance Marking
Uses sticky_grouped_list for scrollable student list grouped by first letter:
class AttendanceScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final vm = context.watch<AttendanceViewModel>();
final authVM = context.watch<AuthViewModel>();
// Disabled in evaluation mode
if (authVM.isEvaluationMode) {
return const ReadOnlyAttendanceView();
}
return Scaffold(
body: StickyGroupedListView<Student, String>(
elements: vm.students,
groupBy: (s) => s.name[0], // Group by first letter
groupSeparatorBuilder: (s) => Text(s.name[0], style: const TextStyle(fontWeight: Bold)),
itemBuilder: (_, student) => StudentAttendanceTile(
student: student,
onStatusChanged: (status) => vm.setStatus(student.id, status),
),
),
floatingActionButton: FloatingActionButton.extended(
onPressed: vm.canSubmit ? () => vm.submitAttendance() : null,
label: const Text('Submit Attendance'),
),
);
}
}
Mark All Present
void markAllPresent() {
for (final student in students) {
vm.setStatus(student.id, 'PRESENT');
}
}