diff --git a/lib/screens/progress_dashboard_screen.dart b/lib/screens/progress_dashboard_screen.dart index 922ad99..8382997 100644 --- a/lib/screens/progress_dashboard_screen.dart +++ b/lib/screens/progress_dashboard_screen.dart @@ -43,8 +43,8 @@ class ProgressDashboardScreen extends StatelessWidget { } List startedProgressesTileList = List(); - if (vm.hasStartedProgresses) { - for (TimeProgress tp in vm.startedTimeProgreses) { + if (vm.hasCurrentProgresses) { + for (TimeProgress tp in vm.currentTimeProgresses) { startedProgressesTileList.add( Card( child: ListTile( @@ -87,44 +87,78 @@ class ProgressDashboardScreen extends StatelessWidget { } } + List pastProgressesTileList = List(); + if (vm.pastTimeProgresses.length > 0) { + for (TimeProgress tp in vm.pastTimeProgresses) { + pastProgressesTileList.add( + Card( + child: ListTile( + title: Text(tp.name), + subtitle: Text( + "Ended ${DateTime.now().difference(tp.endTime).inDays} Days ago."), + onTap: () { + Navigator.pushNamed(context, ProgressDetailScreen.routeName, + arguments: ProgressDetailScreenArguments(tp.id)); + }, + )), + ); + } + } + double dividerHeight = 1; double screenHeight = MediaQuery.of(context).size.height - appBar.preferredSize.height - 24 - - dividerHeight; //Divider + dividerHeight - + 1; //Divider List columnChildren = List(); - int tpCount = - vm.startedTimeProgreses.length + vm.futureTimeProgresses.length; - if (vm.hasStartedProgresses) { + int tpCount = vm.currentTimeProgresses.length + + vm.futureTimeProgresses.length + + vm.pastTimeProgresses.length; + if (vm.hasCurrentProgresses) { columnChildren.add(Container( - height: vm.hasFutureProgresses - ? (screenHeight / tpCount) * vm.startedTimeProgreses.length - : screenHeight, + height: + (screenHeight / tpCount) * vm.currentTimeProgresses.length, child: ListView( padding: EdgeInsets.all(8), children: startedProgressesTileList, ), )); } - if (vm.hasStartedProgresses && vm.hasFutureProgresses) { + if (vm.hasCurrentProgresses && vm.hasFutureProgresses) { columnChildren.add(Divider( height: dividerHeight, )); } if (vm.hasFutureProgresses) { columnChildren.add(Container( - height: vm.hasStartedProgresses - ? (screenHeight / tpCount) * vm.futureTimeProgresses.length - : screenHeight, + height: (screenHeight / tpCount) * vm.futureTimeProgresses.length, child: ListView( padding: EdgeInsets.all(8), children: futureProgressesTileList, ), )); } + if ((vm.hasCurrentProgresses || vm.hasFutureProgresses) && + vm.pastTimeProgresses.length > 0) { + columnChildren.add(Divider( + height: dividerHeight, + )); + } + if (vm.pastTimeProgresses.length > 0) { + columnChildren.add(Container( + height: (screenHeight / tpCount) * vm.pastTimeProgresses.length, + child: ListView( + padding: EdgeInsets.all(8), + children: pastProgressesTileList, + ), + )); + } - if (!vm.hasStartedProgresses && !vm.hasFutureProgresses) { + if (!vm.hasCurrentProgresses && + !vm.hasFutureProgresses && + vm.pastTimeProgresses.length < 1) { columnChildren.add(Container( margin: EdgeInsets.all(16), child: Center( @@ -151,30 +185,31 @@ class ProgressDashboardScreen extends StatelessWidget { } class _ViewModel { - final List startedTimeProgreses; - final bool hasStartedProgresses; + final List currentTimeProgresses; + final bool hasCurrentProgresses; final List futureTimeProgresses; final bool hasFutureProgresses; + final List pastTimeProgresses; final bool hasLoaded; _ViewModel({ - @required this.startedTimeProgreses, - @required this.hasStartedProgresses, + @required this.currentTimeProgresses, + @required this.hasCurrentProgresses, @required this.futureTimeProgresses, @required this.hasFutureProgresses, + @required this.pastTimeProgresses, @required this.hasLoaded, }); static _ViewModel fromStore(Store store) { - List startedTPList = - startedTimeProgressesSelector(store.state); - List furtureTPList = - futureTimeProgressesSelector(store.state); + List currentTPList = currentTimeProgressSelector(store.state); + List futureTPList = futureTimeProgressesSelector(store.state); return _ViewModel( - startedTimeProgreses: startedTPList, - hasStartedProgresses: startedTPList.length > 0, - futureTimeProgresses: furtureTPList, - hasFutureProgresses: furtureTPList.length > 0, + currentTimeProgresses: currentTPList, + hasCurrentProgresses: currentTPList.length > 0, + futureTimeProgresses: futureTPList, + hasFutureProgresses: futureTPList.length > 0, + pastTimeProgresses: pastTimeProgressesSelector(store.state), hasLoaded: store.state.hasLoaded, ); } diff --git a/lib/screens/progress_detail_screen.dart b/lib/screens/progress_detail_screen.dart index 42f46b0..e5c9287 100644 --- a/lib/screens/progress_detail_screen.dart +++ b/lib/screens/progress_detail_screen.dart @@ -179,7 +179,7 @@ class _ProgressDetailScreenState extends State { : "The Name of the Time Progress has to be set.", ), ) - : vm.hasProgressStarted + : (vm.hasProgressStarted && !vm.hasEnded) ? FittedBox( fit: BoxFit.fitWidth, child: Text( @@ -205,7 +205,7 @@ class _ProgressDetailScreenState extends State { ), ), ), - vm.hasProgressStarted + (vm.hasProgressStarted && !vm.hasEnded) ? Expanded( flex: 2, child: ProgressDetailCircularPercent( @@ -216,10 +216,13 @@ class _ProgressDetailScreenState extends State { ) : Expanded( flex: 2, - child: Text( - "Starts in ${vm.timeProgress.startTime.difference(DateTime.now()).inDays} Days."), + child: !vm.hasEnded + ? Text( + "Starts in ${vm.timeProgress.startTime.difference(DateTime.now()).inDays} Days.") + : Text( + "Ended ${DateTime.now().difference(vm.timeProgress.endTime).inDays} Days ago."), ), - vm.hasProgressStarted + (vm.hasProgressStarted && !vm.hasEnded) ? Expanded( flex: 1, child: ProgressDetailLinearPercent( @@ -278,18 +281,21 @@ class _ProgressDetailScreenState extends State { class _ViewModel { final TimeProgress timeProgress; final bool hasProgressStarted; + final bool hasEnded; _ViewModel({ @required this.timeProgress, @required this.hasProgressStarted, + @required this.hasEnded, }); static _ViewModel fromStoreAndArg( Store store, ProgressDetailScreenArguments args) { + int currentTime = DateTime.now().millisecondsSinceEpoch; TimeProgress tp = timeProgressByIdSelector(store.state, args.id); return _ViewModel( timeProgress: tp, - hasProgressStarted: DateTime.now().millisecondsSinceEpoch > - tp.startTime.millisecondsSinceEpoch); + hasProgressStarted: currentTime > tp.startTime.millisecondsSinceEpoch, + hasEnded: tp.endTime.millisecondsSinceEpoch < currentTime); } } diff --git a/lib/selectors/time_progress_selectors.dart b/lib/selectors/time_progress_selectors.dart index 9b14d31..69b7dae 100644 --- a/lib/selectors/time_progress_selectors.dart +++ b/lib/selectors/time_progress_selectors.dart @@ -4,12 +4,14 @@ import 'package:time_progress_tracker/models/time_progress.dart'; List timeProgressListSelector(AppState state) => state.timeProgressList; -List startedTimeProgressesSelector(AppState state) => - state.timeProgressList - .where((timeProgress) => - DateTime.now().millisecondsSinceEpoch >= - timeProgress.startTime.millisecondsSinceEpoch) - .toList(); +List currentTimeProgressSelector(AppState state) { + int currentTime = DateTime.now().millisecondsSinceEpoch; + return state.timeProgressList + .where((tp) => + currentTime >= tp.startTime.millisecondsSinceEpoch && + tp.endTime.millisecondsSinceEpoch >= currentTime) + .toList(); +} List futureTimeProgressesSelector(AppState state) => state.timeProgressList @@ -18,6 +20,13 @@ List futureTimeProgressesSelector(AppState state) => timeProgress.startTime.millisecondsSinceEpoch) .toList(); +List pastTimeProgressesSelector(AppState state) => + state.timeProgressList + .where((tp) => + tp.endTime.millisecondsSinceEpoch < + DateTime.now().millisecondsSinceEpoch) + .toList(); + TimeProgress timeProgressByIdSelector(AppState state, String id) { if (state.timeProgressList.length < 1) return null; return state.timeProgressList diff --git a/lib/widgets/app_drawer_widget.dart b/lib/widgets/app_drawer_widget.dart index a02d890..b33ed9b 100644 --- a/lib/widgets/app_drawer_widget.dart +++ b/lib/widgets/app_drawer_widget.dart @@ -49,8 +49,8 @@ class AppDrawer extends StatelessWidget { }, ), )); - if (vm.startedTimeProgresses.length > 0) { - for (TimeProgress tp in vm.startedTimeProgresses) { + if (vm.currentTimeProgresses.length > 0) { + for (TimeProgress tp in vm.currentTimeProgresses) { drawerTileList.add(ListTile( title: Text(tp.name), trailing: CircularPercentIndicator( @@ -73,7 +73,7 @@ class AppDrawer extends StatelessWidget { ); }, )); - if (vm.startedTimeProgresses.last != tp) { + if (vm.currentTimeProgresses.last != tp) { drawerTileList.add(Divider( color: Colors.black12, )); @@ -110,17 +110,17 @@ class AppDrawer extends StatelessWidget { } class _ViewModel { - final List startedTimeProgresses; + final List currentTimeProgresses; final bool hasLoaded; _ViewModel({ - @required this.startedTimeProgresses, + @required this.currentTimeProgresses, @required this.hasLoaded, }); static _ViewModel fromStore(Store store) { return _ViewModel( - startedTimeProgresses: startedTimeProgressesSelector(store.state), + currentTimeProgresses: currentTimeProgressSelector(store.state), hasLoaded: store.state.hasLoaded, ); } diff --git a/pubspec.yaml b/pubspec.yaml index 1105192..0a31b8d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.0.3+3 +version: 0.0.4+4 environment: sdk: ">=2.7.0 <3.0.0"