149 lines
5.0 KiB
Dart
149 lines
5.0 KiB
Dart
import 'dart:collection';
|
|
|
|
import 'package:aitrainer_app/localization/app_language.dart';
|
|
import 'package:aitrainer_app/localization/app_localization.dart';
|
|
import 'package:aitrainer_app/model/cache.dart';
|
|
import 'package:aitrainer_app/model/exercise.dart';
|
|
import 'package:aitrainer_app/model/exercise_type.dart';
|
|
import 'package:aitrainer_app/repository/customer_repository.dart';
|
|
import 'package:aitrainer_app/repository/exercise_repository.dart';
|
|
import 'package:aitrainer_app/widgets/app_bar_common.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_treeview/tree_view.dart';
|
|
|
|
class ExerciseLogPage extends StatefulWidget {
|
|
@override
|
|
_ExerciseLogPage createState() => _ExerciseLogPage();
|
|
}
|
|
|
|
class _ExerciseLogPage extends State<ExerciseLogPage> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
LinkedHashMap arguments = ModalRoute.of(context).settings.arguments;
|
|
final ExerciseRepository exerciseRepository = arguments['exerciseRepository'];
|
|
final CustomerRepository customerRepository = arguments['customerRepository'];
|
|
final int customerId = arguments['customerId'];
|
|
|
|
return Scaffold(
|
|
appBar: AppBarCommonNav(),
|
|
body: Container(
|
|
padding: EdgeInsets.all(20),
|
|
decoration: BoxDecoration(
|
|
image: DecorationImage(
|
|
image: customerId == Cache().userLoggedIn.customerId ? AssetImage('asset/image/WT_light_background.png'):
|
|
AssetImage('asset/image/WT_menu_dark.png'),
|
|
fit: BoxFit.cover,
|
|
alignment: Alignment.center,
|
|
),
|
|
),
|
|
child: exerciseWidget(exerciseRepository, customerId),
|
|
)
|
|
);
|
|
}
|
|
|
|
Widget exerciseWidget(ExerciseRepository exerciseRepository, int customerId) {
|
|
TreeViewController _treeViewController =
|
|
TreeViewController(children: nodeExercises(exerciseRepository, customerId));
|
|
|
|
TreeViewTheme _treeViewTheme = TreeViewTheme(
|
|
expanderTheme: ExpanderThemeData(
|
|
type: ExpanderType.caret,
|
|
modifier: ExpanderModifier.none,
|
|
position: ExpanderPosition.start,
|
|
color: Colors.red.shade800,
|
|
size: 20,
|
|
),
|
|
labelStyle: TextStyle(
|
|
fontSize: 12,
|
|
letterSpacing: 0.1,
|
|
),
|
|
parentLabelStyle: TextStyle(
|
|
fontSize: 16,
|
|
letterSpacing: 0.1,
|
|
fontWeight: FontWeight.w800,
|
|
color: Colors.orange.shade600,
|
|
),
|
|
iconTheme: IconThemeData(
|
|
size: 18,
|
|
color: Colors.grey.shade800,
|
|
),
|
|
colorScheme: ColorScheme.light(background: Colors.transparent),
|
|
);
|
|
|
|
return TreeView(
|
|
controller: _treeViewController,
|
|
allowParentSelect: false,
|
|
supportParentDoubleTap: false,
|
|
//onExpansionChanged: _expandNodeHandler,
|
|
onNodeTap: (key) {
|
|
setState(() {
|
|
_treeViewController = _treeViewController.copyWith(selectedKey: key);
|
|
});
|
|
},
|
|
theme: _treeViewTheme,
|
|
);
|
|
}
|
|
|
|
List<Node> nodeExercises(ExerciseRepository exerciseRepository, int customerId) {
|
|
List<Node> nodes = List<Node>();
|
|
List<Exercise> exercises;
|
|
if ( customerId == Cache().userLoggedIn.customerId ) {
|
|
exercises = exerciseRepository.getExerciseList();
|
|
} else if ( Cache().getTrainee() != null && customerId == Cache().getTrainee().customerId ) {
|
|
exercises = exerciseRepository.getExerciseListTrainee();
|
|
}
|
|
|
|
|
|
String prevDay = "";
|
|
Node actualNode;
|
|
List<Node> listExercisesPerDay;
|
|
exercises.forEach((element) {
|
|
Exercise exercise = element;
|
|
ExerciseType exerciseType =
|
|
exerciseRepository.getExerciseTypeById(exercise.exerciseTypeId);
|
|
String actualDay = exercise.dateAdd.year.toString() +
|
|
"-" +
|
|
exercise.dateAdd.month.toString() +
|
|
"-" +
|
|
exercise.dateAdd.day.toString();
|
|
|
|
if (prevDay.compareTo(actualDay) != 0) {
|
|
listExercisesPerDay = List<Node>();
|
|
actualNode = Node(
|
|
label: actualDay,
|
|
key: exercise.dateAdd.toString(),
|
|
expanded: true,
|
|
children: listExercisesPerDay,
|
|
icon:
|
|
NodeIcon(codePoint: Icons.date_range.codePoint, color: "blue"));
|
|
nodes.add(actualNode);
|
|
prevDay = actualDay;
|
|
}
|
|
|
|
String exerciseName = AppLanguage().appLocal == Locale("en")
|
|
? exerciseType.name
|
|
: exerciseType.nameTranslation;
|
|
String unitQuantity = exerciseType.unitQuantity == "1"
|
|
? exercise.unitQuantity.toStringAsFixed(0) +
|
|
" " +
|
|
AppLocalizations.of(context)
|
|
.translate(exerciseType.unitQuantityUnit) +
|
|
" "
|
|
: "";
|
|
|
|
String labelExercise = exerciseName +
|
|
" " +
|
|
unitQuantity +
|
|
exercise.quantity.toStringAsFixed(0) +
|
|
" " +
|
|
AppLocalizations.of(context).translate(exercise.unit);
|
|
listExercisesPerDay.add(Node(
|
|
label: labelExercise,
|
|
key: exercise.exerciseId.toString(),
|
|
expanded: false,
|
|
icon: NodeIcon(codePoint: Icons.repeat.codePoint, color: "blue")));
|
|
});
|
|
return nodes;
|
|
}
|
|
}
|