From dd3a08f766fa18e6872ddf9559822e0cb0d50dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 16 Feb 2026 15:13:20 +0100 Subject: [PATCH] Add support for integer fields in `FilterOrderHelper` and `FilterOrderHelperBuilder` - Introduced methods to define, retrieve, and process integer fields in `FilterOrderHelper` and `FilterOrderHelperBuilder`. - Updated `FilterOrderType` to render integer fields dynamically as form inputs. - Added corresponding support in `FilterOrderGetActiveFilterHelper` to handle integer field data. - Updated `FilterOrderPositionEnum` and template files to include integer field rendering logic. - Enhanced entity labels with translation capabilities where applicable. --- .../Form/Type/Listing/FilterOrderType.php | 18 ++++++++++ .../views/FilterOrder/base.html.twig | 17 +++++++++ .../FilterOrderGetActiveFilterHelper.php | 8 +++++ .../Templating/Listing/FilterOrderHelper.php | 36 +++++++++++++++++-- .../Listing/FilterOrderHelperBuilder.php | 22 ++++++++++-- .../Listing/FilterOrderPositionEnum.php | 2 ++ 6 files changed, 98 insertions(+), 5 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php b/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php index 139328b7c..3af4474ff 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/Listing/FilterOrderType.php @@ -17,6 +17,7 @@ use Chill\MainBundle\Templating\Listing\FilterOrderHelper; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\SearchType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; @@ -129,6 +130,23 @@ final class FilterOrderType extends \Symfony\Component\Form\AbstractType $builder->add($userPickersBuilder); } + + if ([] !== $helper->getIntegerFields()) { + $integerFieldBuilder = $builder->create('integer_fields', null, ['compound' => true]); + foreach ($helper->getIntegerFields() as $name => ['label' => $label, 'options' => $opts]) { + $integerFieldBuilder->add( + $name, + IntegerType::class, + [ + 'label' => $label, + 'required' => false, + ...$opts, + ] + ); + } + + $builder->add($integerFieldBuilder); + } } public static function buildCheckboxChoices(array $choices, array $trans = []): array diff --git a/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig b/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig index 555cb7da1..4083c1756 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/FilterOrder/base.html.twig @@ -115,6 +115,23 @@ {% endfor %} {% endif %} + {% if form.integer_fields is defined %} + {% set btnSubmit = 1 %} + {% for name, _o in form.integer_fields %} +
+ {% if form.integer_fields[name].vars.label is not same as(false) %} + {{ form_label(form.integer_fields[name]) }} + {% else %} + {{ form_label(form.integer_fields[name].vars.label) }} + {% endif %} +
+ {{ form_widget(form.integer_fields[name]) }} +
+
+ {% endfor %} + + {% endif %} + {% if btnSubmit == 1 %}
diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderGetActiveFilterHelper.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderGetActiveFilterHelper.php index 4ca9eda41..1612dd3b1 100644 --- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderGetActiveFilterHelper.php +++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderGetActiveFilterHelper.php @@ -14,6 +14,7 @@ namespace Chill\MainBundle\Templating\Listing; use Chill\MainBundle\Templating\Entity\UserRender; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; use Symfony\Component\PropertyAccess\PropertyPathInterface; +use Symfony\Contracts\Translation\TranslatableInterface; use Symfony\Contracts\Translation\TranslatorInterface; final readonly class FilterOrderGetActiveFilterHelper @@ -85,6 +86,13 @@ final readonly class FilterOrderGetActiveFilterHelper } } + foreach ($filterOrderHelper->getIntegerFields() as $name => ['label' => $label]) { + if (null !== $integerData = $filterOrderHelper->getIntegerField($name)) { + $translated = $label instanceof TranslatableInterface ? $label->trans($this->translator) : $this->translator->trans($label); + $result[] = ['label' => $translated, 'position' => FilterOrderPositionEnum::IntegerField->value, 'name' => $name, 'value' => $integerData]; + } + } + return $result; } } diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php index 993fd871d..9dc594209 100644 --- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php +++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelper.php @@ -40,15 +40,20 @@ final class FilterOrderHelper private ?array $submitted = null; /** - * @var array + * @var array */ private array $entityChoices = []; /** - * @var array + * @var array */ private array $userPickers = []; + /** + * @var array + */ + private array $integerFields = []; + public function __construct( private readonly FormFactoryInterface $formFactory, private readonly RequestStack $requestStack, @@ -122,6 +127,11 @@ final class FilterOrderHelper return $this->userPickers; } + public function getIntegerField(string $name): ?int + { + return $this->getFormData()['integer_fields'][$name]; + } + /** * @return list */ @@ -213,6 +223,23 @@ final class FilterOrderHelper return $this; } + public function addIntegerField(string $name, string|TranslatableInterface|null $label, array $options): self + { + $this->integerFields[$name] = ['label' => $label, 'options' => $options]; + + return $this; + } + + public function getIntegerFields(): array + { + return $this->integerFields; + } + + public function getIntegerFieldData(string $name): ?int + { + return $this->getFormData()['integer_fields'][$name]; + } + private function getDefaultData(): array { $r = [ @@ -221,6 +248,7 @@ final class FilterOrderHelper 'single_checkboxes' => [], 'entity_choices' => [], 'user_pickers' => [], + 'integer_fields' => [], ]; if ($this->hasSearchBox()) { @@ -248,6 +276,10 @@ final class FilterOrderHelper $r['user_pickers'][$name] = ($u['options']['multiple'] ?? true) ? [] : null; } + foreach ($this->integerFields as $name => $c) { + $r['integer_fields'][$name] = null; + } + return $r; } diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php index 010b17217..0fcb6b681 100644 --- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php +++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderHelperBuilder.php @@ -24,20 +24,25 @@ class FilterOrderHelperBuilder private ?array $searchBoxFields = null; /** - * @var array + * @var array */ private array $singleCheckboxes = []; /** - * @var array + * @var array */ private array $entityChoices = []; /** - * @var array + * @var array */ private array $userPickers = []; + /** + * @var array + */ + private array $integerField = []; + public function __construct(private readonly FormFactoryInterface $formFactory, private readonly RequestStack $requestStack) {} public function addSingleCheckbox(string $name, string|TranslatableInterface $label): self @@ -71,6 +76,13 @@ class FilterOrderHelperBuilder return $this; } + public function addIntegerField(string $name, string|TranslatableInterface|null $label = null, array $options = []): self + { + $this->integerField[$name] = ['label' => $label, 'options' => $options]; + + return $this; + } + public function addSearchBox(?array $fields = [], ?array $options = []): self { $this->searchBoxFields = $fields; @@ -135,6 +147,10 @@ class FilterOrderHelperBuilder $helper->addUserPicker($name, $label, $options); } + foreach ($this->integerField as $name => $label) { + $helper->addIntegerField($name, $label['label'], $label['options']); + } + return $helper; } } diff --git a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php index ed2337f1d..0c6ae9778 100644 --- a/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php +++ b/src/Bundle/ChillMainBundle/Templating/Listing/FilterOrderPositionEnum.php @@ -19,4 +19,6 @@ enum FilterOrderPositionEnum: string case EntityChoice = 'entity_choice'; case SingleCheckbox = 'single_checkbox'; case UserPicker = 'user_picker'; + + case IntegerField = 'integer_field'; }