mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-28 02:23:51 +00:00
filter tasks by type, allow to overload task edit page and section menu
This commit is contained in:
@@ -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'])
|
||||
;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user