|
@@ -43,7 +43,7 @@ class _YearTrendCard extends StatelessWidget { |
|
@@ -43,7 +43,7 @@ class _YearTrendCard extends StatelessWidget { |
|
43
|
Text(
|
43
|
Text(
|
|
44
|
HealthReportSubjectScope.titleOf(
|
44
|
HealthReportSubjectScope.titleOf(
|
|
45
|
context,
|
45
|
context,
|
|
46
|
- context.l10n.hrvDailyStressTrend,
|
46
|
+ context.l10n.hrvMonthlyStressTrend,
|
|
47
|
),
|
47
|
),
|
|
48
|
style: _titleStyle,
|
48
|
style: _titleStyle,
|
|
49
|
),
|
49
|
),
|
|
@@ -449,6 +449,7 @@ class _DailyDistributionCard extends StatelessWidget { |
|
@@ -449,6 +449,7 @@ class _DailyDistributionCard extends StatelessWidget { |
|
449
|
|
449
|
|
|
450
|
@override
|
450
|
@override
|
|
451
|
Widget build(BuildContext context) {
|
451
|
Widget build(BuildContext context) {
|
|
|
|
452
|
+ final extremeDays = _dailyStressExtremeDays(report);
|
|
452
|
return _Card(
|
453
|
return _Card(
|
|
453
|
child: Column(
|
454
|
child: Column(
|
|
454
|
crossAxisAlignment: CrossAxisAlignment.start,
|
455
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
@@ -479,28 +480,73 @@ class _DailyDistributionCard extends StatelessWidget { |
|
@@ -479,28 +480,73 @@ class _DailyDistributionCard extends StatelessWidget { |
|
479
|
),
|
480
|
),
|
|
480
|
const Divider(height: 25, color: _grid),
|
481
|
const Divider(height: 25, color: _grid),
|
|
481
|
_DateExtreme(
|
482
|
_DateExtreme(
|
|
482
|
- label: context.l10n.hrvMostStressed,
|
|
|
|
483
|
- days: _extremeDays(report, maximum: true)),
|
483
|
+ label: context.l10n.hrvMostStressed,
|
|
|
|
484
|
+ days: extremeDays.mostStressed,
|
|
|
|
485
|
+ ),
|
|
484
|
const SizedBox(height: 18),
|
486
|
const SizedBox(height: 18),
|
|
485
|
_DateExtreme(
|
487
|
_DateExtreme(
|
|
486
|
- label: context.l10n.hrvMostRelaxed,
|
|
|
|
487
|
- days: _extremeDays(report, maximum: false)),
|
488
|
+ label: context.l10n.hrvMostRelaxed,
|
|
|
|
489
|
+ days: extremeDays.mostRelaxed,
|
|
|
|
490
|
+ ),
|
|
488
|
],
|
491
|
],
|
|
489
|
),
|
492
|
),
|
|
490
|
);
|
493
|
);
|
|
491
|
}
|
494
|
}
|
|
492
|
|
495
|
|
|
493
|
- List<HrvDayReport> _extremeDays(YearlyHrvReport report,
|
|
|
|
494
|
- {required bool maximum}) {
|
|
|
|
495
|
- final days = report.days.where((day) => day.level != null).toList();
|
|
|
|
496
|
- days.sort((a, b) {
|
|
|
|
497
|
- final aValue = _stressRank(a.level!);
|
|
|
|
498
|
- final bValue = _stressRank(b.level!);
|
|
|
|
499
|
- final valueComparison =
|
|
|
|
500
|
- maximum ? bValue.compareTo(aValue) : aValue.compareTo(bValue);
|
|
|
|
501
|
- return valueComparison == 0 ? a.date.compareTo(b.date) : valueComparison;
|
|
|
|
502
|
- });
|
|
|
|
503
|
- return days.take(2).toList();
|
496
|
+ ({List<HrvDayReport> mostStressed, List<HrvDayReport> mostRelaxed})
|
|
|
|
497
|
+ _dailyStressExtremeDays(YearlyHrvReport report) {
|
|
|
|
498
|
+ final days = report.days.where((day) => day.level != null).toList()
|
|
|
|
499
|
+ ..sort(_compareByStressDescending);
|
|
|
|
500
|
+
|
|
|
|
501
|
+ final mostStressed = <HrvDayReport>[];
|
|
|
|
502
|
+ final mostRelaxed = <HrvDayReport>[];
|
|
|
|
503
|
+ if (days.isEmpty) {
|
|
|
|
504
|
+ return (mostStressed: mostStressed, mostRelaxed: mostRelaxed);
|
|
|
|
505
|
+ }
|
|
|
|
506
|
+
|
|
|
|
507
|
+ if (days.length == 1) {
|
|
|
|
508
|
+ final day = days.single;
|
|
|
|
509
|
+ if (_isStressedLevel(day.level!)) {
|
|
|
|
510
|
+ mostStressed.add(day);
|
|
|
|
511
|
+ } else {
|
|
|
|
512
|
+ mostRelaxed.add(day);
|
|
|
|
513
|
+ }
|
|
|
|
514
|
+ return (mostStressed: mostStressed, mostRelaxed: mostRelaxed);
|
|
|
|
515
|
+ }
|
|
|
|
516
|
+
|
|
|
|
517
|
+ mostStressed.add(days.first);
|
|
|
|
518
|
+ mostRelaxed.add(days.last);
|
|
|
|
519
|
+
|
|
|
|
520
|
+ if (days.length == 3) {
|
|
|
|
521
|
+ final middle = days[1];
|
|
|
|
522
|
+ if (_isStressedLevel(middle.level!)) {
|
|
|
|
523
|
+ mostStressed.add(middle);
|
|
|
|
524
|
+ } else {
|
|
|
|
525
|
+ mostRelaxed.add(middle);
|
|
|
|
526
|
+ }
|
|
|
|
527
|
+ } else if (days.length >= 4) {
|
|
|
|
528
|
+ mostStressed.add(days[1]);
|
|
|
|
529
|
+ mostRelaxed.add(days[days.length - 2]);
|
|
|
|
530
|
+ }
|
|
|
|
531
|
+
|
|
|
|
532
|
+ mostStressed.sort(_compareByDate);
|
|
|
|
533
|
+ mostRelaxed.sort(_compareByDate);
|
|
|
|
534
|
+ return (mostStressed: mostStressed, mostRelaxed: mostRelaxed);
|
|
|
|
535
|
+ }
|
|
|
|
536
|
+
|
|
|
|
537
|
+ int _compareByStressDescending(HrvDayReport a, HrvDayReport b) {
|
|
|
|
538
|
+ final valueComparison =
|
|
|
|
539
|
+ _stressRank(b.level!).compareTo(_stressRank(a.level!));
|
|
|
|
540
|
+ return valueComparison == 0 ? a.date.compareTo(b.date) : valueComparison;
|
|
|
|
541
|
+ }
|
|
|
|
542
|
+
|
|
|
|
543
|
+ int _compareByDate(HrvDayReport a, HrvDayReport b) {
|
|
|
|
544
|
+ return a.date.compareTo(b.date);
|
|
|
|
545
|
+ }
|
|
|
|
546
|
+
|
|
|
|
547
|
+ bool _isStressedLevel(HrvStressLevel level) {
|
|
|
|
548
|
+ return level == HrvStressLevel.attention ||
|
|
|
|
549
|
+ level == HrvStressLevel.overload;
|
|
504
|
}
|
550
|
}
|
|
505
|
|
551
|
|
|
506
|
int _stressRank(HrvStressLevel level) {
|
552
|
int _stressRank(HrvStressLevel level) {
|