@@ -25,26 +25,26 @@ class ClassAttendanceTable extends StatefulWidget {
2525}
2626
2727class _ClassAttendanceTableState extends State <ClassAttendanceTable > {
28- String ? _selectedFilter;
28+ AttendanceStatus ? _selectedFilter;
2929 int ? _sortColumnIndex = 1 ; // 默认按状态列排序
3030 bool _sortAscending = true ;
3131
32- int _getStatusPriority (String status) {
33- if (status. contains ( " ineligible" ) ) return 0 ; // 最高优先级
34- if (status. contains ( " warning" ) ) return 1 ;
35- if (status. contains ( " eligible" ) ) return 2 ;
32+ int _getStatusPriority (AttendanceStatus status) {
33+ if (status == AttendanceStatus . ineligible) return 0 ; // 最高优先级
34+ if (status == AttendanceStatus . warning) return 1 ;
35+ if (status == AttendanceStatus . eligible) return 2 ;
3636 return 3 ; // unknown 最低优先级
3737 }
3838
3939 List <ClassAttendance > get _filteredCourses {
4040 List <ClassAttendance > filtered;
4141
42- if (_selectedFilter == null || _selectedFilter == 'all' ) {
42+ if (_selectedFilter == null ) {
4343 filtered = widget.courses.toList ();
4444 } else {
4545 filtered = widget.courses.where ((course) {
46- final totalTimes = widget.classTimes[course.courseName] ?? 0 ;
47- final status = course.getAttendanceStatus (totalTimes) ;
46+ // final totalTimes = widget.classTimes[course.courseName] ?? 0;
47+ final status = course.attendanceStatus ;
4848 return status == _selectedFilter;
4949 }).toList ();
5050 }
@@ -53,16 +53,16 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
5353 if (_sortColumnIndex != null ) {
5454 filtered.sort ((a, b) {
5555 int comparison = 0 ;
56- final totalTimesA = widget.classTimes[a.courseName] ?? 0 ;
57- final totalTimesB = widget.classTimes[b.courseName] ?? 0 ;
56+ // final totalTimesA = widget.classTimes[a.courseName] ?? 0;
57+ // final totalTimesB = widget.classTimes[b.courseName] ?? 0;
5858
5959 switch (_sortColumnIndex) {
6060 case 0 : // 课程名称
6161 comparison = a.courseName.compareTo (b.courseName);
6262 break ;
6363 case 1 : // 状态
64- final statusA = a.getAttendanceStatus (totalTimesA) ;
65- final statusB = b.getAttendanceStatus (totalTimesB) ;
64+ final statusA = a.attendanceStatus ;
65+ final statusB = b.attendanceStatus ;
6666 comparison = _getStatusPriority (
6767 statusA,
6868 ).compareTo (_getStatusPriority (statusB));
@@ -98,15 +98,16 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
9898 return filtered;
9999 }
100100
101- Color _getStatusColor (String status) {
102- if (status.contains ("ineligible" )) {
103- return Colors .red;
104- } else if (status.contains ("warning" )) {
105- return Colors .orange;
106- } else if (status.contains ("eligible" )) {
107- return Colors .green;
108- } else {
109- return Colors .grey;
101+ Color _getStatusColor (AttendanceStatus status) {
102+ switch (status) {
103+ case AttendanceStatus .unknown:
104+ return Colors .grey;
105+ case AttendanceStatus .eligible:
106+ return Colors .green;
107+ case AttendanceStatus .warning:
108+ return Colors .orange;
109+ case AttendanceStatus .ineligible:
110+ return Colors .red;
110111 }
111112 }
112113
@@ -135,11 +136,11 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
135136 "class_attendance.table.filter_all" ,
136137 ),
137138 ),
138- selected:
139- _selectedFilter == null || _selectedFilter == 'all' ,
139+ selected: _selectedFilter == null ,
140140 onSelected: (selected) {
141141 setState (() {
142- _selectedFilter = selected ? 'all' : null ;
142+ // TODO: Check
143+ _selectedFilter = null ;
143144 });
144145 },
145146 ),
@@ -151,14 +152,12 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
151152 "class_attendance.course_state.ineligible" ,
152153 ),
153154 ),
154- selected:
155- _selectedFilter ==
156- 'class_attendance.course_state.ineligible' ,
155+ selected: _selectedFilter == AttendanceStatus .ineligible,
157156 selectedColor: Colors .red.withValues (alpha: 0.2 ),
158157 onSelected: (selected) {
159158 setState (() {
160159 _selectedFilter = selected
161- ? 'class_attendance.course_state. ineligible'
160+ ? AttendanceStatus . ineligible
162161 : null ;
163162 });
164163 },
@@ -171,14 +170,12 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
171170 "class_attendance.course_state.warning" ,
172171 ),
173172 ),
174- selected:
175- _selectedFilter ==
176- 'class_attendance.course_state.warning' ,
173+ selected: _selectedFilter == AttendanceStatus .warning,
177174 selectedColor: Colors .orange.withValues (alpha: 0.2 ),
178175 onSelected: (selected) {
179176 setState (() {
180177 _selectedFilter = selected
181- ? 'class_attendance.course_state. warning'
178+ ? AttendanceStatus . warning
182179 : null ;
183180 });
184181 },
@@ -191,14 +188,12 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
191188 "class_attendance.course_state.eligible" ,
192189 ),
193190 ),
194- selected:
195- _selectedFilter ==
196- 'class_attendance.course_state.eligible' ,
191+ selected: _selectedFilter == AttendanceStatus .eligible,
197192 selectedColor: Colors .green.withValues (alpha: 0.2 ),
198193 onSelected: (selected) {
199194 setState (() {
200195 _selectedFilter = selected
201- ? 'class_attendance.course_state. eligible'
196+ ? AttendanceStatus . eligible
202197 : null ;
203198 });
204199 },
@@ -211,14 +206,12 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
211206 "class_attendance.course_state.unknown" ,
212207 ),
213208 ),
214- selected:
215- _selectedFilter ==
216- 'class_attendance.course_state.unknown' ,
209+ selected: _selectedFilter == AttendanceStatus .unknown,
217210 selectedColor: Colors .grey.withValues (alpha: 0.2 ),
218211 onSelected: (selected) {
219212 setState (() {
220213 _selectedFilter = selected
221- ? 'class_attendance.course_state. unknown'
214+ ? AttendanceStatus . unknown
222215 : null ;
223216 });
224217 },
@@ -374,9 +367,7 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
374367 ),
375368 ],
376369 rows: filteredCourses.map ((course) {
377- final totalTimes =
378- widget.classTimes[course.courseName] ?? 0 ;
379- final status = course.getAttendanceStatus (totalTimes);
370+ final status = course.attendanceStatus;
380371 final statusColor = _getStatusColor (status);
381372
382373 return DataRow (
@@ -389,7 +380,7 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
389380 overflow: TextOverflow .ellipsis,
390381 ),
391382 onTap: () async {
392- if (! status. contains ( " unknown" ) ) {
383+ if (status != AttendanceStatus . unknown) {
393384 await BothSideSheet .show (
394385 context: context,
395386 title: FlutterI18n .translate (
@@ -418,7 +409,7 @@ class _ClassAttendanceTableState extends State<ClassAttendanceTable> {
418409 borderRadius: BorderRadius .circular (4 ),
419410 ),
420411 child: Text (
421- FlutterI18n .translate (context, status),
412+ FlutterI18n .translate (context, status.i18nString ),
422413 style: TextStyle (
423414 color: statusColor,
424415 fontWeight: FontWeight .bold,
0 commit comments