finished new absences page

This commit is contained in:
Kima 2024-04-23 19:56:35 +02:00
parent f0b9dfa1e6
commit c0589cba5c
4 changed files with 78 additions and 58 deletions

View File

@ -32,7 +32,7 @@ class AbsenceDisplay extends StatelessWidget {
if (excused > 0 && pending > 0) const SizedBox(width: 6.0),
if (pending > 0)
Icon(
FeatherIcons.slash,
Icons.hourglass_bottom,
size: 14.0,
color: AppColors.of(context).orange,
),

View File

@ -3,18 +3,21 @@ import 'package:refilc/models/settings.dart';
import 'package:refilc/theme/colors/colors.dart';
import 'package:refilc/utils/format.dart';
import 'package:refilc_kreta_api/models/subject.dart';
import 'package:refilc_mobile_ui/common/round_border_icon.dart';
import 'package:refilc_mobile_ui/common/widgets/absence/absence_display.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class AbsenceSubjectTile extends StatelessWidget {
const AbsenceSubjectTile(this.subject,
{super.key,
this.percentage = 0.0,
this.excused = 0,
this.unexcused = 0,
this.pending = 0,
this.onTap});
const AbsenceSubjectTile(
this.subject, {
super.key,
this.percentage = 0.0,
this.excused = 0,
this.unexcused = 0,
this.pending = 0,
this.onTap,
});
final GradeSubject subject;
final void Function()? onTap;
@ -28,54 +31,65 @@ class AbsenceSubjectTile extends StatelessWidget {
Widget build(BuildContext context) {
SettingsProvider settingsProvider = Provider.of<SettingsProvider>(context);
return Material(
type: MaterialType.transparency,
child: ListTile(
// minLeadingWidth: 32.0,
dense: true,
contentPadding: const EdgeInsets.only(left: 8.0, right: 6.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
visualDensity: VisualDensity.compact,
onTap: onTap,
leading: Icon(
SubjectIcon.resolveVariant(subject: subject, context: context),
size: 32.0),
title: Text(
subject.renamedTo ?? subject.name.capital(),
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 15.0,
fontStyle:
subject.isRenamed && settingsProvider.renamedSubjectsItalics
? FontStyle.italic
: null),
),
subtitle: AbsenceDisplay(excused, unexcused, pending),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(width: 8.0),
if (percentage >= 0)
Stack(
alignment: Alignment.centerRight,
children: [
const Opacity(
opacity: 0,
child: Text("100%",
style: TextStyle(fontFamily: "monospace"))),
Text(
"${percentage.round()}%",
style: TextStyle(
// fontFamily: "monospace",
color: getColorByPercentage(percentage, context: context),
fontWeight: FontWeight.w700,
fontSize: 24.0,
type: MaterialType.card,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16.0)),
child: Padding(
padding: const EdgeInsets.all(4.0),
child: ListTile(
// minLeadingWidth: 32.0,
dense: true,
contentPadding: const EdgeInsets.only(left: 12.0, right: 12.0),
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
visualDensity: VisualDensity.compact,
onTap: onTap,
leading: RoundBorderIcon(
padding: 8.0,
icon: Icon(
SubjectIcon.resolveVariant(subject: subject, context: context),
size: 20.0,
),
),
title: Text(
subject.renamedTo ?? subject.name.capital(),
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 15.0,
fontStyle:
subject.isRenamed && settingsProvider.renamedSubjectsItalics
? FontStyle.italic
: null),
),
subtitle: AbsenceDisplay(excused, unexcused, pending),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(width: 8.0),
if (percentage >= 0)
Stack(
alignment: Alignment.centerRight,
children: [
const Opacity(
opacity: 0,
child: Text("100%",
style: TextStyle(fontFamily: "monospace"))),
Text(
"${percentage.round()}%",
style: TextStyle(
// fontFamily: "monospace",
color:
getColorByPercentage(percentage, context: context)
.withOpacity(0.8),
fontSize: 16.0,
fontWeight: FontWeight.w500,
),
),
),
],
),
],
],
),
],
),
),
),
);

View File

@ -143,7 +143,7 @@ class AbsenceTile extends StatelessWidget {
case Justification.excused:
return FeatherIcons.check;
case Justification.pending:
return FeatherIcons.slash;
return Icons.hourglass_bottom;
case Justification.unexcused:
return FeatherIcons.x;
}

View File

@ -276,6 +276,9 @@ class AbsencesPageState extends State<AbsencesPage>
Padding(
padding: const EdgeInsets.only(bottom: 24.0),
child: Panel(
padding: EdgeInsets.zero,
isTransparent: true,
hasShadow: false,
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@ -318,11 +321,14 @@ class AbsencesPageState extends State<AbsencesPage>
return FadeThroughTransition(
animation: primaryAnimation,
secondaryAnimation: secondaryAnimation,
fillColor: Theme.of(context).colorScheme.background,
fillColor: Colors.transparent,
child: child,
);
},
child: Column(
child: SplittedPanel(
padding: EdgeInsets.zero,
isSeparated: true,
isTransparent: true,
children: absWidgets,
),
),