package com.qprogramming.tasq.agile;
import com.qprogramming.tasq.account.Roles;
import com.qprogramming.tasq.projects.Project;
import com.qprogramming.tasq.projects.ProjectService;
import com.qprogramming.tasq.support.Utils;
import com.qprogramming.tasq.support.sorters.ProjectSorter;
import com.qprogramming.tasq.task.Task;
import com.qprogramming.tasq.task.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
@Controller
public class AgileController {
@Autowired
ProjectService projSrv;
@Autowired
TaskService taskSrv;
@RequestMapping(value = "boards", method = RequestMethod.GET)
public String listBoards(Model model) {
List<Project> projects;
if (Roles.isAdmin()) {
projects = projSrv.findAll();
} else {
projects = projSrv.findAllByUser();
}
Collections.sort(projects, new ProjectSorter(ProjectSorter.SORTBY.LAST_VISIT,
Utils.getCurrentAccount().getActiveProject(), true));
model.addAttribute("projects", projects);
return "agile/list";
}
@RequestMapping(value = "{id}/agile/board", method = RequestMethod.GET)
public String showBoard(@PathVariable String id, Model model,
HttpServletRequest request, RedirectAttributes ra) {
Project project = projSrv.findByProjectId(id);
if (project != null) {
return "redirect:/" + project.getProjectId() + "/" + project.getAgile().getCode() + "/board";
}
return "";
}
@RequestMapping(value = "/agile/order", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Boolean> saveOrder(@RequestParam(value = "ids[]") String[] ids,
@RequestParam(value = "project") Long project, HttpServletResponse response) {
int order = 0;
List<Task> allTasks = taskSrv.findAllByProjectId(project);
// build map of all tasks
Map<String, Task> map = new HashMap<>();
for (Task i : allTasks) {
map.put(i.getId(), i);
}
List<Task> taskList = new LinkedList<>();
List<Long> newTaskOrder = new LinkedList<>();
for (String taskID : Arrays.asList(ids)) {
Task task = map.get(taskID);
newTaskOrder.add(task.getTaskOrder());
taskList.add(task);
}
Collections.sort(newTaskOrder);
for (Task task : taskList) {
task.setTaskOrder(newTaskOrder.get(order));
order++;
}
taskSrv.save(taskList);
return ResponseEntity.ok(true);
}
@Transactional(readOnly = true)
@RequestMapping(value = "{id}/agile/cardsprint", method = RequestMethod.GET)
public String showBoard(@PathVariable String id, @RequestParam(name = "sprint", required = false) Long sprintID, Model model) {
Project project = projSrv.findByProjectId(id);
if (project != null) {
List<Task> taskList;
List<Task> result = new LinkedList<>();
if (sprintID != null) {
taskList = taskSrv.findAllBySprintId(project, sprintID);
} else {
taskList = taskSrv.findByProjectAndOpen(project);
}
for (Task task : taskList) {
if (task.getSubtasks() > 0) {
result.addAll(taskSrv.findSubtasks(task).stream().map(this::eliminateHTML).collect(Collectors.toList()));
} else {
result.add(eliminateHTML(task));
}
}
model.addAttribute("tasks", taskSrv.convertToDisplay(result, true));
model.addAttribute("project", project);
}
return "/agile/print";
}
private Task eliminateHTML(Task task) {
String description = task.getDescription().replaceAll("<img[^>]*>", "").replaceAll("<a[^>]*>", "").replaceAll("</a>", "");
task.setDescription(description);
return task;
}
}