import 'dart:collection'; import 'package:aitrainer_app/localization/app_language.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/util/trans.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 with Trans { @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']; setContext(context); 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 nodeExercises(ExerciseRepository exerciseRepository, int customerId) { List nodes = List(); List 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 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(); 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) + " " + t(exerciseType.unitQuantityUnit) + " " : ""; String labelExercise = exerciseName + " " + unitQuantity + exercise.quantity.toStringAsFixed(0) + " " + t(exercise.unit); listExercisesPerDay.add(Node( label: labelExercise, key: exercise.exerciseId.toString(), expanded: false, icon: NodeIcon(codePoint: Icons.repeat.codePoint, color: "blue"))); }); return nodes; } }