diff --git a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php index 22e49704f..3523c7a58 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\SingleTaskStateRepository; use Chill\TaskBundle\Security\Authorization\TaskVoter; use LogicException; use Psr\Log\LoggerInterface; @@ -71,7 +72,8 @@ final class SingleTaskController extends AbstractController EventDispatcherInterface $eventDispatcher, TimelineBuilder $timelineBuilder, LoggerInterface $logger, - FilterOrderHelperFactoryInterface $filterOrderHelperFactory + FilterOrderHelperFactoryInterface $filterOrderHelperFactory, + private SingleTaskStateRepository $singleTaskStateRepository ) { $this->eventDispatcher = $eventDispatcher; $this->timelineBuilder = $timelineBuilder; @@ -452,7 +454,7 @@ final class SingleTaskController extends AbstractController { $this->denyAccessUnlessGranted('ROLE_USER'); - $filterOrder = $this->buildFilterOrder(); + $filterOrder = $this->buildFilterOrder(false); $flags = array_merge( $filterOrder->getCheckboxData('status'), array_map(static fn ($i) => 'state_' . $i, $filterOrder->getCheckboxData('states')) @@ -667,7 +669,7 @@ final class SingleTaskController extends AbstractController return $form; } - private function buildFilterOrder(): FilterOrderHelper + private function buildFilterOrder($includeFilterByUser = true): FilterOrderHelper { $statuses = ['no-alert', 'warning', 'alert']; $statusTrans = [ @@ -675,18 +677,22 @@ final class SingleTaskController extends AbstractController 'Tasks near deadline', 'Tasks over deadline', ]; - $states = [ - // todo: get a list of possible states dynamically - 'new', 'in_progress', 'closed', 'canceled', - ]; + $states = $this->singleTaskStateRepository->findAllExistingStates(); + $checked = array_values(array_filter($states, fn (string $state) => !in_array($state, ['closed', 'canceled', 'validated'], true))); - return $this->filterOrderHelperFactory + $filterBuilder = $this->filterOrderHelperFactory ->create(self::class) ->addSearchBox() ->addCheckbox('status', $statuses, $statuses, $statusTrans) - ->addCheckbox('states', $states, ['new', 'in_progress']) - ->addUserPicker('userPicker', 'Filter by user', ['multiple' => true, 'required' => false]) - ->build(); + ->addCheckbox('states', $states, $checked) + ; + + if ($includeFilterByUser) { + $filterBuilder + ->addUserPicker('userPicker', 'Filter by user', ['multiple' => true, 'required' => false]); + } + + return $filterBuilder->build(); } /** diff --git a/src/Bundle/ChillTaskBundle/Repository/SingleTaskStateRepository.php b/src/Bundle/ChillTaskBundle/Repository/SingleTaskStateRepository.php new file mode 100644 index 000000000..2d64c69a0 --- /dev/null +++ b/src/Bundle/ChillTaskBundle/Repository/SingleTaskStateRepository.php @@ -0,0 +1,47 @@ + + * @throws Exception + */ + public function findAllExistingStates(): array + { + $states = []; + + foreach ($this->connection->fetchAllNumeric(self::FIND_ALL_STATES) as $row) { + if ('' !== $row[0] && null !== $row[0]) { + $states[] = $row[0]; + } + } + + return $states; + } + +} diff --git a/src/Bundle/ChillTaskBundle/config/services/repositories.yaml b/src/Bundle/ChillTaskBundle/config/services/repositories.yaml index 7bee5abd0..9681e5d5c 100644 --- a/src/Bundle/ChillTaskBundle/config/services/repositories.yaml +++ b/src/Bundle/ChillTaskBundle/config/services/repositories.yaml @@ -1,4 +1,8 @@ services: + _defaults: + autowire: true + autoconfigure: true + chill_task.single_task_repository: class: Chill\TaskBundle\Repository\SingleTaskRepository factory: ['@doctrine.orm.entity_manager', getRepository] @@ -10,8 +14,8 @@ services: - "@chill.main.security.authorization.helper" Chill\TaskBundle\Repository\SingleTaskRepository: '@chill_task.single_task_repository' - Chill\TaskBundle\Repository\SingleTaskAclAwareRepository: - autowire: true - autoconfigure: true + Chill\TaskBundle\Repository\SingleTaskAclAwareRepository: ~ Chill\TaskBundle\Repository\SingleTaskAclAwareRepositoryInterface: '@Chill\TaskBundle\Repository\SingleTaskAclAwareRepository' + + Chill\TaskBundle\Repository\SingleTaskStateRepository: ~