filter tasks by type, allow to overload task edit page and section menu

This commit is contained in:
2018-08-27 10:49:32 +02:00
parent b3b1e0aff5
commit a69b2d7e40
11 changed files with 208 additions and 13 deletions

View File

@@ -34,6 +34,7 @@ use Chill\PersonBundle\Form\Type\PickPersonType;
use Chill\PersonBundle\Entity\Person;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Chill\PersonBundle\Form\DataTransformer\PersonToIdTransformer;
use Chill\TaskBundle\Workflow\TaskWorkflowManager;
/**
*
@@ -60,14 +61,22 @@ class SingleTaskListType extends AbstractType
*/
protected $authorizationHelper;
/**
*
* @var TaskWorkflowManager
*/
protected $taskWorkflowManager;
public function __construct(
EntityManagerInterface $em,
TokenStorageInterface $tokenStorage,
AuthorizationHelper $authorizationHelper
AuthorizationHelper $authorizationHelper,
TaskWorkflowManager $taskWorkflowManager
) {
$this->em = $em;
$this->tokenStorage = $tokenStorage;
$this->authorizationHelper = $authorizationHelper;
$this->taskWorkflowManager = $taskWorkflowManager;
}
@@ -90,7 +99,7 @@ class SingleTaskListType extends AbstractType
])
;
if ($options['add_status'] === true) {
if ($options['add_status']) {
$builder
->add('status', ChoiceType::class, [
'choices' => $statuses,
@@ -100,6 +109,21 @@ class SingleTaskListType extends AbstractType
]);
}
if ($options['add_type']) {
$types = $this->getTaskTypesChoices($options);
if (count($types) > 0) {
$builder->add('types', ChoiceType::class, [
'choices' => $types,
'required' => false,
'expanded' => true,
'multiple' => true,
'label' => 'Task types'
]);
}
}
if ($options['person'] === null) {
$builder
->add('person_id', PickPersonType::class, [
@@ -136,6 +160,56 @@ class SingleTaskListType extends AbstractType
return $choices;
}
protected function getTaskTypesChoices($options)
{
$qb = $this->em->createQueryBuilder();
$user = $this->tokenStorage->getToken()->getUser();
$role = new Role(TaskVoter::SHOW);
$centers = $this->authorizationHelper->getReachableCenters($user, $role);
$qb->select('DISTINCT task.type AS type')
->from(SingleTask::class, 'task')
->join('task.person', 'person')
;
$i = 0;
$orCenters = $qb->expr()->orX();
foreach($centers as $center) {
$circles = $this->authorizationHelper->getReachableCircles($user, $role, $center);
if (count($circles) > 0) {
$andX = $qb->expr()->andX();
$andX
->add($qb->expr()->eq('person.center', ':center_'.$i))
->add($qb->expr()->in('task.circle', ':circles_'.$i))
;
$orCenters->add($andX);
$qb
->setParameter('center_'.$i, $center)
->setParameter('circles_'.$i, $circles)
;
$i++;
}
}
if ($i > 0) {
$qb->where($orCenters);
}
$types = $qb->getQuery()->getResult();
$choices = [];
foreach ($types as $row) {
$fake = (new SingleTask())->setType($row['type']);
$label = $this->taskWorkflowManager->getWorkflowMetadata($fake, 'definition.name');
$choices[$label] = $row['type'];
}
return $choices;
}
/**
* Return a list of user having a task assigned.
*
@@ -191,6 +265,9 @@ class SingleTaskListType extends AbstractType
->setDefined('add_status')
->setDefault('add_status', false)
->setAllowedTypes('add_status', ['bool'])
->setDefined('add_type')
->setDefault('add_type', false)
->setAllowedTypes('add_type', ['bool'])
;
}
}