From 53521aae404a8d5da12c60603beb188aac341188 Mon Sep 17 00:00:00 2001 From: Bharat Sharma Date: Tue, 22 Sep 2020 03:03:00 +0530 Subject: [PATCH] feat: add sections in task tab (#130) * feat: add sections in task tab * Make page scrollable if it exceeds screen length Co-authored-by: Jayesh Nirve --- .../home/pages/relation/relation_page.dart | 195 ++++++++++++------ 1 file changed, 129 insertions(+), 66 deletions(-) diff --git a/lib/screens/home/pages/relation/relation_page.dart b/lib/screens/home/pages/relation/relation_page.dart index 3f78990..63dc930 100644 --- a/lib/screens/home/pages/relation/relation_page.dart +++ b/lib/screens/home/pages/relation/relation_page.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:mentorship_client/extensions/context.dart'; @@ -39,7 +40,8 @@ class _RelationPageState extends State { Tab(text: "Tasks".toUpperCase()), ], ), - body: BlocConsumer(listener: (context, state) { + body: BlocConsumer( + listener: (context, state) { if (state.message != null && state is RelationPageSuccess) { context.showSnackBar(state.message); Navigator.of(context).pop(); @@ -140,8 +142,10 @@ class _RelationPageState extends State { children: [ BoldText("Mentor: ", state.relation.mentor.name), BoldText("Mentee: ", state.relation.mentee.name), - BoldText("End date: ", - DateTimeX.fromTimestamp(state.relation.endsOn).toDateString()), + BoldText( + "End date: ", + DateTimeX.fromTimestamp(state.relation.endsOn) + .toDateString()), BoldText("Notes: ", state.relation.notes), ], ), @@ -151,7 +155,8 @@ class _RelationPageState extends State { ), RaisedButton( color: Theme.of(context).accentColor, - child: Text("Cancel".toUpperCase(), style: TextStyle(color: Colors.white)), + child: Text("Cancel".toUpperCase(), + style: TextStyle(color: Colors.white)), onPressed: () { //ignore: close_sinks final bloc = BlocProvider.of(context); @@ -161,12 +166,14 @@ class _RelationPageState extends State { builder: (context) { return AlertDialog( title: Text("Cancel Relation"), - content: Text("Are you sure you want to cancel the relation"), + content: Text( + "Are you sure you want to cancel the relation"), actions: [ FlatButton( child: Text("Yes"), onPressed: () { - bloc.add(RelationPageCancelledRelation(state.relation.id)); + bloc.add(RelationPageCancelledRelation( + state.relation.id)); Navigator.of(context).pop(); }, ), @@ -203,75 +210,131 @@ class _RelationPageState extends State { ); } - return ListView.builder( - shrinkWrap: true, - itemCount: state.tasks.length, - itemBuilder: (context, index) { - Task task = state.tasks[index]; - //ignore: close_sinks - final bloc = BlocProvider.of(context); + final _taskList = state.tasks; + List _doneTasks = []; + List _toDoTasks = []; + for (var _task in _taskList) { + if (_task.isDone) { + _doneTasks.add(_task); + } else { + _toDoTasks.add(_task); + } + } - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - GestureDetector( - onTap: () { - if (!task.isDone) { - bloc.add(TaskCompleted(state.relation, task.id)); - showProgressIndicator(context); - } else - context.toast("Task already achieved."); - }, - child: Checkbox( - value: task.isDone, - ), - ), - Text(task.description), - ], + return ListView( + children: [ + SizedBox(height: 10.0), + ExpandablePanel( + header: Container( + padding: EdgeInsets.only( + left: 15, + top: 10.0, ), - IconButton( - icon: Icon( - Icons.delete, - color: Colors.grey[700], - ), - onPressed: () { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text("Delete task"), - content: Text("Are you sure you want to delete the task?"), - actions: [ - FlatButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text("Cancel"), - ), - FlatButton( - child: Text("Delete"), - onPressed: () { - bloc.add(TaskDeleted(state.relation, task.id)); - Navigator.of(context).pop(); - showProgressIndicator(context); - }, - ), - ], - ), - ); - }, + child: Text( + "To Do", + style: Theme.of(context).textTheme.bodyText1, ), - ], - ); - }, + ), + expanded: _buildListView( + + context: context, + state: state, + tasksList: _toDoTasks, + ), + ), + SizedBox(height: 20.0), + ExpandablePanel( + header: Container( + padding: EdgeInsets.only( + left: 15, + top: 10.0, + ), + child: Text( + "Achivements", + style: Theme.of(context).textTheme.bodyText1, + ), + ), + expanded: _buildListView( + context: context, + state: state, + tasksList: _doneTasks, + ), + ), + ], ); }, ), ); } + Widget _buildListView( + {BuildContext context, List tasksList, RelationPageSuccess state}) { + return ListView.builder( + physics: ClampingScrollPhysics(), + shrinkWrap: true, + itemCount: tasksList.length, + itemBuilder: (context, index) { + Task task = tasksList[index]; + //ignore: close_sinks + final bloc = BlocProvider.of(context); + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + GestureDetector( + onTap: () { + if (!task.isDone) { + bloc.add(TaskCompleted(state.relation, task.id)); + showProgressIndicator(context); + } else + context.toast("Task already achieved."); + }, + child: Checkbox( + value: task.isDone, + ), + ), + Text(task.description), + ], + ), + IconButton( + icon: Icon( + Icons.delete, + color: Colors.grey[700], + ), + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Delete task"), + content: Text("Are you sure you want to delete the task?"), + actions: [ + FlatButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text("Cancel"), + ), + FlatButton( + child: Text("Delete"), + onPressed: () { + bloc.add(TaskDeleted(state.relation, task.id)); + Navigator.of(context).pop(); + showProgressIndicator(context); + }, + ), + ], + ), + ); + }, + ), + ], + ); + }, + ); + } + Widget _buildFab(BuildContext context, RelationPageSuccess state) { final _taskInputController = TextEditingController();