diff --git a/.changes/unreleased/Fixed-20230821-115738.yaml b/.changes/unreleased/Fixed-20230821-115738.yaml new file mode 100644 index 000000000..366d46ed2 --- /dev/null +++ b/.changes/unreleased/Fixed-20230821-115738.yaml @@ -0,0 +1,6 @@ +kind: Fixed +body: Reimplement the mission type filter on tasks, only for instances that have a + config parameter indicating true for this. +time: 2023-08-21T11:57:38.273630026+02:00 +custom: + Issue: "" diff --git a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php index 4c6ab338f..78fcc2794 100644 --- a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php +++ b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php @@ -26,6 +26,7 @@ use Chill\TaskBundle\Event\TaskEvent; use Chill\TaskBundle\Event\UI\UIEvent; use Chill\TaskBundle\Form\SingleTaskType; use Chill\TaskBundle\Repository\SingleTaskAclAwareRepositoryInterface; +use Chill\TaskBundle\Repository\SingleTaskRepository; use Chill\TaskBundle\Repository\SingleTaskStateRepository; use Chill\TaskBundle\Security\Authorization\TaskVoter; use LogicException; @@ -48,42 +49,18 @@ use function array_merge; final class SingleTaskController extends AbstractController { - private CenterResolverDispatcherInterface $centerResolverDispatcher; - - private EventDispatcherInterface $eventDispatcher; - - private FilterOrderHelperFactoryInterface $filterOrderHelperFactory; - - private LoggerInterface $logger; - - private PaginatorFactory $paginatorFactory; - - private SingleTaskAclAwareRepositoryInterface $singleTaskAclAwareRepository; - - private TimelineBuilder $timelineBuilder; - - private TranslatorInterface $translator; - public function __construct( - CenterResolverDispatcherInterface $centerResolverDispatcher, - PaginatorFactory $paginatorFactory, - SingleTaskAclAwareRepositoryInterface $singleTaskAclAwareRepository, - TranslatorInterface $translator, - EventDispatcherInterface $eventDispatcher, - TimelineBuilder $timelineBuilder, - LoggerInterface $logger, - FilterOrderHelperFactoryInterface $filterOrderHelperFactory, - private SingleTaskStateRepository $singleTaskStateRepository - ) { - $this->eventDispatcher = $eventDispatcher; - $this->timelineBuilder = $timelineBuilder; - $this->logger = $logger; - $this->translator = $translator; - $this->centerResolverDispatcher = $centerResolverDispatcher; - $this->paginatorFactory = $paginatorFactory; - $this->singleTaskAclAwareRepository = $singleTaskAclAwareRepository; - $this->filterOrderHelperFactory = $filterOrderHelperFactory; - } + private CenterResolverDispatcherInterface $centerResolverDispatcher, + private PaginatorFactory $paginatorFactory, + private SingleTaskAclAwareRepositoryInterface $singleTaskAclAwareRepository, + private TranslatorInterface $translator, + private EventDispatcherInterface $eventDispatcher, + private TimelineBuilder $timelineBuilder, + private LoggerInterface $logger, + private FilterOrderHelperFactoryInterface $filterOrderHelperFactory, + private SingleTaskStateRepository $singleTaskStateRepository, + private SingleTaskRepository $singleTaskRepository + ) {} /** * @Route( @@ -300,7 +277,9 @@ final class SingleTaskController extends AbstractController ) { $this->denyAccessUnlessGranted(TaskVoter::SHOW, null); - $filterOrder = $this->buildFilterOrder(); + $showMissionTypeFilter = $this->singleTaskRepository->countByDistinctTypes() > 1; + + $filterOrder = $this->buildFilterOrder(true, $showMissionTypeFilter); $filteredUsers = $filterOrder->getUserPickerData('userPicker'); @@ -308,9 +287,15 @@ final class SingleTaskController extends AbstractController $filterOrder->getCheckboxData('status'), array_map(static fn ($i) => 'state_' . $i, $filterOrder->hasCheckboxData('states') ? $filterOrder->getCheckboxData('states') : []) ); + + if ($showMissionTypeFilter) { + $types = $filterOrder->getCheckboxData('missionTypePicker'); + } + $nb = $this->singleTaskAclAwareRepository->countByAllViewable( $filterOrder->getQueryString(), $flags, + $types ?? [], $filteredUsers ); $paginator = $this->paginatorFactory->create($nb); @@ -319,6 +304,7 @@ final class SingleTaskController extends AbstractController $tasks = $this->singleTaskAclAwareRepository->findByAllViewable( $filterOrder->getQueryString(), $flags, + $types ?? [], $filteredUsers, $paginator->getCurrentPageFirstItemNumber(), $paginator->getItemsPerPage(), @@ -669,7 +655,7 @@ final class SingleTaskController extends AbstractController return $form; } - private function buildFilterOrder($includeFilterByUser = true): FilterOrderHelper + private function buildFilterOrder($includeFilterByUser = true, $includeMissionType = false): FilterOrderHelper { $statuses = ['no-alert', 'warning', 'alert']; $statusTrans = [ @@ -677,6 +663,7 @@ final class SingleTaskController extends AbstractController 'Tasks near deadline', 'Tasks over deadline', ]; + $arrayOfTypes = []; $filterBuilder = $this->filterOrderHelperFactory ->create(self::class) @@ -696,6 +683,16 @@ final class SingleTaskController extends AbstractController ->addUserPicker('userPicker', 'Filter by user', ['multiple' => true, 'required' => false]); } + if ($includeMissionType) { + $filterBuilder->addCheckbox( + 'missionTypePicker', + array_map( + fn ($row) => $row['type'], + $this->singleTaskRepository->findAllTaskDistinctTypes() + ) + ); + } + return $filterBuilder->build(); } diff --git a/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepository.php b/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepository.php index 53ed4c38d..dcd026ffb 100644 --- a/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepository.php +++ b/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepository.php @@ -52,6 +52,7 @@ final class SingleTaskAclAwareRepository implements SingleTaskAclAwareRepository public function buildBaseQuery( ?string $pattern = null, ?array $flags = [], + ?array $types = [], ?array $users = [] ): QueryBuilder { $qb = $this->em->createQueryBuilder(); @@ -77,8 +78,12 @@ final class SingleTaskAclAwareRepository implements SingleTaskAclAwareRepository if ($orXUser->count() > 0) { $qb->andWhere($orXUser); } + } - return $qb; + if (null !== $types && count($types) > 0) { + $qb->andWhere($qb->expr()->in('t.type', ':types')); + + $qb->setParameter('types', $types); } if (null !== $flags && count($flags) > 0) { @@ -203,9 +208,10 @@ final class SingleTaskAclAwareRepository implements SingleTaskAclAwareRepository public function countByAllViewable( ?string $pattern = null, ?array $flags = [], + ?array $types = [], ?array $users = [] ): int { - $qb = $this->buildBaseQuery($pattern, $flags, $users); + $qb = $this->buildBaseQuery($pattern, $flags, $types, $users); return $this ->addACLGlobal($qb) @@ -251,12 +257,13 @@ final class SingleTaskAclAwareRepository implements SingleTaskAclAwareRepository public function findByAllViewable( ?string $pattern = null, ?array $flags = [], + ?array $types = [], ?array $users = [], ?int $start = 0, ?int $limit = 50, ?array $orderBy = [] ): array { - $qb = $this->buildBaseQuery($pattern, $flags, $users); + $qb = $this->buildBaseQuery($pattern, $flags, $types, $users); $qb = $this->addACLGlobal($qb); return $this->getResult($qb, $start, $limit, $orderBy); diff --git a/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepositoryInterface.php b/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepositoryInterface.php index 7d2870c67..bb63c0caa 100644 --- a/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepositoryInterface.php +++ b/src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepositoryInterface.php @@ -19,6 +19,7 @@ interface SingleTaskAclAwareRepositoryInterface public function countByAllViewable( ?string $pattern = null, ?array $flags = [], + ?array $types = [], ?array $users = [] ): int; @@ -39,6 +40,7 @@ interface SingleTaskAclAwareRepositoryInterface public function findByAllViewable( ?string $pattern = null, ?array $flags = [], + ?array $types = [], ?array $users = [], ?int $start = 0, ?int $limit = 50, diff --git a/src/Bundle/ChillTaskBundle/Repository/SingleTaskRepository.php b/src/Bundle/ChillTaskBundle/Repository/SingleTaskRepository.php index e3eb634cd..9b0f6c87d 100644 --- a/src/Bundle/ChillTaskBundle/Repository/SingleTaskRepository.php +++ b/src/Bundle/ChillTaskBundle/Repository/SingleTaskRepository.php @@ -306,4 +306,28 @@ class SingleTaskRepository extends EntityRepository ->add($qb->expr()->isNull('st.endDate')) ->add($qb->expr()->isNull('st.warningInterval')); } + + public function countByDistinctTypes() + { + $qb = $this->createQueryBuilder('st') + ->select('COUNT(DISTINCT st.type)'); + + $this->buildQuery($qb, []); + + return (int) $qb + ->getQuery() + ->getSingleScalarResult(); + } + + public function findAllTaskDistinctTypes() + { + $qb = $this->createQueryBuilder('st') + ->select('DISTINCT st.type'); + + $this->buildQuery($qb, []); + + return $qb + ->getQuery() + ->getResult(); + } }