Skip to content

Commit

Permalink
Task Completed Page
Browse files Browse the repository at this point in the history
  • Loading branch information
burhanrashid52 committed Oct 21, 2018
1 parent 45d796a commit 775eab4
Show file tree
Hide file tree
Showing 9 changed files with 196 additions and 187 deletions.
39 changes: 28 additions & 11 deletions lib/bloc/task_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import 'dart:async';
import 'dart:collection';

import 'package:flutter_app/bloc/bloc_provider.dart';
import 'package:flutter_app/db/app_db.dart';
import 'package:flutter_app/db/task_db.dart';
import 'package:flutter_app/models/tasks.dart';

class TasksBloc implements BlocBase {
class TaskBloc implements BlocBase {
///
/// Synchronous Stream to handle the provision of the movie genres
///
Expand All @@ -19,19 +19,19 @@ class TasksBloc implements BlocBase {

//StreamSink get getMovieGenres => _cmdController.sink;

AppDatabase _appDatabase;
TaskDB _taskDb;
List<Tasks> _tasksList;
Filter _lastFilterStatus;

TasksBloc(this._appDatabase) {
TaskBloc(this._taskDb) {
filterTodayTasks();
_cmdController.stream.listen((_) {
_updateTaskStream(_tasksList);
});
}

void _filterTask(int taskStartTime, int taskEndTime, TaskStatus status) {
_appDatabase
_taskDb
.getTasks(
startDate: taskStartTime, endDate: taskEndTime, taskStatus: status)
.then((tasks) {
Expand Down Expand Up @@ -77,7 +77,7 @@ class TasksBloc implements BlocBase {
}

void filterByProject(int projectId) {
_appDatabase
_taskDb
.getTasksByProject(projectId, status: TaskStatus.COMPLETE)
.then((tasks) {
if (tasks == null) return;
Expand All @@ -87,21 +87,29 @@ class TasksBloc implements BlocBase {
}

void filterByLabel(String labelName) {
_appDatabase.getTasksByLabel(labelName).then((tasks) {
_taskDb.getTasksByLabel(labelName).then((tasks) {
if (tasks == null) return;
_lastFilterStatus = Filter.byLabel(labelName);
_updateTaskStream(tasks);
});
}

void updateStatus(int taskID, TaskStatus complete) {
_appDatabase.updateTaskStatus(taskID, TaskStatus.COMPLETE).then((value) {
void filterByStatus(TaskStatus status) {
_taskDb.getTasks(taskStatus: status).then((tasks) {
if (tasks == null) return;
_lastFilterStatus = Filter.byStatus(status);
_updateTaskStream(tasks);
});
}

void updateStatus(int taskID, TaskStatus status) {
_taskDb.updateTaskStatus(taskID, status).then((value) {
refresh();
});
}

void delete(int taskID) {
_appDatabase.deleteTask(taskID).then((value) {
_taskDb.deleteTask(taskID).then((value) {
refresh();
});
}
Expand All @@ -124,17 +132,22 @@ class TasksBloc implements BlocBase {
case FILTER_STATUS.BY_PROJECT:
filterByProject(_lastFilterStatus.projectId);
break;

case FILTER_STATUS.BY_STATUS:
filterByStatus(_lastFilterStatus.status);
break;
}
}
}
}

enum FILTER_STATUS { BY_TODAY, BY_WEEK, BY_PROJECT, BY_LABEL }
enum FILTER_STATUS { BY_TODAY, BY_WEEK, BY_PROJECT, BY_LABEL, BY_STATUS }

class Filter {
String labelName;
int projectId;
FILTER_STATUS filterStatus;
TaskStatus status;

Filter.byToday() {
filterStatus = FILTER_STATUS.BY_TODAY;
Expand All @@ -151,4 +164,8 @@ class Filter {
Filter.byLabel(this.labelName) {
filterStatus = FILTER_STATUS.BY_LABEL;
}

Filter.byStatus(this.status) {
filterStatus = FILTER_STATUS.BY_STATUS;
}
}
93 changes: 0 additions & 93 deletions lib/db/app_db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,83 +95,6 @@ class AppDatabase {
"FOREIGN KEY(${Tasks.dbProjectID}) REFERENCES ${Project.tblProject}(${Project.dbId}) ON DELETE CASCADE);");
}

Future<List<Tasks>> getTasks(
{int startDate = 0, int endDate = 0, TaskStatus taskStatus}) async {
var db = await getDb();
var whereClause = startDate > 0 && endDate > 0
? "WHERE ${Tasks.tblTask}.${Tasks.dbDueDate} BETWEEN $startDate AND $endDate"
: "";

if (taskStatus != null) {
var taskWhereClause =
"${Tasks.tblTask}.${Tasks.dbStatus} = ${taskStatus.index}";
whereClause = whereClause.isEmpty
? "WHERE $taskWhereClause"
: "$whereClause AND $taskWhereClause";
}

var result = await db.rawQuery(
'SELECT ${Tasks.tblTask}.*,${Project.tblProject}.${Project.dbName},${Project.tblProject}.${Project.dbColorCode},group_concat(${Label.tblLabel}.${Label.dbName}) as labelNames '
'FROM ${Tasks.tblTask} LEFT JOIN ${TaskLabels.tblTaskLabel} ON ${TaskLabels.tblTaskLabel}.${TaskLabels.dbTaskId}=${Tasks.tblTask}.${Tasks.dbId} '
'LEFT JOIN ${Label.tblLabel} ON ${Label.tblLabel}.${Label.dbId}=${TaskLabels.tblTaskLabel}.${TaskLabels.dbLabelId} '
'INNER JOIN ${Project.tblProject} ON ${Tasks.tblTask}.${Tasks.dbProjectID} = ${Project.tblProject}.${Project.dbId} $whereClause GROUP BY ${Tasks.tblTask}.${Tasks.dbId} ORDER BY ${Tasks.tblTask}.${Tasks.dbDueDate} ASC;');

return bindData(result);
}

Future<List<Tasks>> getTasksByProject(int projectId,
{TaskStatus status}) async {
var db = await getDb();
String whereStatus = status != null
? "AND ${Tasks.tblTask}.${Tasks.dbStatus}=${TaskStatus.PENDING.index}"
: "";
var result = await db.rawQuery(
'SELECT ${Tasks.tblTask}.*,${Project.tblProject}.${Project.dbName},${Project.tblProject}.${Project.dbColorCode},group_concat(${Label.tblLabel}.${Label.dbName}) as labelNames '
'FROM ${Tasks.tblTask} LEFT JOIN ${TaskLabels.tblTaskLabel} ON ${TaskLabels.tblTaskLabel}.${TaskLabels.dbTaskId}=${Tasks.tblTask}.${Tasks.dbId} '
'LEFT JOIN ${Label.tblLabel} ON ${Label.tblLabel}.${Label.dbId}=${TaskLabels.tblTaskLabel}.${TaskLabels.dbLabelId} '
'INNER JOIN ${Project.tblProject} ON ${Tasks.tblTask}.${Tasks.dbProjectID} = ${Project.tblProject}.${Project.dbId} WHERE ${Tasks.tblTask}.${Tasks.dbProjectID}=$projectId $whereStatus GROUP BY ${Tasks.tblTask}.${Tasks.dbId} ORDER BY ${Tasks.tblTask}.${Tasks.dbDueDate} ASC;');

return bindData(result);
}

Future<List<Tasks>> getTasksByLabel(String labelName) async {
var db = await getDb();
var result = await db.rawQuery(
'SELECT ${Tasks.tblTask}.*,${Project.tblProject}.${Project.dbName},${Project.tblProject}.${Project.dbColorCode},group_concat(${Label.tblLabel}.${Label.dbName}) as labelNames FROM ${Tasks.tblTask} LEFT JOIN ${TaskLabels.tblTaskLabel} ON ${TaskLabels.tblTaskLabel}.${TaskLabels.dbTaskId}=${Tasks.tblTask}.${Tasks.dbId} '
'LEFT JOIN ${Label.tblLabel} ON ${Label.tblLabel}.${Label.dbId}=${TaskLabels.tblTaskLabel}.${TaskLabels.dbLabelId} '
'INNER JOIN ${Project.tblProject} ON ${Tasks.tblTask}.${Tasks.dbProjectID} = ${Project.tblProject}.${Project.dbId} WHERE ${Tasks.tblTask}.${Tasks.dbProjectID}=${Project.tblProject}.${Project.dbId} GROUP BY ${Tasks.tblTask}.${Tasks.dbId} having labelNames LIKE "%$labelName%" ORDER BY ${Tasks.tblTask}.${Tasks.dbDueDate} ASC;');

return bindData(result);
}

List<Tasks> bindData(List<Map<String, dynamic>> result) {
List<Tasks> tasks = new List();
for (Map<String, dynamic> item in result) {
var myTask = new Tasks.fromMap(item);
myTask.projectName = item[Project.dbName];
myTask.projectColor = item[Project.dbColorCode];
var labelComma = item["labelNames"];
if (labelComma != null) {
myTask.labelList = labelComma.toString().split(",");
}
tasks.add(myTask);
}
return tasks;
}

/*Future<List<Project>> getProjects({bool isInboxVisible = true}) async {
var db = await getDb();
var whereClause = isInboxVisible ? ";" : " WHERE ${Project.dbId}!=1;";
var result =
await db.rawQuery('SELECT * FROM ${Project.tblProject} $whereClause');
List<Project> projects = new List();
for (Map<String, dynamic> item in result) {
var myProject = new Project.fromMap(item);
projects.add(myProject);
}
return projects;
}*/

Future<List<Label>> getLabels() async {
var db = await getDb();
var result = await db.rawQuery('SELECT * FROM ${Label.tblLabel}');
Expand Down Expand Up @@ -217,22 +140,6 @@ class AppDatabase {
});
}

Future deleteTask(int taskID) async {
var db = await getDb();
await db.transaction((Transaction txn) async {
await txn.rawDelete(
'DELETE FROM ${Tasks.tblTask} WHERE ${Tasks.dbId}=$taskID;');
});
}

Future updateTaskStatus(int taskID, TaskStatus status) async {
var db = await getDb();
await db.transaction((Transaction txn) async {
await txn.rawQuery(
"UPDATE ${Tasks.tblTask} SET ${Tasks.dbStatus} = '${status.index}' WHERE ${Tasks.dbId} = '$taskID'");
});
}

Future<bool> isLabelExits(Label label) async {
var db = await getDb();
var result = await db.rawQuery(
Expand Down
15 changes: 9 additions & 6 deletions lib/db/project_db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,22 @@ import 'package:flutter_app/models/project.dart';
import 'package:sqflite/sqflite.dart';

class ProjectDB {
static final ProjectDB _projectDb =
new ProjectDB._internal(AppDatabase.get());
static final ProjectDB _projectDb = ProjectDB._internal(AppDatabase.get());

AppDatabase _appDatabase;

//private internal constructor to make it singleton
ProjectDB._internal(this._appDatabase);

static ProjectDB get projectDb => _projectDb;
static ProjectDB get() {
return _projectDb;
}

Future<List<Project>> getProjects({bool isInboxVisible = true}) async {
var db = await _appDatabase.getDb();
var whereClause = isInboxVisible ? ";" : " WHERE ${Project.dbId}!=1;";
var result =
await db.rawQuery('SELECT * FROM ${Project.tblProject} $whereClause');
await db.rawQuery('SELECT * FROM ${Project.tblProject} $whereClause');
List<Project> projects = new List();
for (Map<String, dynamic> item in result) {
var myProject = new Project.fromMap(item);
Expand All @@ -30,8 +31,10 @@ class ProjectDB {
var db = await _appDatabase.getDb();
await db.transaction((Transaction txn) async {
await txn.rawInsert('INSERT OR REPLACE INTO '
'${Project.tblProject}(${Project.dbId},${Project.dbName},${Project.dbColorCode},${Project.dbColorName})'
' VALUES(${project.id},"${project.name}", ${project.colorValue}, "${project.colorName}")');
'${Project.tblProject}(${Project.dbId},${Project.dbName},${Project
.dbColorCode},${Project.dbColorName})'
' VALUES(${project.id},"${project.name}", ${project
.colorValue}, "${project.colorName}")');
});
}
}
101 changes: 101 additions & 0 deletions lib/db/task_db.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import 'package:flutter_app/db/app_db.dart';
import 'package:flutter_app/models/tasks.dart';
import 'package:flutter_app/models/project.dart';
import 'package:flutter_app/models/label.dart';
import 'package:flutter_app/models/task_labels.dart';
import 'package:sqflite/sqflite.dart';

class TaskDB {
static final TaskDB _taskDb = new TaskDB._internal(AppDatabase.get());

AppDatabase _appDatabase;

//private internal constructor to make it singleton
TaskDB._internal(this._appDatabase);

//static TaskDB get taskDb => _taskDb;

static TaskDB get() {
return _taskDb;
}

Future<List<Tasks>> getTasks(
{int startDate = 0, int endDate = 0, TaskStatus taskStatus}) async {
var db = await _appDatabase.getDb();
var whereClause = startDate > 0 && endDate > 0
? "WHERE ${Tasks.tblTask}.${Tasks.dbDueDate} BETWEEN $startDate AND $endDate"
: "";

if (taskStatus != null) {
var taskWhereClause =
"${Tasks.tblTask}.${Tasks.dbStatus} = ${taskStatus.index}";
whereClause = whereClause.isEmpty
? "WHERE $taskWhereClause"
: "$whereClause AND $taskWhereClause";
}

var result = await db.rawQuery(
'SELECT ${Tasks.tblTask}.*,${Project.tblProject}.${Project.dbName},${Project.tblProject}.${Project.dbColorCode},group_concat(${Label.tblLabel}.${Label.dbName}) as labelNames '
'FROM ${Tasks.tblTask} LEFT JOIN ${TaskLabels.tblTaskLabel} ON ${TaskLabels.tblTaskLabel}.${TaskLabels.dbTaskId}=${Tasks.tblTask}.${Tasks.dbId} '
'LEFT JOIN ${Label.tblLabel} ON ${Label.tblLabel}.${Label.dbId}=${TaskLabels.tblTaskLabel}.${TaskLabels.dbLabelId} '
'INNER JOIN ${Project.tblProject} ON ${Tasks.tblTask}.${Tasks.dbProjectID} = ${Project.tblProject}.${Project.dbId} $whereClause GROUP BY ${Tasks.tblTask}.${Tasks.dbId} ORDER BY ${Tasks.tblTask}.${Tasks.dbDueDate} ASC;');

return _bindData(result);
}

List<Tasks> _bindData(List<Map<String, dynamic>> result) {
List<Tasks> tasks = new List();
for (Map<String, dynamic> item in result) {
var myTask = new Tasks.fromMap(item);
myTask.projectName = item[Project.dbName];
myTask.projectColor = item[Project.dbColorCode];
var labelComma = item["labelNames"];
if (labelComma != null) {
myTask.labelList = labelComma.toString().split(",");
}
tasks.add(myTask);
}
return tasks;
}

Future<List<Tasks>> getTasksByProject(int projectId,
{TaskStatus status}) async {
var db = await _appDatabase.getDb();
String whereStatus = status != null
? "AND ${Tasks.tblTask}.${Tasks.dbStatus}=${TaskStatus.PENDING.index}"
: "";
var result = await db.rawQuery(
'SELECT ${Tasks.tblTask}.*,${Project.tblProject}.${Project.dbName},${Project.tblProject}.${Project.dbColorCode},group_concat(${Label.tblLabel}.${Label.dbName}) as labelNames '
'FROM ${Tasks.tblTask} LEFT JOIN ${TaskLabels.tblTaskLabel} ON ${TaskLabels.tblTaskLabel}.${TaskLabels.dbTaskId}=${Tasks.tblTask}.${Tasks.dbId} '
'LEFT JOIN ${Label.tblLabel} ON ${Label.tblLabel}.${Label.dbId}=${TaskLabels.tblTaskLabel}.${TaskLabels.dbLabelId} '
'INNER JOIN ${Project.tblProject} ON ${Tasks.tblTask}.${Tasks.dbProjectID} = ${Project.tblProject}.${Project.dbId} WHERE ${Tasks.tblTask}.${Tasks.dbProjectID}=$projectId $whereStatus GROUP BY ${Tasks.tblTask}.${Tasks.dbId} ORDER BY ${Tasks.tblTask}.${Tasks.dbDueDate} ASC;');

return _bindData(result);
}

Future<List<Tasks>> getTasksByLabel(String labelName) async {
var db = await _appDatabase.getDb();
var result = await db.rawQuery(
'SELECT ${Tasks.tblTask}.*,${Project.tblProject}.${Project.dbName},${Project.tblProject}.${Project.dbColorCode},group_concat(${Label.tblLabel}.${Label.dbName}) as labelNames FROM ${Tasks.tblTask} LEFT JOIN ${TaskLabels.tblTaskLabel} ON ${TaskLabels.tblTaskLabel}.${TaskLabels.dbTaskId}=${Tasks.tblTask}.${Tasks.dbId} '
'LEFT JOIN ${Label.tblLabel} ON ${Label.tblLabel}.${Label.dbId}=${TaskLabels.tblTaskLabel}.${TaskLabels.dbLabelId} '
'INNER JOIN ${Project.tblProject} ON ${Tasks.tblTask}.${Tasks.dbProjectID} = ${Project.tblProject}.${Project.dbId} WHERE ${Tasks.tblTask}.${Tasks.dbProjectID}=${Project.tblProject}.${Project.dbId} GROUP BY ${Tasks.tblTask}.${Tasks.dbId} having labelNames LIKE "%$labelName%" ORDER BY ${Tasks.tblTask}.${Tasks.dbDueDate} ASC;');

return _bindData(result);
}

Future deleteTask(int taskID) async {
var db = await _appDatabase.getDb();
await db.transaction((Transaction txn) async {
await txn.rawDelete(
'DELETE FROM ${Tasks.tblTask} WHERE ${Tasks.dbId}=$taskID;');
});
}

Future updateTaskStatus(int taskID, TaskStatus status) async {
var db = await _appDatabase.getDb();
await db.transaction((Transaction txn) async {
await txn.rawQuery(
"UPDATE ${Tasks.tblTask} SET ${Tasks.dbStatus} = '${status.index}' WHERE ${Tasks.dbId} = '$taskID'");
});
}
}
10 changes: 5 additions & 5 deletions lib/pages/home/home.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter_app/bloc/task_bloc.dart';
import 'package:flutter_app/bloc/bloc_provider.dart';
import 'package:flutter_app/db/app_db.dart';
import 'package:flutter_app/bloc/task_bloc.dart';
import 'package:flutter_app/db/task_db.dart';
import 'package:flutter_app/pages/home/side_drawer.dart';
import 'package:flutter_app/pages/tasks/task_widgets.dart';
import 'package:flutter_app/pages/home/title_bloc.dart';
import 'package:flutter_app/pages/tasks/add_task.dart';
import 'package:flutter_app/pages/tasks/task_complted.dart';
import 'package:flutter_app/pages/tasks/task_widgets.dart';

class HomeScreen extends StatelessWidget {
final TitleBloc _titleBloc = TitleBloc();
final TasksBloc _taskBloc = TasksBloc(AppDatabase.get());
final TaskBloc _taskBloc = TaskBloc(TaskDB.get());

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -81,7 +81,7 @@ class HomeScreen extends StatelessWidget {
await Navigator.push(
context,
new MaterialPageRoute<bool>(
builder: (context) => new TaskCompletedScreen()),
builder: (context) => TaskCompletedPage()),
);
_taskBloc.refresh();
break;
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/home/side_drawer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class _SideDrawerState extends State<SideDrawer> {
title: new Text("Next 7 Days"),
),
BlocProvider(
bloc: ProjectBloc(ProjectDB.projectDb),
bloc: ProjectBloc(ProjectDB.get()),
child: ProjectPage(widget.projectSelection),
),
buildExpansionTile(Icons.label, "Labels")
Expand Down
Loading

0 comments on commit 775eab4

Please sign in to comment.