Skip to main content

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" }
]
}
}
StatusDescription
PRESENTStudent attended
ABSENTStudent absent
LATEArrived 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');
}
}