private async Task <TaskViewModel> CreateTaskViewModel(TaskViewModelArgs args)
        {
            var taskProperties = new TaskPropertiesViewModel
            {
                ProjectTask    = args.ProjectTask,
                TaskPriorities = new SelectList(await _tasksEndpoint.GetAllTaskPriorities(), "Id", "Name", 1),
                TaskStatuses   = new SelectList(await _tasksEndpoint.GetAllTaskStatuses(), "Id", "Name", 1),
                TaskTypes      = new SelectList(await _tasksEndpoint.GetAllTaskTypes(), "Id", "Name", 1)
            };

            var model = new TaskViewModel
            {
                BannerMessage     = args.BannerMessage,
                Comments          = await GetComments(args.Comments, args.ProjectTask.Id),
                CurrentTaskStatus = args.CurrentStatusId != 0 ? args.CurrentStatusId : args.ProjectTask.TaskStatusId,
                NewComment        = args.NewComment,
                ParentTask        = await _tasksEndpoint.GetTask(args.ProjectTask.ParentTaskId ?? 0),
                Project           = args.Project ?? await _projectsEndpoint.GetProject(args.ProjectTask.ProjectId),
                ProjectId         = args.ProjectTask.ProjectId,
                ProjectTask       = args.ProjectTask,
                SubTasks          = await _tasksEndpoint.GetSubTasks(args.ProjectTask.Id),
                TaskProperties    = taskProperties
            };

            return(model);
        }
        public async Task <IActionResult> Edit(
            [Bind(
                 "Id,Description,Name,Created,ProjectId,ParentTaskId,TaskRef,TaskStatusId,TaskTypeId,TaskPriorityId,FixedInRelease")]
            TaskModel projectTask,
            int currentTaskStatus, string newComment, [Bind("Id,Comment")] IList <TaskCommentModel> comments, string addSubTask)
        {
            var taskViewModelArgs = new TaskViewModelArgs
            {
                ProjectTask     = projectTask,
                CurrentStatusId = currentTaskStatus,
                Comments        = comments,
                NewComment      = newComment
            };

            if (ModelState.IsValid)
            {
                if (projectTask.IsClosed() && await HasIncompleteSubTasks(projectTask.Id))
                {
                    taskViewModelArgs.BannerMessage = "Update Failed: Cannot complete a task that still has open sub tasks.";
                }
                else
                {
                    projectTask.UserId = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
                    await _tasksEndpoint.UpdateTask(projectTask);

                    await _commentsEndpoint.UpdateComments(comments);

                    if (!string.IsNullOrWhiteSpace(newComment))
                    {
                        await _commentsEndpoint.AddComment(new TaskCommentModel
                                                           { TaskId = projectTask.Id, Comment = newComment, UserId = projectTask.UserId });
                    }

                    if (!string.IsNullOrWhiteSpace(addSubTask))
                    {
                        return(RedirectToAction("Create", new { id = addSubTask }));
                    }

                    if (projectTask.IsClosed() && projectTask.TaskStatusId != currentTaskStatus)
                    {
                        if (projectTask.HasParentTask())
                        {
                            // return to the parent task
                            return(RedirectToAction("Edit", new { id = projectTask.ParentTaskId }));
                        }
                        else
                        {
                            // return to the main index page
                            return(RedirectToAction("Index"));
                        }
                    }

                    return(RedirectToAction("Edit", projectTask.Id));
                }
            }

            var model = await CreateTaskViewModel(taskViewModelArgs);

            return(View(model));
        }