diff --git a/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php b/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php
index 1f373400c..d16ce3813 100644
--- a/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php
+++ b/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php
@@ -47,16 +47,7 @@ final class FilterOrderType extends \Symfony\Component\Form\AbstractType
$checkboxesBuilder = $builder->create('checkboxes', null, ['compound' => true]);
foreach ($helper->getCheckboxes() as $name => $c) {
- $choices = array_combine(
- array_map(static function ($c, $t) {
- if (null !== $t) {
- return $t;
- }
-
- return $c;
- }, $c['choices'], $c['trans']),
- $c['choices']
- );
+ $choices = self::buildCheckboxChoices($c['choices'], $c['trans']);
$checkboxesBuilder->add($name, ChoiceType::class, [
'choices' => $choices,
@@ -125,6 +116,20 @@ final class FilterOrderType extends \Symfony\Component\Form\AbstractType
}
}
+ public static function buildCheckboxChoices(array $choices, array $trans = []): array
+ {
+ return array_combine(
+ array_map(static function ($c, $t) {
+ if (null !== $t) {
+ return $t;
+ }
+
+ return $c;
+ }, $choices, $trans),
+ $choices
+ );
+ }
+
public function buildView(FormView $view, FormInterface $form, array $options)
{
/** @var FilterOrderHelper $helper */
diff --git a/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig b/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig
index f642c82aa..4de7604cf 100644
--- a/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig
+++ b/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig
@@ -85,7 +85,7 @@
{% endfor %}
{% endif %}
-
+
{% if btnSubmit == 1 %}
@@ -93,6 +93,17 @@
{% endif %}
+ {% set active = helper.getActiveFilters() %}
+ {% if active|length > 0 %}
+
+ {% for f in active %}
+ {% if f.label != '' %}{{ f.label|trans }} : {% endif %}{{ f.value }}
+ {% endfor %}
+
+ {% endif %}
+
+
+
{% for k,v in otherParameters %}
diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php
index c0ef1cd89..a038dfd71 100644
--- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php
+++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php
@@ -13,16 +13,19 @@ namespace Chill\MainBundle\Templating\Listing;
use Chill\MainBundle\Form\Type\Listing\FilterOrderType;
use DateTimeImmutable;
-use Symfony\Component\Form\Extension\Core\Type\FormType;
-use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\PropertyAccess\PropertyAccessor;
+use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
+use Symfony\Component\PropertyAccess\PropertyPath;
+use Symfony\Component\PropertyAccess\PropertyPathInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
use function array_merge;
use function count;
-class FilterOrderHelper
+final class FilterOrderHelper
{
private array $checkboxes = [];
@@ -33,16 +36,12 @@ class FilterOrderHelper
private array $dateRanges = [];
- private FormFactoryInterface $formFactory;
-
public const FORM_NAME = 'f';
private array $formOptions = [];
private string $formType = FilterOrderType::class;
- private RequestStack $requestStack;
-
private ?array $searchBoxFields = null;
private ?array $submitted = null;
@@ -52,12 +51,13 @@ class FilterOrderHelper
*/
private array $entityChoices = [];
+
public function __construct(
- FormFactoryInterface $formFactory,
- RequestStack $requestStack
+ private readonly FormFactoryInterface $formFactory,
+ private readonly RequestStack $requestStack,
+ private readonly TranslatorInterface $translator,
+ private readonly PropertyAccessorInterface $propertyAccessor,
) {
- $this->formFactory = $formFactory;
- $this->requestStack = $requestStack;
}
public function addSingleCheckbox(string $name, string $label): self
@@ -199,6 +199,63 @@ class FilterOrderHelper
return $this;
}
+ /**
+ * Return all the data required to display the active filters
+ *
+ * @return array
+ */
+ public function getActiveFilters(): array
+ {
+ $result = [];
+
+ if ($this->hasSearchBox() && '' !== $this->getQueryString()) {
+ $result[] = ['label' => '', 'value' => $this->getQueryString(), 'position' => FilterOrderPositionEnum::SearchBox->value, 'name' => 'q'];
+ }
+
+ foreach ($this->dateRanges as $name => ['label' => $label]) {
+ $base = ['position' => FilterOrderPositionEnum::DateRange->value, 'name' => $name, 'label' => (string) $label];
+
+ if (null !== ($from = $this->getDateRangeData($name)['from'] ?? null)) {
+ $result[] = ['value' => $this->translator->trans('filter_order.by_date.From', ['from_date' => $from]), ...$base];
+ }
+ if (null !== ($to = $this->getDateRangeData($name)['to'] ?? null)) {
+ $result[] = ['value' => $this->translator->trans('filter_order.by_date.To', ['to_date' => $to]), ...$base];
+ }
+ }
+
+ foreach ($this->checkboxes as $name => ['choices' => $choices, 'trans' => $trans, 'options' => $options]) {
+ foreach ($this->getCheckboxData($name) as $keyChoice) {
+ $result[] = ['value' => $choices['keyChoice'], 'label' => $options['label'], 'position' => FilterOrderPositionEnum::Checkboxes->value, 'name' => $name];
+ }
+ }
+
+ foreach ($this->entityChoices as $name => ['label' => $label, 'class' => $class, 'choices' => $choices, 'options' => $options]) {
+ foreach ($this->getEntityChoiceData($name) as $selected) {
+ if (is_callable($options['choice_label'])) {
+ $value = call_user_func($options['choice_label'], $selected);
+ } elseif ($options['choice_label'] instanceof PropertyPathInterface || is_string($options['choice_label'])) {
+ $value = $this->propertyAccessor->getValue($selected, $options['choice_label']);
+ } else {
+ if (!$selected instanceof \Stringable) {
+ throw new \UnexpectedValueException(sprintf("we are not able to transform the value of %s to a string. Implements \Stringable or add a 'choice_label' option to the filterFormBuilder", get_class($selected)));
+ }
+
+ $value = (string) $selected;
+ }
+
+ $result[] = ['value' => $value, 'label' => $label, 'position' => FilterOrderPositionEnum::EntityChoice->value, 'name' => $name];
+ }
+ }
+
+ foreach ($this->singleCheckbox as $name => ['label' => $label]) {
+ if (true === $this->getSingleCheckboxData($name)) {
+ $result[] = ['label' => '', 'value' => $this->translator->trans($label), 'position' => FilterOrderPositionEnum::SingleCheckbox->value, 'name' => $name];
+ }
+ }
+
+ return $result;
+ }
+
private function getDefaultData(): array
{
$r = [
diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php
index e176e27c6..dfa361f6e 100644
--- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php
+++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php
@@ -14,6 +14,8 @@ namespace Chill\MainBundle\Templating\Listing;
use DateTimeImmutable;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
class FilterOrderHelperBuilder
{
@@ -39,7 +41,9 @@ class FilterOrderHelperBuilder
public function __construct(
FormFactoryInterface $formFactory,
- RequestStack $requestStack
+ RequestStack $requestStack,
+ private readonly TranslatorInterface $translator,
+ private readonly PropertyAccessorInterface $propertyAccessor,
) {
$this->formFactory = $formFactory;
$this->requestStack = $requestStack;
@@ -87,7 +91,9 @@ class FilterOrderHelperBuilder
{
$helper = new FilterOrderHelper(
$this->formFactory,
- $this->requestStack
+ $this->requestStack,
+ $this->translator,
+ $this->propertyAccessor
);
$helper->setSearchBox($this->searchBoxFields);
diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperFactory.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperFactory.php
index c88c71af5..3fbb2864d 100644
--- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperFactory.php
+++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperFactory.php
@@ -13,6 +13,8 @@ namespace Chill\MainBundle\Templating\Listing;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
+use Symfony\Contracts\Translation\TranslatorInterface;
class FilterOrderHelperFactory implements FilterOrderHelperFactoryInterface
{
@@ -22,7 +24,9 @@ class FilterOrderHelperFactory implements FilterOrderHelperFactoryInterface
public function __construct(
FormFactoryInterface $formFactory,
- RequestStack $requestStack
+ RequestStack $requestStack,
+ private readonly TranslatorInterface $translator,
+ private readonly PropertyAccessorInterface $propertyAccessor,
) {
$this->formFactory = $formFactory;
$this->requestStack = $requestStack;
@@ -30,6 +34,6 @@ class FilterOrderHelperFactory implements FilterOrderHelperFactoryInterface
public function create(string $context, ?array $options = []): FilterOrderHelperBuilder
{
- return new FilterOrderHelperBuilder($this->formFactory, $this->requestStack);
+ return new FilterOrderHelperBuilder($this->formFactory, $this->requestStack, $this->translator, $this->propertyAccessor);
}
}
diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php
new file mode 100644
index 000000000..cda8119f5
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php
@@ -0,0 +1,12 @@
+