FEATURE [task filter][person] filter tasks on the basis of a person

This commit is contained in:
Julie Lenaerts 2023-06-07 19:38:24 +02:00
parent 37e92ca58d
commit ed96017c49
7 changed files with 102 additions and 0 deletions

View File

@ -13,6 +13,8 @@ namespace Chill\MainBundle\Form\Type\Listing;
use Chill\MainBundle\Form\Type\ChillDateType; use Chill\MainBundle\Form\Type\ChillDateType;
use Chill\MainBundle\Templating\Listing\FilterOrderHelper; 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\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SearchType; use Symfony\Component\Form\Extension\Core\Type\SearchType;
@ -97,6 +99,30 @@ final class FilterOrderType extends \Symfony\Component\Form\AbstractType
$builder->add($dateRangesBuilder); $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) { foreach ($this->requestStack->getCurrentRequest()->query->getIterator() as $key => $value) {
switch ($key) { switch ($key) {
case 'q': case 'q':

View File

@ -34,6 +34,35 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if form.personPicker is defined %}
{% if form.personPicker|length > 0 %}
{% for personPickerName, options in form.personPicker %}
<div class="row gx-0">
{% if form.personPicker[personPickerName].vars.label is not same as(false) %}
<div class="col-md-2">
{{ form_label(form.personPicker[personPickerName])}}
</div>
{% endif %}
<div class="col-md-9">
{{ form_widget(form.personPicker[personPickerName]) }}
</div>
</div>
{% if form.checkboxes is not defined %}
<div class="row gx-0">
<div class="col-md-12">
<ul class="record_actions">
<li>
<button type="submit" class="btn btn-misc"><i class="fa fa-filter"></i></button>
</li>
</ul>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if form.checkboxes is defined %} {% if form.checkboxes is defined %}
{% if form.checkboxes|length > 0 %} {% if form.checkboxes|length > 0 %}
{% for checkbox_name, options in form.checkboxes %} {% for checkbox_name, options in form.checkboxes %}
@ -61,5 +90,6 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endif %} {% endif %}
</div> </div>
{{ form_end(form) }} {{ form_end(form) }}

View File

@ -26,6 +26,8 @@ class FilterOrderHelper
private array $dateRanges = []; private array $dateRanges = [];
private array $personPickers = [];
private FormFactoryInterface $formFactory; private FormFactoryInterface $formFactory;
private ?string $formName = 'f'; private ?string $formName = 'f';
@ -70,6 +72,13 @@ class FilterOrderHelper
return $this; return $this;
} }
public function addPersonPickers(string $name, ?string $label = null): self
{
$this->personPickers[$name] = ['label' => $label];
return $this;
}
public function buildForm(): FormInterface public function buildForm(): FormInterface
{ {
return $this->formFactory return $this->formFactory
@ -91,6 +100,16 @@ class FilterOrderHelper
return $this->checkboxes; 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> * @return array<'to': DateTimeImmutable, 'from': DateTimeImmutable>
*/ */
@ -133,6 +152,10 @@ class FilterOrderHelper
$r['checkboxes'][$name] = $c['default']; $r['checkboxes'][$name] = $c['default'];
} }
foreach ($this->personPickers as $name => $defaults) {
$r['personPickers'][$name]['label'] = $defaults['label'];
}
foreach ($this->dateRanges as $name => $defaults) { foreach ($this->dateRanges as $name => $defaults) {
$r['dateRanges'][$name]['from'] = $defaults['from']; $r['dateRanges'][$name]['from'] = $defaults['from'];
$r['dateRanges'][$name]['to'] = $defaults['to']; $r['dateRanges'][$name]['to'] = $defaults['to'];

View File

@ -21,6 +21,8 @@ class FilterOrderHelperBuilder
private array $dateRanges = []; private array $dateRanges = [];
private array $personPickers = [];
private FormFactoryInterface $formFactory; private FormFactoryInterface $formFactory;
private RequestStack $requestStack; private RequestStack $requestStack;
@ -56,6 +58,13 @@ class FilterOrderHelperBuilder
return $this; return $this;
} }
public function addPersonPicker(string $name, ?string $label = null): self
{
$this->personPickers[$name] = ['label' => $label];
return $this;
}
public function build(): FilterOrderHelper public function build(): FilterOrderHelper
{ {
$helper = new FilterOrderHelper( $helper = new FilterOrderHelper(
@ -85,6 +94,14 @@ class FilterOrderHelperBuilder
$helper->addDateRange($name, $label, $from, $to); $helper->addDateRange($name, $label, $from, $to);
} }
foreach (
$this->personPickers as $name => [
'label' => $label,
]
) {
$helper->addPersonPickers($name, $label);
}
return $helper; return $helper;
} }
} }

View File

@ -303,6 +303,7 @@ final class SingleTaskController extends AbstractController
$filterOrder->getCheckboxData('status'), $filterOrder->getCheckboxData('status'),
array_map(static fn ($i) => 'state_' . $i, $filterOrder->getCheckboxData('states')) array_map(static fn ($i) => 'state_' . $i, $filterOrder->getCheckboxData('states'))
); );
$nb = $this->singleTaskAclAwareRepository->countByAllViewable( $nb = $this->singleTaskAclAwareRepository->countByAllViewable(
$filterOrder->getQueryString(), $filterOrder->getQueryString(),
$flags $flags
@ -678,6 +679,7 @@ final class SingleTaskController extends AbstractController
return $this->filterOrderHelperFactory return $this->filterOrderHelperFactory
->create(self::class) ->create(self::class)
->addSearchBox() ->addSearchBox()
->addPersonPicker('personPicker')
->addCheckbox('status', $statuses, $statuses, $statusTrans) ->addCheckbox('status', $statuses, $statuses, $statusTrans)
->addCheckbox('states', $states, ['new', 'in_progress']) ->addCheckbox('states', $states, ['new', 'in_progress'])
->build(); ->build();

View File

@ -27,8 +27,10 @@
{% block css %} {% block css %}
{{ parent() }} {{ parent() }}
{{ encore_entry_link_tags('page_task_list') }} {{ encore_entry_link_tags('page_task_list') }}
{{ encore_entry_link_tags('mod_pickentity_type') }}
{% endblock %} {% endblock %}
{% block js %} {% block js %}
{{ parent() }} {{ parent() }}
{{ encore_entry_script_tags('page_task_list') }} {{ encore_entry_script_tags('page_task_list') }}
{{ encore_entry_script_tags('mod_pickentity_type') }}
{% endblock %} {% endblock %}

View File

@ -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_COURSE: Créer une tâche pour un parcours
CHILL_TASK_TASK_CREATE_FOR_PERSON: Créer une tâche pour un usager CHILL_TASK_TASK_CREATE_FOR_PERSON: Créer une tâche pour un usager
filter:
Filter on user: Filtrer par utilisateur/ utilisatrice