From c7b2d5ea74169d486b41cef4d470528831e22705 Mon Sep 17 00:00:00 2001 From: Kai Dederichs Date: Tue, 26 Mar 2024 14:07:13 +0100 Subject: [PATCH] fix: setting html attribute to fields also adds them to the index page --- src/Dto/FieldDto.php | 20 ++++++++ src/Field/FieldTrait.php | 1 + src/Resources/views/crud/index.html.twig | 8 +++- .../CustomFieldAttributeControllerTest.php | 41 ++++++++++++++++ .../CustomFieldAttributeCrudController.php | 48 +++++++++++++++++++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 tests/Controller/CustomFieldAttributeControllerTest.php create mode 100644 tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php diff --git a/src/Dto/FieldDto.php b/src/Dto/FieldDto.php index f500a1189..a23c4b7e0 100644 --- a/src/Dto/FieldDto.php +++ b/src/Dto/FieldDto.php @@ -54,6 +54,7 @@ final class FieldDto /** @internal */ private $uniqueId; private KeyValueStore $displayedOn; + private array $htmlAttributes = []; public function __construct() { @@ -476,4 +477,23 @@ public function isDisplayedOn(string $pageName): bool { return $this->displayedOn->has($pageName); } + + public function getHtmlAttributes(): array + { + return $this->htmlAttributes; + } + + public function setHtmlAttributes(array $htmlAttributes): self + { + $this->htmlAttributes = $htmlAttributes; + + return $this; + } + + public function setHtmlAttribute(string $attribute, mixed $value): self + { + $this->htmlAttributes[$attribute] = $value; + + return $this; + } } diff --git a/src/Field/FieldTrait.php b/src/Field/FieldTrait.php index 2d7ea5e79..2cd56cfce 100644 --- a/src/Field/FieldTrait.php +++ b/src/Field/FieldTrait.php @@ -151,6 +151,7 @@ public function setHtmlAttribute(string $attributeName, $attributeValue): self } $this->dto->setFormTypeOption('attr.'.$attributeName, $attributeValue); + $this->dto->setHtmlAttribute($attributeName, $attributeValue); return $this; } diff --git a/src/Resources/views/crud/index.html.twig b/src/Resources/views/crud/index.html.twig index 82383f192..df490d01f 100644 --- a/src/Resources/views/crud/index.html.twig +++ b/src/Resources/views/crud/index.html.twig @@ -44,6 +44,12 @@ {%- endapply -%} {% endblock %} +{% macro render_html_attributes(item) %} + {% for attribute_name, attribute_value in item.htmlAttributes %} + {{ attribute_name }}="{{ attribute_value|e('html_attr') }}" + {% endfor %} +{% endmacro %} + {% set has_batch_actions = batch_actions|length > 0 %} {% block page_actions %} {% if filters|length > 0 %} @@ -148,7 +154,7 @@ {% for field in entity.fields %} {% set is_searchable = null == ea.crud.searchFields or field.property in ea.crud.searchFields %} - + {{ include(field.templatePath, { field: field, entity: entity }, with_context = false) }} {% endfor %} diff --git a/tests/Controller/CustomFieldAttributeControllerTest.php b/tests/Controller/CustomFieldAttributeControllerTest.php new file mode 100644 index 000000000..3f632abf7 --- /dev/null +++ b/tests/Controller/CustomFieldAttributeControllerTest.php @@ -0,0 +1,41 @@ +client->followRedirects(); + $this->client->setServerParameters(['PHP_AUTH_USER' => 'admin', 'PHP_AUTH_PW' => '1234']); + + $this->categories = $this->entityManager->getRepository(Category::class); + } + + public function testItAddsAttributesToTd(): void + { + $crawler = $this->client->request('GET', $this->generateIndexUrl()); + + static::assertCount(20, $crawler->filter('td[multi-test-one="test1"]')); + static::assertCount(20, $crawler->filter('td[multi-test-two="test2"]')); + } +} diff --git a/tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php b/tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php new file mode 100644 index 000000000..c4ee37ffd --- /dev/null +++ b/tests/TestApplication/src/Controller/CustomFieldAttributeCrudController.php @@ -0,0 +1,48 @@ +setHtmlAttribute('multi-test-one', 'test1') + ->setHtmlAttribute('multi-test-two', 'test2'), + ]; + } + + public function configureActions(Actions $actions): Actions + { + $action1 = Action::new('action1')->linkToCrudAction(''); + $action2 = Action::new('action2')->linkToCrudAction('')->setCssClass('foo'); + $action3 = Action::new('action3')->linkToCrudAction('')->addCssClass('bar'); + $action4 = Action::new('action4')->linkToCrudAction('')->setCssClass('foo')->addCssClass('bar'); + + return $actions + ->add(Crud::PAGE_INDEX, $action1) + ->add(Crud::PAGE_INDEX, $action2) + ->add(Crud::PAGE_INDEX, $action3) + ->add(Crud::PAGE_INDEX, $action4) + ->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) { + return $action->setIcon('fa fa-fw fa-plus')->setLabel(false); + }) + ; + } +}