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

added priority to task subtitle

This commit is contained in:
Benimautner 2023-11-28 17:05:30 +01:00
parent b7246cf433
commit 347bd6cd66
3 changed files with 80 additions and 46 deletions

View File

@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/models/task.dart';
import 'package:vikunja_app/utils/misc.dart'; import 'package:vikunja_app/utils/misc.dart';
import 'package:vikunja_app/pages/list/task_edit.dart'; import 'package:vikunja_app/pages/list/task_edit.dart';
import 'package:vikunja_app/utils/priority.dart';
import '../stores/project_store.dart'; import '../stores/project_store.dart';
@ -34,6 +35,31 @@ class TaskTile extends StatefulWidget {
TaskTileState createState() => TaskTileState(this.task); TaskTileState createState() => TaskTileState(this.task);
} }
Widget? _buildTaskSubtitle(Task? task, bool showInfo) {
Duration? durationUntilDue = task?.dueDate?.difference(DateTime.now());
if(task == null)
return null;
List<TextSpan> texts = [];
if(showInfo && task.hasDueDate) {
texts.add(TextSpan(text: "Due " + durationToHumanReadable(durationUntilDue!), style: durationUntilDue.isNegative ? TextStyle(color: Colors.red) : null));
}
if(task.priority != null && task.priority != 0) {
texts.add(TextSpan(text: " !" + priorityToString(task.projectId), style: TextStyle(color: Colors.orange)));
}
if(texts.isEmpty && task.description.isNotEmpty) {
return Text(task.description);
}
if(texts.isNotEmpty) {
return RichText(text: TextSpan(children: texts));
}
return null;
}
class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin { class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin {
Task _currentTask; Task _currentTask;
@ -43,7 +69,6 @@ class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin {
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
final taskState = Provider.of<ProjectProvider>(context); final taskState = Provider.of<ProjectProvider>(context);
Duration? durationUntilDue = _currentTask.dueDate?.difference(DateTime.now());
if (_currentTask.loading) { if (_currentTask.loading) {
return ListTile( return ListTile(
leading: Padding( leading: Padding(
@ -65,7 +90,17 @@ class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin {
), ),
); );
} }
return CheckboxListTile( return
IntrinsicHeight(child:
Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
width: 4.0, // Adjust the width of the red line
color: widget.task.color,
//margin: EdgeInsets.only(left: 10.0),
),
Flexible(child: CheckboxListTile(
title: widget.showInfo ? title: widget.showInfo ?
RichText( RichText(
text: TextSpan( text: TextSpan(
@ -82,11 +117,7 @@ class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin {
) : Text(_currentTask.title), ) : Text(_currentTask.title),
controlAffinity: ListTileControlAffinity.leading, controlAffinity: ListTileControlAffinity.leading,
value: _currentTask.done, value: _currentTask.done,
subtitle: widget.showInfo && _currentTask.hasDueDate ? subtitle: _buildTaskSubtitle(widget.task, widget.showInfo),
Text("Due " + durationToHumanReadable(durationUntilDue!), style: durationUntilDue.isNegative ? TextStyle(color: Colors.red) : null,)
: _currentTask.description.isEmpty
? null
: Text(_currentTask.description),
secondary: secondary:
IconButton(icon: Icon(Icons.settings), onPressed: () { IconButton(icon: Icon(Icons.settings), onPressed: () {
Navigator.push<Task>( Navigator.push<Task>(
@ -102,7 +133,7 @@ class TaskTileState extends State<TaskTile> with AutomaticKeepAliveClientMixin {
})).whenComplete(() => widget.onEdit()); })).whenComplete(() => widget.onEdit());
}), }),
onChanged: _change, onChanged: _change,
); ))]));
} }
void _change(bool? value) async { void _change(bool? value) async {

View File

@ -7,6 +7,7 @@ import 'package:vikunja_app/global.dart';
import 'package:vikunja_app/models/label.dart'; import 'package:vikunja_app/models/label.dart';
import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/models/task.dart';
import 'package:vikunja_app/utils/repeat_after_parse.dart'; import 'package:vikunja_app/utils/repeat_after_parse.dart';
import 'package:vikunja_app/utils/priority.dart';
import '../../stores/project_store.dart'; import '../../stores/project_store.dart';
@ -270,12 +271,12 @@ class _TaskEditPageState extends State<TaskEditPage> {
border: InputBorder.none, border: InputBorder.none,
), ),
child: new DropdownButton<String>( child: new DropdownButton<String>(
value: _priorityToString(_priority), value: priorityToString(_priority),
isExpanded: true, isExpanded: true,
isDense: true, isDense: true,
onChanged: (String? newValue) { onChanged: (String? newValue) {
setState(() { setState(() {
_priority = _priorityFromString(newValue); _priority = priorityFromString(newValue);
}); });
}, },
items: [ items: [
@ -557,43 +558,7 @@ class _TaskEditPageState extends State<TaskEditPage> {
}); });
} }
// FIXME: Move the following two functions to an extra class or type.
_priorityFromString(String? priority) {
switch (priority) {
case 'Low':
return 1;
case 'Medium':
return 2;
case 'High':
return 3;
case 'Urgent':
return 4;
case 'DO NOW':
return 5;
default:
// unset
return 0;
}
}
_priorityToString(int? priority) {
switch (priority) {
case 0:
return 'Unset';
case 1:
return 'Low';
case 2:
return 'Medium';
case 3:
return 'High';
case 4:
return 'Urgent';
case 5:
return 'DO NOW';
default:
return null;
}
}
_onColorEdit() { _onColorEdit() {
_pickerColor = _resetColor || (_color ?? widget.task.color) == null _pickerColor = _resetColor || (_color ?? widget.task.color) == null

38
lib/utils/priority.dart Normal file
View File

@ -0,0 +1,38 @@
priorityToString(int? priority) {
switch (priority) {
case 0:
return 'Unset';
case 1:
return 'Low';
case 2:
return 'Medium';
case 3:
return 'High';
case 4:
return 'Urgent';
case 5:
return 'DO NOW';
default:
return null;
}
}
// FIXME: Move the following two functions to an extra class or type.
priorityFromString(String? priority) {
switch (priority) {
case 'Low':
return 1;
case 'Medium':
return 2;
case 'High':
return 3;
case 'Urgent':
return 4;
case 'DO NOW':
return 5;
default:
// unset
return 0;
}
}