From 21c9f071f30f19d501d52b8914fa3bc3331c64bc Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Wed, 28 Aug 2024 11:47:42 +0200 Subject: [PATCH] dev: Allow to filter organizations by granted permission in OrganizationType --- src/Form/Type/OrganizationType.php | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Form/Type/OrganizationType.php b/src/Form/Type/OrganizationType.php index 6ad2803a..9aeef2f9 100644 --- a/src/Form/Type/OrganizationType.php +++ b/src/Form/Type/OrganizationType.php @@ -8,6 +8,7 @@ use App\Entity; use App\Repository; +use App\Security; use App\Service; use Symfony\Bridge\Doctrine\Form\Type; use Symfony\Component\Form\AbstractType; @@ -20,6 +21,7 @@ class OrganizationType extends AbstractType { public function __construct( private Repository\OrganizationRepository $organizationRepository, + private Security\Authorizer $authorizer, private Service\Sorter\OrganizationSorter $organizationSorter, ) { } @@ -30,19 +32,39 @@ public function configureOptions(OptionsResolver $resolver): void 'class' => Entity\Organization::class, 'choice_loader' => function (Options $options): ChoiceLoaderInterface { + $permission = $options['permission']; + + $vary = [$permission]; + return ChoiceList::lazy( $this, - function () { + function () use ($permission) { $organizations = $this->organizationRepository->findAll(); + + if ($permission) { + $organizations = array_filter( + $organizations, + function ($organization) use ($permission): bool { + return $this->authorizer->isGranted($permission, $organization); + } + ); + } + $this->organizationSorter->sort($organizations); + return $organizations; }, + $vary, ); }, 'choice_label' => 'name', 'choice_value' => 'id', + + 'permission' => '', ]); + + $resolver->setAllowedTypes('permission', 'string'); } public function getParent(): string