diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..9a2b6a4 --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,114 @@ +all_incomplete_todos(); + + $todos = $data['todos']; + $incomplete_count = $data['incomplete_count']; + // Convert all todo to Todo model + $todos->transform(function ($todo) { + return \App\Models\Todo::find($todo->id); + }); + + $projects = $this->projects(); + $project_count = $projects['project_count']; + $ave_todo_count = $projects['ave_todo_count']; + + $todo_completed_count = $this->all_completed_todos()['completed_count']; + + return view('dashboard', compact( + 'todos', + 'incomplete_count', + 'project_count', + 'ave_todo_count', + 'todo_completed_count' + )); + } + + public function all_incomplete_todos(): array + { + $user = auth()->user(); + // Join project_todo first and project_user tables, paginate the results + $todos = DB::table('todos') + ->join('project_todo', 'todos.id', '=', 'project_todo.todo_id') + ->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') + ->where('project_user.user_id', '=', $user->id) + ->whereDate('due_end', '<=', strtotime('today midnight')) + ->whereNull('completed_at') + ->orderBy('due_end', 'asc') + ->paginate(5); + + $all_incomplete_count = DB::table('todos') + ->join('project_todo', 'todos.id', '=', 'project_todo.todo_id') + ->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') + ->where('project_user.user_id', '=', $user->id) + ->whereDate('due_end', '<=', strtotime('today midnight')) + ->whereNull('completed_at') + ->count(); + + $all_incomplete_count = max($all_incomplete_count, 0); + + return [ + 'todos' => $todos, + 'incomplete_count' => $all_incomplete_count, + ]; + } + + public function projects(): array + { + $user = auth()->user(); + $projects = $user->projects; + $project_count = $projects->count(); + + // Average number of todos per project + $ave_todo_count = function ($projects) { + $todo_count = 0; + foreach ($projects as $project) { + $todo_count += $project->todos->count(); + } + return $todo_count / $projects->count(); + }; + + return [ + 'projects' => $projects, + 'project_count' => $project_count, + 'ave_todo_count' => $ave_todo_count($projects), + ]; + } + + public function all_completed_todos(): array + { + $user = auth()->user(); + // Join project_todo first and project_user tables, paginate the results + $todos = DB::table('todos') + ->join('project_todo', 'todos.id', '=', 'project_todo.todo_id') + ->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') + ->where('project_user.user_id', '=', $user->id) + ->whereDate('due_end', '<=', strtotime('today midnight')) + ->whereNotNull('completed_at') + ->paginate(5); + + $all_completed_count = DB::table('todos') + ->join('project_todo', 'todos.id', '=', 'project_todo.todo_id') + ->join('project_user', 'project_todo.project_id', '=', 'project_user.project_id') + ->where('project_user.user_id', '=', $user->id) + ->whereDate('due_end', '<=', strtotime('today midnight')) + ->whereNotNull('completed_at') + ->count(); + + $all_completed_count = max($all_completed_count, 0); + + return [ + 'todos' => $todos, + 'completed_count' => $all_completed_count, + ]; + } +} diff --git a/app/Http/Controllers/ProjectTodoController.php b/app/Http/Controllers/ProjectTodoController.php index 42f319d..0b70a07 100644 --- a/app/Http/Controllers/ProjectTodoController.php +++ b/app/Http/Controllers/ProjectTodoController.php @@ -28,8 +28,7 @@ class ProjectTodoController extends Controller if (!$project || $project->user->id !== auth()->user()->id) return back() - ->with('error', 'Project not found') - ->setStatusCode(404); + ->with('error', 'Project not found'); $todos = $project->todos; diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index adb0558..da76199 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -5,14 +5,185 @@ -
+ {{ $incomplete_count }} +
+ {{ $todo_completed_count }} +
++ {{ $ave_todo_count }} +
++ {{ $project_count }} +
+