• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wger-project / flutter / 30854254088

03 Aug 2026 09:21PM UTC coverage: 40.895% (-15.0%) from 55.93%
30854254088

Pull #1260

github

web-flow
Merge d93794de5 into e3affdd4f
Pull Request #1260: WIP: health sync

9980 of 24404 relevant lines covered (40.89%)

1.72 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

42.86
/lib/features/routines/validators.dart
1
/*
2
 * This file is part of wger Workout Manager <https://github.com/wger-project>.
3
 * Copyright (c)  2026 wger Team
4
 *
5
 * wger Workout Manager is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU Affero General Public License as published by
7
 * the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU Affero General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Affero General Public License
16
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
 */
18

19
import 'package:flutter/material.dart';
20
import 'package:wger/l10n/generated/app_localizations.dart';
21

22
/// Cross-field validation for a workout log entry, mirroring the
23
/// reachable part of the backend `WorkoutLog.clean()` rule: at least
24
/// one of [repetitions] or [weight] must be set.
25
String? validateWorkoutLogCrossField({
×
26
  required num? repetitions,
27
  required num? weight,
28
  required AppLocalizations i18n,
29
}) {
30
  if (repetitions == null && weight == null) {
31
    return i18n.weightOrRepsRequired;
×
32
  }
33
  return null;
34
}
35

36
/// Cross-field validation for a workout session, mirroring the backend
37
/// `WorkoutSession.clean()` rules:
38
///
39
/// - [timeStart] and [timeEnd] must both be set or both be empty,
40
/// - if both are set, [timeStart] must not be after [timeEnd].
41
String? validateWorkoutSessionTimes({
2✔
42
  required TimeOfDay? timeStart,
43
  required TimeOfDay? timeEnd,
44
  required AppLocalizations i18n,
45
}) {
46
  if ((timeStart == null) != (timeEnd == null)) {
2✔
47
    return i18n.timeStartEndBothOrNeither;
×
48
  }
49
  if (timeStart != null && timeEnd != null && timeStart.isAfter(timeEnd)) {
1✔
50
    return i18n.timeStartAhead;
×
51
  }
52
  return null;
53
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc