Feature/BugFix-01 Future Time Progresses (#4)
- Fixed Bug with Future Time Progresses Now no longer shows future time progresses in dashboard or in app drawer - Dashboard Now Shows started and future times. These cards are divided based on their count - Fixed Bug Future Progress In Detail Screen - Progress Detail Screen Now Shows in how many Days a progress starts - BugFix App Version Signed-off-by: Andreas Fahrecker <AndreasFahrecker@gmail.com>
This commit is contained in:
committed by
GitHub
parent
988e8f3c72
commit
319f539b48
@ -11,6 +11,11 @@ import 'package:time_progress_tracker/widgets/app_drawer_widget.dart';
|
||||
class ProgressCreationScreen extends StatefulWidget {
|
||||
static const routeName = "/progress-creation";
|
||||
|
||||
final String appVersion;
|
||||
|
||||
ProgressCreationScreen({Key key, @required this.appVersion})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() {
|
||||
return _ProgressCreationScreenState();
|
||||
@ -60,7 +65,9 @@ class _ProgressCreationScreenState extends State<ProgressCreationScreen> {
|
||||
appBar: AppBar(
|
||||
title: Text("Create Time Progress"),
|
||||
),
|
||||
drawer: AppDrawer(),
|
||||
drawer: AppDrawer(
|
||||
appVersion: widget.appVersion,
|
||||
),
|
||||
body: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Column(
|
||||
|
@ -7,19 +7,31 @@ import 'package:time_progress_tracker/models/app_state.dart';
|
||||
import 'package:time_progress_tracker/models/time_progress.dart';
|
||||
import 'package:time_progress_tracker/screens/progress_creation_screen.dart';
|
||||
import 'package:time_progress_tracker/screens/progress_detail_screen.dart';
|
||||
import 'package:time_progress_tracker/selectors/time_progress_selectors.dart';
|
||||
import 'package:time_progress_tracker/widgets/app_drawer_widget.dart';
|
||||
|
||||
class ProgressDashboardScreen extends StatelessWidget {
|
||||
static const routeName = "/progress-dashboard";
|
||||
static const title = "Time Progress Dashboard";
|
||||
|
||||
final String appVersion;
|
||||
|
||||
ProgressDashboardScreen({
|
||||
Key key,
|
||||
@required this.appVersion,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
AppBar appBar = AppBar(
|
||||
title: Text(title),
|
||||
);
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(title),
|
||||
appBar: appBar,
|
||||
drawer: AppDrawer(
|
||||
appVersion: appVersion,
|
||||
),
|
||||
drawer: AppDrawer(),
|
||||
body: StoreConnector(
|
||||
converter: _ViewModel.fromStore,
|
||||
onInit: loadTimeProgressListIfUnloaded,
|
||||
@ -29,11 +41,11 @@ class ProgressDashboardScreen extends StatelessWidget {
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
List<Widget> dashboardTileList = List<Widget>();
|
||||
|
||||
if (vm.timeProgressList.length > 0) {
|
||||
for (TimeProgress tp in vm.timeProgressList) {
|
||||
dashboardTileList.add(
|
||||
List<Widget> startedProgressesTileList = List<Widget>();
|
||||
if (vm.hasStartedProgresses) {
|
||||
for (TimeProgress tp in vm.startedTimeProgreses) {
|
||||
startedProgressesTileList.add(
|
||||
Card(
|
||||
child: ListTile(
|
||||
title: Text(tp.name),
|
||||
@ -53,20 +65,82 @@ class ProgressDashboardScreen extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
dashboardTileList.add(ListTile(
|
||||
title: Text("You don't have any tracked Progress."),
|
||||
}
|
||||
|
||||
List<Widget> futureProgressesTileList = List<Widget>();
|
||||
if (vm.hasFutureProgresses) {
|
||||
for (TimeProgress tp in vm.futureTimeProgresses) {
|
||||
futureProgressesTileList.add(
|
||||
Card(
|
||||
child: ListTile(
|
||||
title: Text(tp.name),
|
||||
subtitle: Text(
|
||||
"Starts in ${tp.startTime.difference(DateTime.now()).inDays} Days."),
|
||||
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
|
||||
|
||||
List<Widget> columnChildren = List<Widget>();
|
||||
int tpCount =
|
||||
vm.startedTimeProgreses.length + vm.futureTimeProgresses.length;
|
||||
if (vm.hasStartedProgresses) {
|
||||
columnChildren.add(Container(
|
||||
height: vm.hasFutureProgresses
|
||||
? (screenHeight / tpCount) * vm.startedTimeProgreses.length
|
||||
: screenHeight,
|
||||
child: ListView(
|
||||
padding: EdgeInsets.all(8),
|
||||
children: startedProgressesTileList,
|
||||
),
|
||||
));
|
||||
}
|
||||
if (vm.hasStartedProgresses && vm.hasFutureProgresses) {
|
||||
columnChildren.add(Divider(
|
||||
height: dividerHeight,
|
||||
));
|
||||
}
|
||||
if (vm.hasFutureProgresses) {
|
||||
columnChildren.add(Container(
|
||||
height: vm.hasStartedProgresses
|
||||
? (screenHeight / tpCount) * vm.futureTimeProgresses.length
|
||||
: screenHeight,
|
||||
child: ListView(
|
||||
padding: EdgeInsets.all(8),
|
||||
children: futureProgressesTileList,
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
return ListView(
|
||||
padding: EdgeInsets.all(8),
|
||||
children: dashboardTileList,
|
||||
if (!vm.hasStartedProgresses && !vm.hasFutureProgresses) {
|
||||
columnChildren.add(Container(
|
||||
margin: EdgeInsets.all(16),
|
||||
child: Center(
|
||||
child: Text("You don't have any tracked Progress."),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: columnChildren,
|
||||
);
|
||||
},
|
||||
),
|
||||
floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
|
||||
floatingActionButton: FloatingActionButton(
|
||||
heroTag: "createProgressBTN",
|
||||
child: Icon(Icons.add),
|
||||
onPressed: () {
|
||||
Navigator.pushNamed(context, ProgressCreationScreen.routeName);
|
||||
@ -77,17 +151,30 @@ class ProgressDashboardScreen extends StatelessWidget {
|
||||
}
|
||||
|
||||
class _ViewModel {
|
||||
final List<TimeProgress> timeProgressList;
|
||||
final List<TimeProgress> startedTimeProgreses;
|
||||
final bool hasStartedProgresses;
|
||||
final List<TimeProgress> futureTimeProgresses;
|
||||
final bool hasFutureProgresses;
|
||||
final bool hasLoaded;
|
||||
|
||||
_ViewModel({
|
||||
@required this.timeProgressList,
|
||||
@required this.startedTimeProgreses,
|
||||
@required this.hasStartedProgresses,
|
||||
@required this.futureTimeProgresses,
|
||||
@required this.hasFutureProgresses,
|
||||
@required this.hasLoaded,
|
||||
});
|
||||
|
||||
static _ViewModel fromStore(Store<AppState> store) {
|
||||
List<TimeProgress> startedTPList =
|
||||
startedTimeProgressesSelector(store.state);
|
||||
List<TimeProgress> furtureTPList =
|
||||
futureTimeProgressesSelector(store.state);
|
||||
return _ViewModel(
|
||||
timeProgressList: store.state.timeProgressList,
|
||||
startedTimeProgreses: startedTPList,
|
||||
hasStartedProgresses: startedTPList.length > 0,
|
||||
futureTimeProgresses: furtureTPList,
|
||||
hasFutureProgresses: furtureTPList.length > 0,
|
||||
hasLoaded: store.state.hasLoaded,
|
||||
);
|
||||
}
|
||||
|
@ -24,6 +24,13 @@ class ProgressDetailScreenArguments {
|
||||
class ProgressDetailScreen extends StatefulWidget {
|
||||
static const routeName = "/progress-detail";
|
||||
|
||||
final String appVersion;
|
||||
|
||||
ProgressDetailScreen({
|
||||
Key key,
|
||||
@required this.appVersion,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() {
|
||||
return _ProgressDetailScreenState();
|
||||
@ -147,7 +154,9 @@ class _ProgressDetailScreenState extends State<ProgressDetailScreen> {
|
||||
appBar: AppBar(
|
||||
title: Text("Progress"),
|
||||
),
|
||||
drawer: AppDrawer(),
|
||||
drawer: AppDrawer(
|
||||
appVersion: widget.appVersion,
|
||||
),
|
||||
body: Container(
|
||||
margin: EdgeInsets.all(8),
|
||||
child: StoreConnector(
|
||||
@ -170,32 +179,58 @@ class _ProgressDetailScreenState extends State<ProgressDetailScreen> {
|
||||
: "The Name of the Time Progress has to be set.",
|
||||
),
|
||||
)
|
||||
: FittedBox(
|
||||
fit: BoxFit.fitWidth,
|
||||
child: Text(
|
||||
vm.timeProgress.name,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
: vm.hasProgressStarted
|
||||
? FittedBox(
|
||||
fit: BoxFit.fitWidth,
|
||||
child: Text(
|
||||
vm.timeProgress.name,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
)
|
||||
: Center(
|
||||
child: FittedBox(
|
||||
fit: BoxFit.fitWidth,
|
||||
child: Text(
|
||||
vm.timeProgress.name,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
vm.hasProgressStarted
|
||||
? Expanded(
|
||||
flex: 2,
|
||||
child: ProgressDetailCircularPercent(
|
||||
percentDone: _isBeingEdited
|
||||
? _editedProgress.percentDone()
|
||||
: vm.timeProgress.percentDone(),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: ProgressDetailCircularPercent(
|
||||
percentDone: _isBeingEdited
|
||||
? _editedProgress.percentDone()
|
||||
: vm.timeProgress.percentDone(),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: ProgressDetailLinearPercent(
|
||||
timeProgress:
|
||||
_isBeingEdited ? _editedProgress : vm.timeProgress,
|
||||
),
|
||||
),
|
||||
)
|
||||
: Expanded(
|
||||
flex: 2,
|
||||
child: Text(
|
||||
"Starts in ${vm.timeProgress.startTime.difference(DateTime.now()).inDays} Days."),
|
||||
),
|
||||
vm.hasProgressStarted
|
||||
? Expanded(
|
||||
flex: 1,
|
||||
child: ProgressDetailLinearPercent(
|
||||
timeProgress: _isBeingEdited
|
||||
? _editedProgress
|
||||
: vm.timeProgress,
|
||||
),
|
||||
)
|
||||
: Spacer(
|
||||
flex: 1,
|
||||
),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Text(
|
||||
@ -242,15 +277,19 @@ class _ProgressDetailScreenState extends State<ProgressDetailScreen> {
|
||||
|
||||
class _ViewModel {
|
||||
final TimeProgress timeProgress;
|
||||
final bool hasProgressStarted;
|
||||
|
||||
_ViewModel({
|
||||
@required this.timeProgress,
|
||||
@required this.hasProgressStarted,
|
||||
});
|
||||
|
||||
static _ViewModel fromStoreAndArg(
|
||||
Store<AppState> store, ProgressDetailScreenArguments args) {
|
||||
TimeProgress tp = timeProgressByIdSelector(store.state, args.id);
|
||||
return _ViewModel(
|
||||
timeProgress: timeProgressByIdSelector(store.state, args.id),
|
||||
);
|
||||
timeProgress: tp,
|
||||
hasProgressStarted: DateTime.now().millisecondsSinceEpoch >
|
||||
tp.startTime.millisecondsSinceEpoch);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user