|
...
|
...
|
@@ -43,7 +43,7 @@ class _YearTrendCard extends StatelessWidget { |
|
|
|
Text(
|
|
|
|
HealthReportSubjectScope.titleOf(
|
|
|
|
context,
|
|
|
|
context.l10n.hrvDailyStressTrend,
|
|
|
|
context.l10n.hrvMonthlyStressTrend,
|
|
|
|
),
|
|
|
|
style: _titleStyle,
|
|
|
|
),
|
|
...
|
...
|
@@ -449,6 +449,7 @@ class _DailyDistributionCard extends StatelessWidget { |
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final extremeDays = _dailyStressExtremeDays(report);
|
|
|
|
return _Card(
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
...
|
...
|
@@ -479,28 +480,73 @@ class _DailyDistributionCard extends StatelessWidget { |
|
|
|
),
|
|
|
|
const Divider(height: 25, color: _grid),
|
|
|
|
_DateExtreme(
|
|
|
|
label: context.l10n.hrvMostStressed,
|
|
|
|
days: _extremeDays(report, maximum: true)),
|
|
|
|
label: context.l10n.hrvMostStressed,
|
|
|
|
days: extremeDays.mostStressed,
|
|
|
|
),
|
|
|
|
const SizedBox(height: 18),
|
|
|
|
_DateExtreme(
|
|
|
|
label: context.l10n.hrvMostRelaxed,
|
|
|
|
days: _extremeDays(report, maximum: false)),
|
|
|
|
label: context.l10n.hrvMostRelaxed,
|
|
|
|
days: extremeDays.mostRelaxed,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
List<HrvDayReport> _extremeDays(YearlyHrvReport report,
|
|
|
|
{required bool maximum}) {
|
|
|
|
final days = report.days.where((day) => day.level != null).toList();
|
|
|
|
days.sort((a, b) {
|
|
|
|
final aValue = _stressRank(a.level!);
|
|
|
|
final bValue = _stressRank(b.level!);
|
|
|
|
final valueComparison =
|
|
|
|
maximum ? bValue.compareTo(aValue) : aValue.compareTo(bValue);
|
|
|
|
return valueComparison == 0 ? a.date.compareTo(b.date) : valueComparison;
|
|
|
|
});
|
|
|
|
return days.take(2).toList();
|
|
|
|
({List<HrvDayReport> mostStressed, List<HrvDayReport> mostRelaxed})
|
|
|
|
_dailyStressExtremeDays(YearlyHrvReport report) {
|
|
|
|
final days = report.days.where((day) => day.level != null).toList()
|
|
|
|
..sort(_compareByStressDescending);
|
|
|
|
|
|
|
|
final mostStressed = <HrvDayReport>[];
|
|
|
|
final mostRelaxed = <HrvDayReport>[];
|
|
|
|
if (days.isEmpty) {
|
|
|
|
return (mostStressed: mostStressed, mostRelaxed: mostRelaxed);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (days.length == 1) {
|
|
|
|
final day = days.single;
|
|
|
|
if (_isStressedLevel(day.level!)) {
|
|
|
|
mostStressed.add(day);
|
|
|
|
} else {
|
|
|
|
mostRelaxed.add(day);
|
|
|
|
}
|
|
|
|
return (mostStressed: mostStressed, mostRelaxed: mostRelaxed);
|
|
|
|
}
|
|
|
|
|
|
|
|
mostStressed.add(days.first);
|
|
|
|
mostRelaxed.add(days.last);
|
|
|
|
|
|
|
|
if (days.length == 3) {
|
|
|
|
final middle = days[1];
|
|
|
|
if (_isStressedLevel(middle.level!)) {
|
|
|
|
mostStressed.add(middle);
|
|
|
|
} else {
|
|
|
|
mostRelaxed.add(middle);
|
|
|
|
}
|
|
|
|
} else if (days.length >= 4) {
|
|
|
|
mostStressed.add(days[1]);
|
|
|
|
mostRelaxed.add(days[days.length - 2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
mostStressed.sort(_compareByDate);
|
|
|
|
mostRelaxed.sort(_compareByDate);
|
|
|
|
return (mostStressed: mostStressed, mostRelaxed: mostRelaxed);
|
|
|
|
}
|
|
|
|
|
|
|
|
int _compareByStressDescending(HrvDayReport a, HrvDayReport b) {
|
|
|
|
final valueComparison =
|
|
|
|
_stressRank(b.level!).compareTo(_stressRank(a.level!));
|
|
|
|
return valueComparison == 0 ? a.date.compareTo(b.date) : valueComparison;
|
|
|
|
}
|
|
|
|
|
|
|
|
int _compareByDate(HrvDayReport a, HrvDayReport b) {
|
|
|
|
return a.date.compareTo(b.date);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool _isStressedLevel(HrvStressLevel level) {
|
|
|
|
return level == HrvStressLevel.attention ||
|
|
|
|
level == HrvStressLevel.overload;
|
|
|
|
}
|
|
|
|
|
|
|
|
int _stressRank(HrvStressLevel level) {
|
...
|
...
|
|