From b856647b04950e526a4e8d58197700a24f3bc896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 7 May 2018 22:06:34 +0200 Subject: [PATCH] add logic to filter tasks --- Controller/SingleTaskController.php | 74 +++----------- DependencyInjection/ChillTaskExtension.php | 1 + Form/SingleTaskListType.php | 106 +++++++++++++++++++-- Repository/SingleTaskRepository.php | 1 - Resources/config/services/form.yml | 8 ++ Resources/views/SingleTask/_list.html.twig | 40 ++++---- Resources/views/SingleTask/index.html.twig | 4 +- 7 files changed, 144 insertions(+), 90 deletions(-) create mode 100644 Resources/config/services/form.yml diff --git a/Controller/SingleTaskController.php b/Controller/SingleTaskController.php index e192bb1e9..7b5dadcc4 100644 --- a/Controller/SingleTaskController.php +++ b/Controller/SingleTaskController.php @@ -25,6 +25,7 @@ use Chill\TaskBundle\Event\TaskEvent; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Translation\TranslatorInterface; + class SingleTaskController extends Controller { @@ -329,7 +330,8 @@ class SingleTaskController extends Controller Request $request, PaginatorFactory $paginatorFactory, SingleTaskRepository $taskRepository, - PersonRepository $personRepository + PersonRepository $personRepository, + FormFactoryInterface $formFactory ) { /* @var $viewParams array The parameters for the view */ /* @var $params array The parameters for the query */ @@ -340,10 +342,10 @@ class SingleTaskController extends Controller $params['user'] = null; $viewParams['center'] = null; $params['center'] = null; - + // Get parameters from url - if ($request->query->has('person_id')) { - $personId = $request->query->getInt('person_id', null); + if (!empty($request->query->get('person_id', NULL))) { + $personId = $request->query->getInt('person_id'); $person = $personRepository->find($personId); if ($person === null) { @@ -437,74 +439,22 @@ class SingleTaskController extends Controller // total number of tasks $viewParams['tasks_count'] = $tasks_count; - if ($request->query->has('person_id')){ + if ($viewParams['person'] !== null){ $viewParams['layout'] = 'ChillPersonBundle::layout.html.twig'; } else { $viewParams['layout'] = 'ChillMainBundle::layout.html.twig'; } // Form for filtering tasks - $form = $this->createForm(SingleTaskListType::class, null, [ - //'center' => $task->getCenter() + $form = $formFactory->createNamed(null, SingleTaskListType::class, null, [ + 'method' => Request::METHOD_GET, + 'csrf_protection' => false ]); - $form->add('submit', SubmitType::class); - $form->handleRequest($request); - if ($form->isSubmitted()) { - if ($form->isValid()) { - - $formData = $form->getData(); - - $status = $statuses[$formData['status']]; - $viewParamsForm['user'] = $formData['user']; - $viewParamsForm['isSingleStatus'] = $singleStatus = count($statuses) === 1; - - // herit some parameters from the page - $viewParamsForm['person'] = $viewParams['person']; - $viewParamsForm['layout'] = $viewParams['layout']; - - // different query if regarding to date or 'closed' - if (in_array($status, SingleTaskRepository::DATE_STATUSES)) { - $params['date_status'] = $status; - $params['is_closed'] = false; - } else { - $params['date_status'] = null; - $params['is_closed'] = true; - } - - $count = $taskRepository - ->countByParameters($params, $formData['user']) - ; - $paginator = $paginatorFactory->create($count); - - $viewParamsForm['single_task_'.$status.'_count'] = $count; - $viewParamsForm['single_task_'.$status.'_paginator'] = $paginator; - $viewParamsForm['single_task_'.$status.'_tasks'] = $taskRepository - ->findByParameters($params, $formData['user'], - $singleStatus ? $paginator->getCurrentPage()->getFirstItemNumber() : 0, - $singleStatus ? $paginator->getItemsPerPage() : 10) - ; - - // total number of tasks - $viewParamsForm['tasks_count'] = $count; - - return $this->render('ChillTaskBundle:SingleTask:index.html.twig', array( - 'view' => $viewParamsForm, - 'form' => $form->createView() - )); - - } else { - $this->addFlash('error', "wrong test"); - } - } - - dump($viewParams); - return $this->render('ChillTaskBundle:SingleTask:index.html.twig', array( - 'view' => $viewParams, - 'form' => $form->createView() - )); + return $this->render('ChillTaskBundle:SingleTask:index.html.twig', + \array_merge($viewParams, [ 'form' => $form->createView() ])); } diff --git a/DependencyInjection/ChillTaskExtension.php b/DependencyInjection/ChillTaskExtension.php index 0f7b28dc8..3eda043a5 100644 --- a/DependencyInjection/ChillTaskExtension.php +++ b/DependencyInjection/ChillTaskExtension.php @@ -35,6 +35,7 @@ class ChillTaskExtension extends Extension implements PrependExtensionInterface $loader->load('services/event.yml'); $loader->load('services/timeline.yml'); $loader->load('services/fixtures.yml'); + $loader->load('services/form.yml'); } public function prepend(ContainerBuilder $container) diff --git a/Form/SingleTaskListType.php b/Form/SingleTaskListType.php index b9e2ab9e2..7ee75117a 100644 --- a/Form/SingleTaskListType.php +++ b/Form/SingleTaskListType.php @@ -27,8 +27,14 @@ use Chill\MainBundle\Form\Type\ScopePickerType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Chill\TaskBundle\Repository\SingleTaskRepository; - use Symfony\Component\OptionsResolver\OptionsResolver; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; +use Chill\MainBundle\Security\Authorization\AuthorizationHelper; +use Chill\TaskBundle\Security\Authorization\TaskVoter; +use Symfony\Component\Security\Core\Role\Role; +use Chill\TaskBundle\Entity\SingleTask; +use Chill\PersonBundle\Form\Type\PickPersonType; /** * @@ -37,20 +43,106 @@ use Symfony\Component\OptionsResolver\OptionsResolver; */ class SingleTaskListType extends AbstractType { + /** + * + * @var EntityManagerInterface + */ + protected $em; + + /** + * + * @var SingleTaskRepository + */ + protected $singleTaskRepository; + + /** + * + * @var TokenStorageInterface + */ + protected $tokenStorage; + + /** + * + * @var AuthorizationHelper + */ + protected $authorizationHelper; + + public function __construct( + EntityManagerInterface $em, + TokenStorageInterface $tokenStorage, + AuthorizationHelper $authorizationHelper + ) { + $this->em = $em; + $this->tokenStorage = $tokenStorage; + $this->authorizationHelper = $authorizationHelper; + } + + public function buildForm(FormBuilderInterface $builder, array $options) { + $statuses = \array_merge(SingleTaskRepository::DATE_STATUSES, [ 'closed' ]); + $builder - ->add('user', EntityType::class, [ - 'class' => 'Chill\MainBundle\Entity\User' + ->add('user_id', EntityType::class, [ + 'class' => User::class, + 'choices' => $this->getUsersAssigneedToTask(), + 'placeholder' => 'Choose a user', + 'required' => false ]) ->add('status', ChoiceType::class, [ - 'choices' => array_flip(\array_merge(SingleTaskRepository::DATE_STATUSES, [ 'closed' ])), - 'expanded' => false, - 'multiple' => false + 'choices' => array_combine($statuses, $statuses), + 'expanded' => true, + 'multiple' => true ]) - + ->add('person_id', PickPersonType::class, [ + 'centers' => $this->authorizationHelper + ->getReachableCenters( + $this->tokenStorage->getToken()->getUser(), + new Role(TaskVoter::SHOW) + ), + 'required' => false + ]) ; } + + /** + * Return a list of user having a task assigned. + * + * @return User[] + */ + protected function getUsersAssigneedToTask() + { + $qb = $this->em->createQueryBuilder(); + $user = $this->tokenStorage->getToken()->getUser(); + $role = new Role(TaskVoter::SHOW); + $centers = $this->authorizationHelper->getReachableCenters($user, $role); + + $qb->select('DISTINCT user') + ->from(User::class, 'user') + ->join(SingleTask::class, 'task', \Doctrine\ORM\Query\Expr\Join::WITH, 'task.assignee = user') + ->join('task.person', 'person') + ->where("user.enabled = 'TRUE'") + ; + + $i = 0; + foreach ($centers as $center) { + $circles = $this->authorizationHelper->getReachableCircles($user, $role, $center); + // add condition about person and circle + $qb->andWhere( + $qb->expr()->andX() + ->add($qb->expr()->eq('person.center', ':center_'.$i)) + ->add($qb->expr()->in('task.circle', ':circles_'.$i)) + ); + + $qb->setParameter('center_'.$i, $center) + ->setParameter('circles_'.$i, $circles) + ; + // increase counter + $i++; + } + + return $qb->getQuery()->getResult(); + } public function configureOptions(OptionsResolver $resolver) { diff --git a/Repository/SingleTaskRepository.php b/Repository/SingleTaskRepository.php index 4c802d3d5..c5980d5b0 100644 --- a/Repository/SingleTaskRepository.php +++ b/Repository/SingleTaskRepository.php @@ -118,7 +118,6 @@ class SingleTaskRepository extends \Doctrine\ORM\EntityRepository $qb->setParameter('scope', $params['scope']); } - if (\array_key_exists('date_status', $params) and !empty($params['date_status'])) { $this->addTypeFilter($qb, $params); } diff --git a/Resources/config/services/form.yml b/Resources/config/services/form.yml new file mode 100644 index 000000000..a284ad541 --- /dev/null +++ b/Resources/config/services/form.yml @@ -0,0 +1,8 @@ +services: + Chill\TaskBundle\Form\SingleTaskListType: + arguments: + $em: '@Doctrine\ORM\EntityManagerInterface' + $authorizationHelper: '@Chill\MainBundle\Security\Authorization\AuthorizationHelper' + $tokenStorage: '@Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface' + tags: + - { name: form.type } diff --git a/Resources/views/SingleTask/_list.html.twig b/Resources/views/SingleTask/_list.html.twig index a0aa610ba..2d1f86b5c 100644 --- a/Resources/views/SingleTask/_list.html.twig +++ b/Resources/views/SingleTask/_list.html.twig @@ -143,55 +143,59 @@

Filter the tasks

{{ form_start(form) }} - {{ form_row(form.user) }} + {{ form_row(form.user_id) }} {{ form_row(form.status) }} + {{ form_row(form.person_id) }} + {{ form_end(form)}} + + - {% if view.tasks_count == 0 %} + {% if tasks_count == 0 %}

{{ "There is no tasks."|trans }}

- {% if view.person is not null %} - + {% if person is not null %} + {{ 'Add a new task' | trans }} {% endif %} - {% else %} - {% if view.single_task_ended_tasks is defined %} - {{ helper.date_status('Tasks with expired deadline', view.single_task_ended_tasks, view.single_task_ended_count, view.single_task_ended_paginator, 'ended', view.isSingleStatus, view.person) }} + {% if single_task_ended_tasks is defined %} + {{ helper.date_status('Tasks with expired deadline', single_task_ended_tasks, single_task_ended_count, single_task_ended_paginator, 'ended', isSingleStatus, person) }} {% endif %} - {% if view.single_task_warning_tasks is defined %} - {{ helper.date_status('Tasks with warning deadline reached', view.single_task_warning_tasks, view.single_task_warning_count, view.single_task_warning_paginator, 'warning', view.isSingleStatus, view.person) }} + {% if single_task_warning_tasks is defined %} + {{ helper.date_status('Tasks with warning deadline reached', single_task_warning_tasks, single_task_warning_count, single_task_warning_paginator, 'warning', isSingleStatus, person) }} {% endif %} - {% if view.single_task_current_tasks is defined %} - {{ helper.date_status('Current tasks', view.single_task_current_tasks, view.single_task_current_count, view.single_task_current_paginator, 'current', view.isSingleStatus, view.person) }} + {% if single_task_current_tasks is defined %} + {{ helper.date_status('Current tasks', single_task_current_tasks, single_task_current_count, single_task_current_paginator, 'current', isSingleStatus, person) }} {% endif %} - {% if view.single_task_not_started_tasks is defined %} - {{ helper.date_status('Tasks not started', view.single_task_not_started_tasks, view.single_task_not_started_count, view.single_task_not_started_paginator, 'not_started', view.isSingleStatus, view.person) }} + {% if single_task_not_started_tasks is defined %} + {{ helper.date_status('Tasks not started', single_task_not_started_tasks, single_task_not_started_count, single_task_not_started_paginator, 'not_started', isSingleStatus, person) }} {% endif %} - {% if view.single_task_closed_tasks is defined %} - {{ helper.date_status('Closed', view.single_task_closed_tasks, view.single_task_closed_count, view.single_task_closed_paginator, 'closed', view.isSingleStatus, view.person) }} + {% if single_task_closed_tasks is defined %} + {{ helper.date_status('Closed', single_task_closed_tasks, single_task_closed_count, single_task_closed_paginator, 'closed', isSingleStatus, person) }} {% endif %} - {% if view.isSingleStatus == false %} + {% if isSingleStatus == false %}