1
0
mirror of https://github.com/go-vikunja/app synced 2024-06-02 18:49:47 +00:00
app-mirror-github/lib/components/TaskTile.dart

134 lines
4.0 KiB
Dart
Raw Normal View History

2018-09-27 15:55:56 +00:00
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
2018-09-27 15:55:56 +00:00
import 'package:vikunja_app/models/task.dart';
import 'package:vikunja_app/utils/misc.dart';
import 'package:vikunja_app/pages/list/task_edit.dart';
import 'package:vikunja_app/stores/list_store.dart';
2018-09-27 15:55:56 +00:00
2018-09-27 15:55:56 +00:00
class TaskTile extends StatefulWidget {
final Task task;
final Function onEdit;
final bool showInfo;
2018-09-27 15:55:56 +00:00
final bool loading;
2022-08-27 21:04:43 +00:00
final ValueSetter<bool>? onMarkedAsDone;
2018-09-27 15:55:56 +00:00
2022-09-03 15:43:16 +00:00
const TaskTile({
Key? key,
required this.task,
required this.onEdit,
this.loading = false,
this.showInfo = false,
this.onMarkedAsDone,
}) : super(key: key);
/*
2018-09-27 15:55:56 +00:00
@override
TaskTileState createState() {
return new TaskTileState(this.task, this.loading);
}
*/
@override
TaskTileState createState() => TaskTileState(this.task);
2018-09-27 15:55:56 +00:00
}
2022-07-27 18:48:16 +00:00
class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin {
2018-09-27 15:55:56 +00:00
Task _currentTask;
2022-08-27 21:04:43 +00:00
TaskTileState(this._currentTask);
2018-09-27 15:55:56 +00:00
@override
Widget build(BuildContext context) {
2022-07-27 18:48:16 +00:00
super.build(context);
final taskState = Provider.of<ListProvider>(context);
2022-08-27 21:04:43 +00:00
Duration? durationUntilDue = _currentTask.dueDate?.difference(DateTime.now());
if (_currentTask.loading) {
2018-09-27 15:55:56 +00:00
return ListTile(
leading: Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
height: Checkbox.width,
width: Checkbox.width,
child: CircularProgressIndicator(
strokeWidth: 2.0,
)),
),
2022-09-03 15:43:16 +00:00
title: Text(_currentTask.title),
2018-09-27 15:55:56 +00:00
subtitle:
2022-09-03 15:43:16 +00:00
_currentTask.description.isEmpty
2018-09-27 15:55:56 +00:00
? null
2022-09-03 15:43:16 +00:00
: Text(_currentTask.description),
2019-03-11 20:29:15 +00:00
trailing: IconButton(
icon: Icon(Icons.settings), onPressed: () { },
),
2018-09-27 15:55:56 +00:00
);
}
return CheckboxListTile(
title: widget.showInfo ?
RichText(
text: TextSpan(
text: null,
children: <TextSpan> [
// TODO: get list name of task
//TextSpan(text: widget.task.list.title+" - ", style: TextStyle(color: Colors.grey)),
TextSpan(text: widget.task.title),
2022-08-02 16:02:01 +00:00
],
style: TextStyle(
color: Theme.of(context).brightness == Brightness.dark ? Colors.white : Colors.black,
),
)
2022-09-03 15:43:16 +00:00
) : Text(_currentTask.title),
2018-09-27 15:55:56 +00:00
controlAffinity: ListTileControlAffinity.leading,
value: _currentTask.done,
2022-08-05 05:56:27 +00:00
subtitle: widget.showInfo && _currentTask.hasDueDate ?
2022-09-03 15:43:16 +00:00
Text("Due " + durationToHumanReadable(durationUntilDue!), style: durationUntilDue.isNegative ? TextStyle(color: Colors.red) : null,)
: _currentTask.description.isEmpty
2018-09-27 15:55:56 +00:00
? null
2022-09-03 15:43:16 +00:00
: Text(_currentTask.description),
2018-09-27 15:55:56 +00:00
secondary:
IconButton(icon: Icon(Icons.settings), onPressed: () {
Navigator.push<Task>(
context,
MaterialPageRoute(
builder: (buildContext) => TaskEditPage(
task: _currentTask,
taskState: taskState,
),
),
).then((task) => setState(() {
if (task != null) _currentTask = task;
})).whenComplete(() => widget.onEdit());
}),
2018-09-27 15:55:56 +00:00
onChanged: _change,
);
}
2022-08-27 21:04:43 +00:00
void _change(bool? value) async {
value = value ?? false;
2018-09-27 15:55:56 +00:00
setState(() {
this._currentTask.loading = true;
2018-09-27 15:55:56 +00:00
});
Task newTask = await _updateTask(_currentTask, value);
setState(() {
this._currentTask = newTask;
this._currentTask.loading = false;
2018-09-27 15:55:56 +00:00
});
widget.onEdit();
2018-09-27 15:55:56 +00:00
}
Future<Task> _updateTask(Task task, bool checked) {
return Provider.of<ListProvider>(context, listen: false).updateTask(
context: context,
task: task.copyWith(
done: checked,
),
);
2018-09-27 15:55:56 +00:00
}
2022-07-27 18:48:16 +00:00
@override
bool get wantKeepAlive => _currentTask != widget.task;
2018-09-27 15:55:56 +00:00
}
typedef Future<void> TaskChanged(Task task, bool newValue);