From ed96017c497b03f26f3c8c32ae1e3ef379aeb73c Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Wed, 7 Jun 2023 19:38:24 +0200 Subject: [PATCH] FEATURE [task filter][person] filter tasks on the basis of a person --- .../Form/Type/Listing/FilterOrderType.php | 26 ++++++++++++++++ .../views/FilterOrder/base.html.twig | 30 +++++++++++++++++++ .../Templating/Listing/FilterOrderHelper.php | 23 ++++++++++++++ .../Listing/FilterOrderHelperBuilder.php | 17 +++++++++++ .../Controller/SingleTaskController.php | 2 ++ .../views/SingleTask/List/index.html.twig | 2 ++ .../translations/messages.fr.yml | 2 ++ 7 files changed, 102 insertions(+) diff --git a/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php b/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php index aaa6afa24..1d01a827c 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php @@ -13,6 +13,8 @@ namespace Chill\MainBundle\Form\Type\Listing; use Chill\MainBundle\Form\Type\ChillDateType; use Chill\MainBundle\Templating\Listing\FilterOrderHelper; +use Chill\PersonBundle\Form\Type\PickPersonDynamicType; +use Chill\PersonBundle\Form\Type\PickPersonType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\SearchType; @@ -97,6 +99,30 @@ final class FilterOrderType extends \Symfony\Component\Form\AbstractType $builder->add($dateRangesBuilder); } + if (0 < count($helper->getPersonPickers())) { + $personPickersBuilder = $builder->create('personPicker', null, ['compound' => true]); + + foreach ($helper->getPersonPickers() as $name => $opts) { + $personPicker = $personPickersBuilder->create($name, null, [ + 'compound' => true, + 'label' => null === $opts['label'] ? false : $opts['label'] ?? $name, + ]); + + $personPicker->add( + 'person', + PickPersonDynamicType::class, + [ + 'multiple' => false, + ] + ); + + + $personPickersBuilder->add($personPicker); + } + + $builder->add($personPickersBuilder); + } + foreach ($this->requestStack->getCurrentRequest()->query->getIterator() as $key => $value) { switch ($key) { case 'q': diff --git a/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig b/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig index 1f1e54c72..115d90d27 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig @@ -34,6 +34,35 @@ {% endfor %} {% endif %} {% endif %} + + {% if form.personPicker is defined %} + {% if form.personPicker|length > 0 %} + {% for personPickerName, options in form.personPicker %} +
+ {% if form.personPicker[personPickerName].vars.label is not same as(false) %} +
+ {{ form_label(form.personPicker[personPickerName])}} +
+ {% endif %} +
+ {{ form_widget(form.personPicker[personPickerName]) }} +
+
+ {% if form.checkboxes is not defined %} +
+
+
    +
  • + +
  • +
+
+
+ {% endif %} + {% endfor %} + {% endif %} + {% endif %} + {% if form.checkboxes is defined %} {% if form.checkboxes|length > 0 %} {% for checkbox_name, options in form.checkboxes %} @@ -61,5 +90,6 @@ {% endfor %} {% endif %} {% endif %} + {{ form_end(form) }} diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php index 367cc0861..6dd5f37cd 100644 --- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php +++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php @@ -26,6 +26,8 @@ class FilterOrderHelper private array $dateRanges = []; + private array $personPickers = []; + private FormFactoryInterface $formFactory; private ?string $formName = 'f'; @@ -70,6 +72,13 @@ class FilterOrderHelper return $this; } + public function addPersonPickers(string $name, ?string $label = null): self + { + $this->personPickers[$name] = ['label' => $label]; + + return $this; + } + public function buildForm(): FormInterface { return $this->formFactory @@ -91,6 +100,16 @@ class FilterOrderHelper return $this->checkboxes; } + public function getPersonPickers(): array + { + return $this->personPickers; + } + + public function getPersonPickerData(string $name): array + { + return $this->getFormData()['personPickers'][$name]; + } + /** * @return array<'to': DateTimeImmutable, 'from': DateTimeImmutable> */ @@ -133,6 +152,10 @@ class FilterOrderHelper $r['checkboxes'][$name] = $c['default']; } + foreach ($this->personPickers as $name => $defaults) { + $r['personPickers'][$name]['label'] = $defaults['label']; + } + foreach ($this->dateRanges as $name => $defaults) { $r['dateRanges'][$name]['from'] = $defaults['from']; $r['dateRanges'][$name]['to'] = $defaults['to']; diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php index d68c8c37a..18d04715e 100644 --- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php +++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php @@ -21,6 +21,8 @@ class FilterOrderHelperBuilder private array $dateRanges = []; + private array $personPickers = []; + private FormFactoryInterface $formFactory; private RequestStack $requestStack; @@ -56,6 +58,13 @@ class FilterOrderHelperBuilder return $this; } + public function addPersonPicker(string $name, ?string $label = null): self + { + $this->personPickers[$name] = ['label' => $label]; + + return $this; + } + public function build(): FilterOrderHelper { $helper = new FilterOrderHelper( @@ -85,6 +94,14 @@ class FilterOrderHelperBuilder $helper->addDateRange($name, $label, $from, $to); } + foreach ( + $this->personPickers as $name => [ + 'label' => $label, + ] + ) { + $helper->addPersonPickers($name, $label); + } + return $helper; } } diff --git a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php index 2ba9488b6..4e68c338b 100644 --- a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php +++ b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php @@ -303,6 +303,7 @@ final class SingleTaskController extends AbstractController $filterOrder->getCheckboxData('status'), array_map(static fn ($i) => 'state_' . $i, $filterOrder->getCheckboxData('states')) ); + $nb = $this->singleTaskAclAwareRepository->countByAllViewable( $filterOrder->getQueryString(), $flags @@ -678,6 +679,7 @@ final class SingleTaskController extends AbstractController return $this->filterOrderHelperFactory ->create(self::class) ->addSearchBox() + ->addPersonPicker('personPicker') ->addCheckbox('status', $statuses, $statuses, $statusTrans) ->addCheckbox('states', $states, ['new', 'in_progress']) ->build(); diff --git a/src/Bundle/ChillTaskBundle/Resources/views/SingleTask/List/index.html.twig b/src/Bundle/ChillTaskBundle/Resources/views/SingleTask/List/index.html.twig index 8fe45959e..b479eb948 100644 --- a/src/Bundle/ChillTaskBundle/Resources/views/SingleTask/List/index.html.twig +++ b/src/Bundle/ChillTaskBundle/Resources/views/SingleTask/List/index.html.twig @@ -27,8 +27,10 @@ {% block css %} {{ parent() }} {{ encore_entry_link_tags('page_task_list') }} + {{ encore_entry_link_tags('mod_pickentity_type') }} {% endblock %} {% block js %} {{ parent() }} {{ encore_entry_script_tags('page_task_list') }} + {{ encore_entry_script_tags('mod_pickentity_type') }} {% endblock %} diff --git a/src/Bundle/ChillTaskBundle/translations/messages.fr.yml b/src/Bundle/ChillTaskBundle/translations/messages.fr.yml index d437baac2..a3f5bc0df 100644 --- a/src/Bundle/ChillTaskBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillTaskBundle/translations/messages.fr.yml @@ -119,3 +119,5 @@ CHILL_TASK_TASK_UPDATE: Modifier une tâche CHILL_TASK_TASK_CREATE_FOR_COURSE: Créer une tâche pour un parcours CHILL_TASK_TASK_CREATE_FOR_PERSON: Créer une tâche pour un usager +filter: + Filter on user: Filtrer par utilisateur/ utilisatrice