<?php
declare(strict_types=1);
namespace App\Form\Choice;
use App\Entity\User\AdminUser;
use App\Repository\AdminUserRepository;
use Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
use function is_array;
use function is_bool;
use function is_string;
use function sprintf;
class AdminUserChoiceType extends AbstractType
{
public function __construct(private readonly AdminUserRepository $adminUserRepository)
{
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
if (is_bool($options['multiple']) && ! $options['multiple']) {
return;
}
$builder->addModelTransformer(new CollectionToArrayTransformer());
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'choices' => fn (Options $options): array => is_array($options['attr']) && is_string($options['attr']['role']) ? $this->adminUserRepository->findByRoleResourceCodes([$options['attr']['role']], false) : [],
'choice_value' => 'email',
'choice_label' => static fn (AdminUser $adminUser): string => sprintf('%s (%s)', $adminUser->getFullName(), $adminUser->getEmail()),
'choice_translation_domain' => false,
]);
}
public function getParent(): string
{
return ChoiceType::class;
}
public function getBlockPrefix(): string
{
return 'app_admin_user_choice_type';
}
}