Refactor reliability statistics and score handling to support nullable values
This commit is contained in:
@@ -105,15 +105,15 @@ class StaffProfilePage extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
ReliabilityStatsCard(
|
ReliabilityStatsCard(
|
||||||
totalShifts: profile.totalShifts ?? 0,
|
totalShifts: profile.totalShifts,
|
||||||
averageRating: profile.averageRating ?? 0.0,
|
averageRating: profile.averageRating,
|
||||||
onTimeRate: profile.onTimeRate ?? 0,
|
onTimeRate: profile.onTimeRate,
|
||||||
noShowCount: profile.noShowCount ?? 0,
|
noShowCount: profile.noShowCount,
|
||||||
cancellationCount: profile.cancellationCount ?? 0,
|
cancellationCount: profile.cancellationCount,
|
||||||
),
|
),
|
||||||
const SizedBox(height: UiConstants.space6),
|
const SizedBox(height: UiConstants.space6),
|
||||||
ReliabilityScoreBar(
|
ReliabilityScoreBar(
|
||||||
reliabilityScore: profile.reliabilityScore ?? 100,
|
reliabilityScore: profile.reliabilityScore,
|
||||||
),
|
),
|
||||||
const SizedBox(height: UiConstants.space6),
|
const SizedBox(height: UiConstants.space6),
|
||||||
SectionTitle(i18n.sections.onboarding),
|
SectionTitle(i18n.sections.onboarding),
|
||||||
|
|||||||
@@ -6,17 +6,17 @@ import 'package:design_system/design_system.dart';
|
|||||||
///
|
///
|
||||||
/// Uses design system tokens for all colors, typography, and spacing.
|
/// Uses design system tokens for all colors, typography, and spacing.
|
||||||
class ReliabilityScoreBar extends StatelessWidget {
|
class ReliabilityScoreBar extends StatelessWidget {
|
||||||
final int reliabilityScore;
|
final int? reliabilityScore;
|
||||||
|
|
||||||
const ReliabilityScoreBar({
|
const ReliabilityScoreBar({
|
||||||
super.key,
|
super.key,
|
||||||
required this.reliabilityScore,
|
this.reliabilityScore,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final i18n = t.staff.profile.reliability_score;
|
final i18n = t.staff.profile.reliability_score;
|
||||||
final score = reliabilityScore / 100;
|
final score = (reliabilityScore ?? 0) / 100;
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
padding: EdgeInsets.all(UiConstants.space4),
|
padding: EdgeInsets.all(UiConstants.space4),
|
||||||
@@ -37,7 +37,7 @@ class ReliabilityScoreBar extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
"$reliabilityScore%",
|
"${reliabilityScore ?? 0}%",
|
||||||
style: UiTypography.headline4m.copyWith(
|
style: UiTypography.headline4m.copyWith(
|
||||||
color: UiColors.primary,
|
color: UiColors.primary,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -6,19 +6,19 @@ import 'package:design_system/design_system.dart';
|
|||||||
///
|
///
|
||||||
/// Uses design system tokens for all colors, typography, spacing, and icons.
|
/// Uses design system tokens for all colors, typography, spacing, and icons.
|
||||||
class ReliabilityStatsCard extends StatelessWidget {
|
class ReliabilityStatsCard extends StatelessWidget {
|
||||||
final int totalShifts;
|
final int? totalShifts;
|
||||||
final double averageRating;
|
final double? averageRating;
|
||||||
final int onTimeRate;
|
final int? onTimeRate;
|
||||||
final int noShowCount;
|
final int? noShowCount;
|
||||||
final int cancellationCount;
|
final int? cancellationCount;
|
||||||
|
|
||||||
const ReliabilityStatsCard({
|
const ReliabilityStatsCard({
|
||||||
super.key,
|
super.key,
|
||||||
required this.totalShifts,
|
this.totalShifts,
|
||||||
required this.averageRating,
|
this.averageRating,
|
||||||
required this.onTimeRate,
|
this.onTimeRate,
|
||||||
required this.noShowCount,
|
this.noShowCount,
|
||||||
required this.cancellationCount,
|
this.cancellationCount,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -43,31 +43,31 @@ class ReliabilityStatsCard extends StatelessWidget {
|
|||||||
_buildStatItem(
|
_buildStatItem(
|
||||||
context,
|
context,
|
||||||
LucideIcons.briefcase,
|
LucideIcons.briefcase,
|
||||||
"$totalShifts",
|
"${totalShifts ?? 0}",
|
||||||
"Shifts",
|
"Shifts",
|
||||||
),
|
),
|
||||||
_buildStatItem(
|
_buildStatItem(
|
||||||
context,
|
context,
|
||||||
LucideIcons.star,
|
LucideIcons.star,
|
||||||
averageRating.toStringAsFixed(1),
|
(averageRating ?? 0.0).toStringAsFixed(1),
|
||||||
"Rating",
|
"Rating",
|
||||||
),
|
),
|
||||||
_buildStatItem(
|
_buildStatItem(
|
||||||
context,
|
context,
|
||||||
LucideIcons.clock,
|
LucideIcons.clock,
|
||||||
"$onTimeRate%",
|
"${onTimeRate ?? 0}%",
|
||||||
"On Time",
|
"On Time",
|
||||||
),
|
),
|
||||||
_buildStatItem(
|
_buildStatItem(
|
||||||
context,
|
context,
|
||||||
LucideIcons.xCircle,
|
LucideIcons.xCircle,
|
||||||
"$noShowCount",
|
"${noShowCount ?? 0}",
|
||||||
"No Shows",
|
"No Shows",
|
||||||
),
|
),
|
||||||
_buildStatItem(
|
_buildStatItem(
|
||||||
context,
|
context,
|
||||||
LucideIcons.ban,
|
LucideIcons.ban,
|
||||||
"$cancellationCount",
|
"${cancellationCount ?? 0}",
|
||||||
"Cancel.",
|
"Cancel.",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user