Created ProgressEditorWidget and rewritten ProgressCreationScreen with it
Signed-off-by: Andreas Fahrecker <AndreasFahrecker@gmail.com>
This commit is contained in:
parent
763cf9d627
commit
1abfd0c1f5
@ -11,13 +11,7 @@ class TimeProgress {
|
|||||||
final DateTime endTime;
|
final DateTime endTime;
|
||||||
|
|
||||||
TimeProgress(this.name, this.startTime, this.endTime, {String id})
|
TimeProgress(this.name, this.startTime, this.endTime, {String id})
|
||||||
: id = id ?? Uuid().generateV4() {
|
: id = id ?? Uuid().generateV4();
|
||||||
if (this.name == null || this.name == "")
|
|
||||||
throw new TimeProgressInvalidNameException(this.name);
|
|
||||||
if (!this.startTime.isBefore(this.endTime))
|
|
||||||
throw new TimeProgressStartTimeIsNotBeforeEndTimeException(
|
|
||||||
startTime, endTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
factory TimeProgress.initialDefault() {
|
factory TimeProgress.initialDefault() {
|
||||||
int thisYear = DateTime.now().year;
|
int thisYear = DateTime.now().year;
|
||||||
@ -81,6 +75,11 @@ class TimeProgress {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TimeProgressEntity toEntity() {
|
TimeProgressEntity toEntity() {
|
||||||
|
if (!TimeProgress.isNameValid(name))
|
||||||
|
throw new TimeProgressInvalidNameException(name);
|
||||||
|
if (!TimeProgress.areTimesValid(startTime, endTime))
|
||||||
|
throw new TimeProgressStartTimeIsNotBeforeEndTimeException(
|
||||||
|
startTime, endTime);
|
||||||
return TimeProgressEntity(id, name, startTime, endTime);
|
return TimeProgressEntity(id, name, startTime, endTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,4 +91,17 @@ class TimeProgress {
|
|||||||
id: entity.id ?? Uuid().generateV4(),
|
id: entity.id ?? Uuid().generateV4(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isValid(TimeProgress tp) {
|
||||||
|
return TimeProgress.isNameValid(tp.name) &&
|
||||||
|
TimeProgress.areTimesValid(tp.startTime, tp.endTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isNameValid(String name) {
|
||||||
|
return name != null && name != "" && name.length > 3 && name.length < 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool areTimesValid(DateTime startTime, DateTime endTime) {
|
||||||
|
return startTime.isBefore(endTime);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import 'package:time_progress_tracker/models/app_exceptions.dart';
|
|||||||
import 'package:time_progress_tracker/models/app_state.dart';
|
import 'package:time_progress_tracker/models/app_state.dart';
|
||||||
import 'package:time_progress_tracker/models/time_progress.dart';
|
import 'package:time_progress_tracker/models/time_progress.dart';
|
||||||
import 'package:time_progress_tracker/widgets/date_picker_btn.dart';
|
import 'package:time_progress_tracker/widgets/date_picker_btn.dart';
|
||||||
|
import 'package:time_progress_tracker/widgets/progress_editor_widget.dart';
|
||||||
|
|
||||||
class ProgressCreationScreen extends StatefulWidget {
|
class ProgressCreationScreen extends StatefulWidget {
|
||||||
static const routeName = "/progress-creation";
|
static const routeName = "/progress-creation";
|
||||||
@ -18,115 +19,26 @@ class ProgressCreationScreen extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ProgressCreationScreenState extends State<ProgressCreationScreen> {
|
class _ProgressCreationScreenState extends State<ProgressCreationScreen> {
|
||||||
final TextEditingController _nameController = TextEditingController();
|
TimeProgress timeProgressToCreate =
|
||||||
DateTime pickedStartTime = DateTime.now();
|
TimeProgress("", DateTime.now(), DateTime(DateTime.now().year + 1));
|
||||||
DateTime pickedEndTime = DateTime(
|
|
||||||
DateTime.now().year + 1, DateTime.now().month, DateTime.now().day);
|
|
||||||
|
|
||||||
bool _validName = true;
|
void onTimeProgressChanged(TimeProgress newTimeProgress) {
|
||||||
bool _validDates = true;
|
|
||||||
|
|
||||||
void _createTimeProgress(BuildContext context) {
|
|
||||||
try {
|
|
||||||
TimeProgress tpToCreate =
|
|
||||||
TimeProgress(_nameController.text, pickedStartTime, pickedEndTime);
|
|
||||||
StoreProvider.of<AppState>(context)
|
|
||||||
.dispatch(AddTimeProgressAction(tpToCreate));
|
|
||||||
Navigator.pop(context);
|
|
||||||
} on TimeProgressInvalidNameException catch (e) {
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_validName = false;
|
timeProgressToCreate = newTimeProgress;
|
||||||
});
|
});
|
||||||
} on TimeProgressStartTimeIsNotBeforeEndTimeException catch (e) {
|
|
||||||
setState(() {
|
|
||||||
_validDates = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_nameController.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
ThemeData appTheme = Theme.of(context);
|
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(ProgressCreationScreen.title),
|
title: Text(ProgressCreationScreen.title),
|
||||||
),
|
),
|
||||||
body: Container(
|
body: Container(
|
||||||
padding: EdgeInsets.all(8),
|
padding: EdgeInsets.all(12),
|
||||||
child: Column(
|
child: ProgressEditorWidget(
|
||||||
children: <Widget>[
|
timeProgress: timeProgressToCreate,
|
||||||
Expanded(
|
onTimeProgressChanged: onTimeProgressChanged,
|
||||||
flex: 1,
|
|
||||||
child: TextField(
|
|
||||||
controller: _nameController,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
border: OutlineInputBorder(),
|
|
||||||
labelText: "Progress Name",
|
|
||||||
errorText: _validName
|
|
||||||
? null
|
|
||||||
: "The Name of the Time Progress has to be set.",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
flex: 1,
|
|
||||||
child: Row(
|
|
||||||
children: <Widget>[
|
|
||||||
Expanded(
|
|
||||||
flex: 5,
|
|
||||||
child: DatePickerBtn(
|
|
||||||
leadingString: "Start Date:",
|
|
||||||
pickedDate: pickedStartTime,
|
|
||||||
onDatePicked: (DateTime startTime) {
|
|
||||||
if (startTime != null) {
|
|
||||||
setState(() {
|
|
||||||
pickedStartTime = startTime;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Spacer(
|
|
||||||
flex: 1,
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
flex: 5,
|
|
||||||
child: DatePickerBtn(
|
|
||||||
leadingString: "EndDate:",
|
|
||||||
pickedDate: pickedEndTime,
|
|
||||||
onDatePicked: (DateTime endTime) {
|
|
||||||
if (endTime != null) {
|
|
||||||
setState(() {
|
|
||||||
pickedEndTime = endTime;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
_validDates
|
|
||||||
? Spacer(
|
|
||||||
flex: 1,
|
|
||||||
)
|
|
||||||
: Expanded(
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
"Your Picked Dates are invalid. The Start Date has to be before the end Date."),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Spacer(
|
|
||||||
flex: 4,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
|
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
|
||||||
@ -136,9 +48,13 @@ class _ProgressCreationScreenState extends State<ProgressCreationScreen> {
|
|||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
heroTag: "createTimeProgressBTN",
|
heroTag: "createTimeProgressBTN",
|
||||||
child: Icon(Icons.save),
|
child: Icon(Icons.save),
|
||||||
onPressed: () {
|
onPressed: TimeProgress.isValid(timeProgressToCreate)
|
||||||
_createTimeProgress(context);
|
? () {
|
||||||
},
|
StoreProvider.of<AppState>(context).dispatch(
|
||||||
|
AddTimeProgressAction(timeProgressToCreate));
|
||||||
|
Navigator.pop(context);
|
||||||
|
}
|
||||||
|
: null,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
116
lib/widgets/progress_editor_widget.dart
Normal file
116
lib/widgets/progress_editor_widget.dart
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:time_progress_tracker/models/time_progress.dart';
|
||||||
|
import 'package:time_progress_tracker/widgets/date_picker_btn.dart';
|
||||||
|
|
||||||
|
class ProgressEditorWidget extends StatefulWidget {
|
||||||
|
final TimeProgress timeProgress;
|
||||||
|
final Function(TimeProgress) onTimeProgressChanged;
|
||||||
|
|
||||||
|
ProgressEditorWidget({
|
||||||
|
@required this.timeProgress,
|
||||||
|
@required this.onTimeProgressChanged,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() {
|
||||||
|
return _ProgressEditorWidgetState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ProgressEditorWidgetState extends State<ProgressEditorWidget> {
|
||||||
|
bool _validName = true, _validDate = true;
|
||||||
|
|
||||||
|
void _onNameChanged(String newName) {
|
||||||
|
if (!TimeProgress.isNameValid(newName))
|
||||||
|
setState(() {
|
||||||
|
_validName = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
widget.onTimeProgressChanged(widget.timeProgress.copyWith(name: newName));
|
||||||
|
setState(() {
|
||||||
|
_validName = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onStartDateChanged(DateTime newStartDate) {
|
||||||
|
if (!TimeProgress.areTimesValid(newStartDate, widget.timeProgress.endTime))
|
||||||
|
setState(() {
|
||||||
|
_validDate = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
widget.onTimeProgressChanged(
|
||||||
|
widget.timeProgress.copyWith(startTime: newStartDate));
|
||||||
|
setState(() {
|
||||||
|
_validDate = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onEndDateChanged(DateTime newEndDate) {
|
||||||
|
if (!TimeProgress.areTimesValid(widget.timeProgress.startTime, newEndDate))
|
||||||
|
setState(() {
|
||||||
|
_validDate = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
widget.onTimeProgressChanged(
|
||||||
|
widget.timeProgress.copyWith(endTime: newEndDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
List<Widget> columnChildren = [
|
||||||
|
Expanded(
|
||||||
|
child: TextField(
|
||||||
|
onChanged: _onNameChanged,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
border: OutlineInputBorder(),
|
||||||
|
labelText: "Progress Name",
|
||||||
|
errorText:
|
||||||
|
_validName ? null : "The Name of the Progress can't be empty.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(right: 5),
|
||||||
|
child: DatePickerBtn(
|
||||||
|
leadingString: "Start Date:",
|
||||||
|
pickedDate: widget.timeProgress.startTime,
|
||||||
|
onDatePicked: _onStartDateChanged,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(left: 5),
|
||||||
|
child: DatePickerBtn(
|
||||||
|
leadingString: "End Date:",
|
||||||
|
pickedDate: widget.timeProgress.endTime,
|
||||||
|
onDatePicked: _onEndDateChanged,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!_validDate)
|
||||||
|
columnChildren.add(
|
||||||
|
Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: Text(
|
||||||
|
"Invalid Dates. The Start Date has to be before the End Date"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
child: Column(
|
||||||
|
children: columnChildren,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user