Passed
Push — main ( 674e66...68245a )
by Axel
04:12
created

UserCrudController::configureActions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
c 0
b 0
f 0
dl 0
loc 9
rs 10
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Zikula\UsersBundle\Controller;
15
16
use Doctrine\ORM\EntityManagerInterface;
17
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
18
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
19
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
20
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
21
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
22
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
23
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
24
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
25
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
26
use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
27
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
28
use EasyCorp\Bundle\EasyAdminBundle\Field\LocaleField;
29
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
30
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
31
use EasyCorp\Bundle\EasyAdminBundle\Field\TimezoneField;
32
use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
33
use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
34
use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter;
35
use EasyCorp\Bundle\EasyAdminBundle\Filter\TextFilter;
36
use Nucleos\UserBundle\Model\UserInterface;
37
use Nucleos\UserBundle\Model\UserManager;
38
use Symfony\Component\Form\Extension\Core\Type\LocaleType;
39
use Symfony\Component\Form\Extension\Core\Type\TimezoneType;
40
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
41
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
42
use Symfony\Component\Security\Http\Attribute\IsGranted;
43
use Zikula\Bundle\CoreBundle\Api\ApiInterface\LocaleApiInterface;
44
use Zikula\UsersBundle\Entity\User;
45
use Zikula\UsersBundle\Helper\RoleHelper;
46
use function Symfony\Component\Translation\t;
47
48
#[IsGranted('ROLE_ADMIN')]
49
class UserCrudController extends AbstractCrudController
50
{
51
    public function __construct(
52
        private readonly UserManager $userManager,
53
        private readonly LocaleApiInterface $localeApi,
54
        private readonly RoleHelper $roleHelper
55
    ) {
56
    }
57
58
    public static function getEntityFqcn(): string
59
    {
60
        return User::class;
61
    }
62
63
    public function createEntity(string $entityFqcn): UserInterface
64
    {
65
        return $this->userManager->createUser();
66
    }
67
68
    public function configureCrud(Crud $crud): Crud
69
    {
70
        return $crud
71
            ->setEntityLabelInSingular(
72
                fn (?User $user, ?string $pageName) => $user ?? 'User'
73
            )
74
            ->setEntityLabelInPlural('Users')
75
            ->setPageTitle('index', '%entity_label_plural% list')
76
            ->setPageTitle('detail', fn (User $user) => $user)
77
            ->setPageTitle('edit', fn (User $user) => sprintf('Edit %s', $user))
78
            ->setDateFormat(DateTimeField::FORMAT_MEDIUM)
79
            ->setDateTimeFormat(DateTimeField::FORMAT_MEDIUM, DateTimeField::FORMAT_SHORT)
80
        ;
81
    }
82
83
    public function configureFields(string $pageName): iterable
84
    {
85
        yield 'id' => IdField::new('id', t('Id'))->hideOnForm()->setTextAlign('right')->setRequired(true);
86
        yield 'username' => TextField::new('username', t('User name'))->setRequired(true);
87
        yield 'email' => EmailField::new('email', t('Email address'))->setRequired(true);
88
        yield 'enabled' => BooleanField::new('enabled', t('Enabled'))->setTextAlign('center');
89
        yield 'plainPassword' => TextField::new('plainPassword', t('New password'))->hideOnIndex()->setHelp(t('used for resetting'));
90
        yield 'lastLogin' => DateTimeField::new('lastLogin', t('Last login'));
91
        yield 'confirmationToken' => TextField::new('confirmationToken', t('Confirmation token'))->onlyOnDetail();
92
        yield 'passwordRequestedAt' => DateTimeField::new('passwordRequestedAt', t('Password requested at'))->hideOnIndex();
93
        yield 'roles' => ChoiceField::new('roles', t('Roles'))->setRequired(true)->setChoices($this->roleHelper->getRoleOptions())->allowMultipleChoices();
94
        yield 'groups' => AssociationField::new('groups', t('Groups'));
95
        yield 'locale' => LocaleField::new('locale', t('Locale'))->includeOnly($this->localeApi->getSupportedLocales());
96
        yield 'timezone' => TimezoneField::new('timezone', t('Timezone'));
97
98
        // custom additions
99
        yield 'approvedDate' => DateTimeField::new('approvedDate', t('Approved at'))->hideOnIndex();
100
        yield 'approvedBy' => NumberField::new('approvedBy', t('Approved by'))->hideOnIndex(); // TODO replace by AssociationField
101
        yield 'registrationDate' => DateTimeField::new('registrationDate', t('Registered at'))->hideOnIndex();
102
103
        // yield 'attributes' => CollectionField... if eventually needed
104
    }
105
106
    public function configureFilters(Filters $filters): Filters
107
    {
108
        return $filters
109
            ->add('id')
110
            ->add('username')
111
            ->add('email')
112
            ->add('enabled')
113
            ->add(DateTimeFilter::new('lastLogin'))
114
            ->add(DateTimeFilter::new('passwordRequestedAt'))
115
            ->add(ChoiceFilter::new('roles')->setChoices($this->roleHelper->getRoleOptions())->canSelectMultiple())
116
            ->add(EntityFilter::new('groups')->canSelectMultiple())
117
118
            ->add(TextFilter::new('locale')->setFormTypeOptions(['value_type' => LocaleType::class, 'value_type_options.placeholder' => t('All')]))
119
            ->add(TextFilter::new('timezone')->setFormTypeOptions(['value_type' => TimezoneType::class, 'value_type_options.placeholder' => t('All')]))
120
            ->add(DateTimeFilter::new('approvedDate'))
121
            ->add('approvedBy')
122
            ->add(DateTimeFilter::new('registrationDate'))
123
        ;
124
    }
125
126
    public function configureActions(Actions $actions): Actions
127
    {
128
        return $actions
129
            ->add(Crud::PAGE_INDEX, Action::DETAIL)
130
            ->add(Crud::PAGE_EDIT, Action::INDEX)
131
            ->add(Crud::PAGE_NEW, Action::INDEX)
132
            ->add(Crud::PAGE_EDIT, Action::DETAIL)
133
            ->add(Crud::PAGE_EDIT, Action::DELETE)
134
            ->add(Crud::PAGE_NEW, Action::SAVE_AND_CONTINUE)
135
        ;
136
    }
137
138
    public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
139
    {
140
        $this->userManager->updateUser($entityInstance);
141
    }
142
143
    public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
144
    {
145
        $this->userManager->updateUser($entityInstance);
146
    }
147
148
    public function deleteEntity(EntityManagerInterface $entityManager, $entityInstance): void
149
    {
150
        $this->userManager->deleteUser($entityInstance);
151
    }
152
}
153