<?php
namespace App\Controller;
use App\Entity\Tasks;
use App\Entity\Tag;
use App\Entity\User;
use App\Form\TaskSheetFilterType;
use App\Form\TaskType;
use App\Repository\TasksRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\JsonResponse;
/**
* @IsGranted("ROLE_USER")
*/
class TaskController extends AbstractController
{
/**
* @Route("/", name="home")
* @Route("/task-sheet", name="task_sheet")
* @Route("/task-sheet/{user}", name="task_sheet_user")
*/
public function index(Request $request, User $user = null): Response
{
$em = $this->getDoctrine()->getManager();
$statuses = TasksRepository::getStatuses();
$priorities = TasksRepository::getPriorities();
$qb = $em->getRepository(Tasks::class)->createQueryBuilder('t');
//Data Table cols
$columns = [
0 => 'id',
1 => 'project',
2 => 'name',
3 => 'assignee',
4 => 'status',
5 => 'priority',
6 => 'due',
7 => 'createdAt',
9 => ''
];
//Data table params
$dtAjax = false;
$page = 1;
$pageLength = 10;
$searchString = false;
$filterStatuses = array();
$orderCol = 'id';
$orderDir = 'desc';
if ($request->get('draw')) {
$dtAjax = true;
$page = $request->get('start');
$pageLength = $request->get('length');
$searchString = $request->get('search');
$filterStatuses = $request->get('statuses');
$orderCol = $request->get('order')[0]['column'];
$orderCol = $columns[$orderCol];
$orderDir = $request->get('order')[0]['dir'];
if ($request->get('userId')) {
$user = $em->getRepository(User::class)
->find($request->get('userId'));
}
}
if ($user) {
$qb->where('t.assignee = :assignee')
->setParameter('assignee', $user->getName());
}
// Build query
if (!empty($filterStatuses)) {
$qb->andWhere('t.status IN(:statuses)')
->setParameter('statuses', $filterStatuses);
}
$qb->orderBy('t.'.$orderCol, $orderDir);
$qb->setMaxResults($pageLength);
$qb->setFirstResult($page);
// $query = $qb->getQuery();
// dump($query->getSQL());
// exit;
// Init paginator
$paginator = new Paginator($qb);
$totalResults = count($paginator);
// Build Results
if ($dtAjax) {
$response = new Response();
$data = [];
foreach($paginator as $key => $pd) {
$data[$key][] = $pd->getId();
$data[$key][] = $pd->getProject();
$data[$key][] = $pd->getName();
$data[$key][] = $pd->getAssignee();
$data[$key][] = $pd->getStatus();
$data[$key][] = $priorities[$pd->getPriority()];
$data[$key][] = $pd->getDue() ? $pd->getDue()->format('Y-m-d') : '';
$data[$key][] = $pd->getCreatedAt()->format('Y-m-d');
$buttonHtml = '<div class="btn-group float-right">
<a href="/task/edit/'.$pd->getId().'" class="btn btn-primary">Edit</a>
<a href="/task/archive/'.$pd->getId().'" class="btn btn-secondary">Archive</a>
</div>';
$data[$key][] = $buttonHtml;
}
$response->setContent(json_encode(array(
'data' => $data,
'recordsTotal' => $totalResults,
'recordsFiltered' => $totalResults
)));
$response->headers->set('Content-Type', 'application/json');
$response->send();
exit;
}
$users = $em->getRepository(User::class)->findAll();
foreach ($users as $u) {
$options['users'][$u->getName()] = $u->getId();
}
$task = new Tasks();
$form = $this->createForm(TaskSheetFilterType::class, $task, $options);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$taskUser = $task->getUser();
$task->setAssignee($taskUser->getName());
$task->setStatus('Assigned');
$task->setCreatedAt(new \DateTime());
$em->persist($task);
$em->flush();
}
}
return $this->render('task/index.html.twig', [
'tasks' => $paginator,
'statuses' => $statuses,
'form' => $form->createView(),
'user' => $user
]);
}
/**
* @Route("/task/edit/{task}", name="task_edit")
*/
public function edit(Request $request, Tasks $task)
{
$em = $this->getDoctrine()->getManager();
$tagRepo = $em->getRepository(Tag::class);
$availableTags = $em->getRepository(Tag::class)->fetchPairs();
$selectedTags = $em->getRepository(Tag::class)->fetchPairs($task);
// dump($availableTags,$selectedTags); exit;
$form = $this->createForm(TaskType::class, $task);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
//Update legacy labels with true relations
$task->setProject($task->getProjectNew()->getProjectName());
$task->setAssignee($task->getUser()->getName());
$task->setUpdatedAt(new \DateTime());
$em->persist($task);
$em->flush();
$tagRepo->addTags($_POST['tagsNew'], $task);
$this->addFlash('success', 'Task Updated');
return $this->redirectToRoute('task_edit', ['task' => $task]);
}
}
return $this->render('task/edit.html.twig', [
'form' => $form->createView(),
'task' => $task,
'availableTags' => $availableTags,
'selectedTags' => $selectedTags
]);
}
/**
* @Route("/task/order", name="task_order")
*/
public function order(Request $request)
{
$em = $this->getDoctrine()->getManager();
$taskIds = $request->get('taskOrder');
$tasks = $this->getUser()->getTasks();
$i = 1;
foreach ($taskIds as $taskId) {
foreach ($tasks as $task) {
if ($task->getId() == $taskId) {
$task->setSortOrder($i);
$em->persist($task);
$i++;
}
}
}
$em->flush();
return $this->json(['success' => true]);
}
/**
* @Route("/task/new", name="task_new")
*/
public function new(Request $request)
{
$em = $this->getDoctrine()->getManager();
$tagRepo = $em->getRepository(Tag::class);
$availableTags = $em->getRepository(Tag::class)->fetchPairs();
$selectedTags = [];
$task = new Tasks();
$form = $this->createForm(TaskType::class, $task);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
//Update legacy labels with true relations
$task->setProject($task->getProjectNew()->getProjectName());
$task->setAssignee($task->getUser()->getName());
$task->setCreatedAt(new \DateTime());
$em->persist($task);
$em->flush();
$tagRepo->addTags($_POST['tagsNew'], $task);
$this->addFlash('success', 'Task Created');
return $this->redirectToRoute('task_edit', ['task' => $task]);
}
}
return $this->render('task/new.html.twig', [
'form' => $form->createView(),
'task' => $task,
'availableTags' => $availableTags,
'selectedTags' => $selectedTags
]);
}
}