diff --git a/lib/data/models/serializers.g.dart b/lib/data/models/serializers.g.dart index f47f36898..4da2ce334 100644 --- a/lib/data/models/serializers.g.dart +++ b/lib/data/models/serializers.g.dart @@ -114,6 +114,7 @@ Serializers _$serializers = (new Serializers().toBuilder() ..add(TaskItemResponse.serializer) ..add(TaskListResponse.serializer) ..add(TaskState.serializer) + ..add(TaskTime.serializer) ..add(TaskUIState.serializer) ..add(TaxRateEntity.serializer) ..add(TimezoneEntity.serializer) diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index 1153aaa54..99342d712 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -13,7 +13,7 @@ part 'task_model.g.dart'; abstract class TaskListResponse implements Built { factory TaskListResponse([void updates(TaskListResponseBuilder b)]) = - _$TaskListResponse; + _$TaskListResponse; TaskListResponse._(); @@ -26,7 +26,7 @@ abstract class TaskListResponse abstract class TaskItemResponse implements Built { factory TaskItemResponse([void updates(TaskItemResponseBuilder b)]) = - _$TaskItemResponse; + _$TaskItemResponse; TaskItemResponse._(); @@ -52,18 +52,32 @@ class TaskFields { static const String isDeleted = 'isDeleted'; } -class TaskTime { - TaskTime({this.startDate, this.endDate}); - final DateTime startDate; - final DateTime endDate; +abstract class TaskTime implements Built { + + factory TaskTime({DateTime startDate, DateTime endDate}) { + return _$TaskTime._( + startDate: startDate ?? DateTime.now().toUtc(), + endDate: endDate, + ); + } + + TaskTime._(); + + DateTime get startDate; + + @nullable + DateTime get endDate; Duration get duration => (endDate ?? DateTime.now()).difference(startDate); - List get asList => [ + List get asList => + [ (startDate.millisecondsSinceEpoch / 1000).floor(), endDate != null ? (endDate.millisecondsSinceEpoch / 1000).floor() : 0 ]; + + static Serializer get serializer => _$taskTimeSerializer; } abstract class TaskEntity extends Object @@ -78,7 +92,9 @@ abstract class TaskEntity extends Object clientId: null, projectId: null, timeLog: isRunning - ? '[[${(DateTime.now().millisecondsSinceEpoch / 1000).floor()},0]]' + ? '[[${(DateTime + .now() + .millisecondsSinceEpoch / 1000).floor()},0]]' : '', isRunning: false, customValue1: '', @@ -119,7 +135,7 @@ abstract class TaskEntity extends Object final taskTime = TaskTime( startDate: convertTimestampToDate(startDate), endDate: - endDate > 0 ? convertTimestampToDate(endDate) : DateTime.now()); + endDate > 0 ? convertTimestampToDate(endDate) : DateTime.now()); details.add(taskTime); }); @@ -129,7 +145,7 @@ abstract class TaskEntity extends Object String addTaskTime(TaskTime time) { final List taskTimes = - timeLog.isNotEmpty ? jsonDecode(timeLog) : []; + timeLog.isNotEmpty ? jsonDecode(timeLog) : []; taskTimes.add(time.asList); return jsonEncode(taskTimes); diff --git a/lib/data/models/task_model.g.dart b/lib/data/models/task_model.g.dart index 57167b5f0..f7ca62cfd 100644 --- a/lib/data/models/task_model.g.dart +++ b/lib/data/models/task_model.g.dart @@ -23,6 +23,7 @@ Serializer _$taskListResponseSerializer = new _$TaskListResponseSerializer(); Serializer _$taskItemResponseSerializer = new _$TaskItemResponseSerializer(); +Serializer _$taskTimeSerializer = new _$TaskTimeSerializer(); Serializer _$taskEntitySerializer = new _$TaskEntitySerializer(); class _$TaskListResponseSerializer @@ -109,6 +110,56 @@ class _$TaskItemResponseSerializer } } +class _$TaskTimeSerializer implements StructuredSerializer { + @override + final Iterable types = const [TaskTime, _$TaskTime]; + @override + final String wireName = 'TaskTime'; + + @override + Iterable serialize(Serializers serializers, TaskTime object, + {FullType specifiedType = FullType.unspecified}) { + final result = [ + 'startDate', + serializers.serialize(object.startDate, + specifiedType: const FullType(DateTime)), + ]; + if (object.endDate != null) { + result + ..add('endDate') + ..add(serializers.serialize(object.endDate, + specifiedType: const FullType(DateTime))); + } + + return result; + } + + @override + TaskTime deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = new TaskTimeBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case 'startDate': + result.startDate = serializers.deserialize(value, + specifiedType: const FullType(DateTime)) as DateTime; + break; + case 'endDate': + result.endDate = serializers.deserialize(value, + specifiedType: const FullType(DateTime)) as DateTime; + break; + } + } + + return result.build(); + } +} + class _$TaskEntitySerializer implements StructuredSerializer { @override final Iterable types = const [TaskEntity, _$TaskEntity]; @@ -457,6 +508,94 @@ class TaskItemResponseBuilder } } +class _$TaskTime extends TaskTime { + @override + final DateTime startDate; + @override + final DateTime endDate; + + factory _$TaskTime([void updates(TaskTimeBuilder b)]) => + (new TaskTimeBuilder()..update(updates)).build(); + + _$TaskTime._({this.startDate, this.endDate}) : super._() { + if (startDate == null) { + throw new BuiltValueNullFieldError('TaskTime', 'startDate'); + } + } + + @override + TaskTime rebuild(void updates(TaskTimeBuilder b)) => + (toBuilder()..update(updates)).build(); + + @override + TaskTimeBuilder toBuilder() => new TaskTimeBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is TaskTime && + startDate == other.startDate && + endDate == other.endDate; + } + + @override + int get hashCode { + return $jf($jc($jc(0, startDate.hashCode), endDate.hashCode)); + } + + @override + String toString() { + return (newBuiltValueToStringHelper('TaskTime') + ..add('startDate', startDate) + ..add('endDate', endDate)) + .toString(); + } +} + +class TaskTimeBuilder implements Builder { + _$TaskTime _$v; + + DateTime _startDate; + DateTime get startDate => _$this._startDate; + set startDate(DateTime startDate) => _$this._startDate = startDate; + + DateTime _endDate; + DateTime get endDate => _$this._endDate; + set endDate(DateTime endDate) => _$this._endDate = endDate; + + TaskTimeBuilder(); + + TaskTimeBuilder get _$this { + if (_$v != null) { + _startDate = _$v.startDate; + _endDate = _$v.endDate; + _$v = null; + } + return this; + } + + @override + void replace(TaskTime other) { + if (other == null) { + throw new ArgumentError.notNull('other'); + } + _$v = other as _$TaskTime; + } + + @override + void update(void updates(TaskTimeBuilder b)) { + if (updates != null) updates(this); + } + + @override + _$TaskTime build() { + final _$result = + _$v ?? new _$TaskTime._(startDate: startDate, endDate: endDate); + replace(_$result); + return _$result; + } +} + class _$TaskEntity extends TaskEntity { @override final String description; diff --git a/lib/redux/task/task_reducer.dart b/lib/redux/task/task_reducer.dart index c4e2d4dd7..f3f1a2ce5 100644 --- a/lib/redux/task/task_reducer.dart +++ b/lib/redux/task/task_reducer.dart @@ -10,7 +10,7 @@ EntityUIState taskUIReducer(TaskUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(taskListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) - ..editingTime = editingTimeReducer(state.editingTime, action) + ..editingTime.replace(editingTimeReducer(state.editingTime, action)) ..selectedId = selectedIdReducer(state.selectedId, action)); } diff --git a/lib/redux/task/task_state.dart b/lib/redux/task/task_state.dart index b7104cb84..c45594205 100644 --- a/lib/redux/task/task_state.dart +++ b/lib/redux/task/task_state.dart @@ -44,7 +44,7 @@ abstract class TaskUIState extends Object with EntityUIState implements Built { specifiedType: const FullType(TaskEntity)) as TaskEntity); break; case 'editingTime': - result.editingTime = serializers.deserialize(value, - specifiedType: const FullType(TaskTime)) as TaskTime; + result.editingTime.replace(serializers.deserialize(value, + specifiedType: const FullType(TaskTime)) as TaskTime); break; case 'selectedId': result.selectedId = serializers.deserialize(value, @@ -338,9 +338,11 @@ class TaskUIStateBuilder implements Builder { TaskEntityBuilder get editing => _$this._editing ??= new TaskEntityBuilder(); set editing(TaskEntityBuilder editing) => _$this._editing = editing; - TaskTime _editingTime; - TaskTime get editingTime => _$this._editingTime; - set editingTime(TaskTime editingTime) => _$this._editingTime = editingTime; + TaskTimeBuilder _editingTime; + TaskTimeBuilder get editingTime => + _$this._editingTime ??= new TaskTimeBuilder(); + set editingTime(TaskTimeBuilder editingTime) => + _$this._editingTime = editingTime; int _selectedId; int get selectedId => _$this._selectedId; @@ -357,7 +359,7 @@ class TaskUIStateBuilder implements Builder { TaskUIStateBuilder get _$this { if (_$v != null) { _editing = _$v.editing?.toBuilder(); - _editingTime = _$v.editingTime; + _editingTime = _$v.editingTime?.toBuilder(); _selectedId = _$v.selectedId; _listUIState = _$v.listUIState?.toBuilder(); _$v = null; @@ -385,7 +387,7 @@ class TaskUIStateBuilder implements Builder { _$result = _$v ?? new _$TaskUIState._( editing: _editing?.build(), - editingTime: editingTime, + editingTime: _editingTime?.build(), selectedId: selectedId, listUIState: listUIState.build()); } catch (_) { @@ -393,6 +395,8 @@ class TaskUIStateBuilder implements Builder { try { _$failedField = 'editing'; _editing?.build(); + _$failedField = 'editingTime'; + _editingTime?.build(); _$failedField = 'listUIState'; listUIState.build(); diff --git a/lib/ui/task/edit/task_edit_times.dart b/lib/ui/task/edit/task_edit_times.dart index 36622fcfb..a6cbb0f2d 100644 --- a/lib/ui/task/edit/task_edit_times.dart +++ b/lib/ui/task/edit/task_edit_times.dart @@ -101,6 +101,19 @@ class TimeEditDetailsState extends State { TimeOfDay _startTime; TimeOfDay _endTime; + @override + void didChangeDependencies() { + _date = widget.taskTime.startDate.toIso8601String(); + _startTime = TimeOfDay( + hour: widget.taskTime.startDate.hour, + minute: widget.taskTime.startDate.minute); + _endTime = TimeOfDay( + hour: widget.taskTime.endDate.hour, + minute: widget.taskTime.endDate.minute); + + super.didChangeDependencies(); + } + @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); @@ -155,7 +168,6 @@ class TimeEditDetailsState extends State { icon: Icons.check_circle, label: localization.done, onPressed: () { - final origTaskTime = widget.taskTime; final date = DateTime.parse(_date); final taskTime = TaskTime( startDate: DateTime(date.year, date.month, date.day,