UserCrudController   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 114
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 59
dl 0
loc 114
rs 10
c 1
b 0
f 0
wmc 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A configureCrud() 0 12 1
A getEntityFqcn() 0 3 1
A createEntity() 0 3 1
A configureFilters() 0 19 1
A updateEntity() 0 3 1
A configureFields() 0 28 1
A persistEntity() 0 3 1
A configureActions() 0 9 1
A deleteEntity() 0 3 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\DateTimeFilter;
34
use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
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\Security\Http\Attribute\IsGranted;
41
use Zikula\CoreBundle\Api\ApiInterface\LocaleApiInterface;
42
use Zikula\UsersBundle\Entity\User;
43
use Zikula\UsersBundle\Helper\ChoiceHelper;
44
use function Symfony\Component\Translation\t;
45
46
#[IsGranted('ROLE_ADMIN')]
47
class UserCrudController extends AbstractCrudController
48
{
49
    public function __construct(
50
        private readonly UserManager $userManager,
51
        private readonly LocaleApiInterface $localeApi,
52
        private readonly ChoiceHelper $choiceHelper
53
    ) {
54
    }
55
56
    public static function getEntityFqcn(): string
57
    {
58
        return User::class;
59
    }
60
61
    public function createEntity(string $entityFqcn): UserInterface
62
    {
63
        return $this->userManager->createUser();
64
    }
65
66
    public function configureCrud(Crud $crud): Crud
67
    {
68
        return $crud
69
            ->setEntityLabelInSingular(
70
                fn (?User $user, ?string $pageName) => $user ?? 'User'
71
            )
72
            ->setEntityLabelInPlural('Users')
73
            ->setPageTitle('index', '%entity_label_plural% list')
74
            ->setPageTitle('detail', fn (User $user) => $user)
75
            ->setPageTitle('edit', fn (User $user) => sprintf('Edit %s', $user))
76
            ->setDateFormat(DateTimeField::FORMAT_MEDIUM)
77
            ->setDateTimeFormat(DateTimeField::FORMAT_MEDIUM, DateTimeField::FORMAT_SHORT)
78
        ;
79
    }
80
81
    public function configureFields(string $pageName): iterable
82
    {
83
        yield 'id' => IdField::new('id', t('Id'))->hideOnForm()->setTextAlign('right')->setRequired(true);
84
        yield 'username' => TextField::new('username', t('User name'))->setRequired(true);
85
        yield 'email' => EmailField::new('email', t('Email address'))->setRequired(true);
86
        yield 'enabled' => BooleanField::new('enabled', t('Enabled'))->setTextAlign('center');
87
        yield 'plainPassword' => TextField::new('plainPassword', t('New password'))->hideOnIndex()->setHelp(t('used for resetting'));
88
        yield 'lastLogin' => DateTimeField::new('lastLogin', t('Last login'));
89
        yield 'confirmationToken' => TextField::new('confirmationToken', t('Confirmation token'))->onlyOnDetail();
90
        yield 'passwordRequestedAt' => DateTimeField::new('passwordRequestedAt', t('Password requested at'))->hideOnIndex();
91
        yield 'roles' => ChoiceField::new('roles', t('Roles'))->setRequired(true)->setChoices($this->choiceHelper->getRoles())->allowMultipleChoices();
92
        yield 'groups' => AssociationField::new('groups', t('Groups'));
93
        yield 'locale' => LocaleField::new('locale', t('Locale'))->includeOnly($this->localeApi->getSupportedLocales());
94
        yield 'timezone' => TimezoneField::new('timezone', t('Timezone'));
95
96
        // custom additions
97
        yield 'activated' => ChoiceField::new('activated', t('Activated'))->setRequired(true)->setChoices($this->choiceHelper->getActivatedValues())->renderExpanded();
98
        yield 'approvedDate' => DateTimeField::new('approvedDate', t('Approved at'))->hideOnIndex();
99
        yield 'approvedBy' => NumberField::new('approvedBy', t('Approved by'))->hideOnIndex(); // TODO replace by AssociationField
100
        yield 'registrationDate' => DateTimeField::new('registrationDate', t('Registered at'))->hideOnIndex();
101
102
        // legal policies
103
        // TODO consider configuration about which policies are enabled
104
        yield 'privacyPolicyAccepted' => DateTimeField::new('privacyPolicyAccepted', t('Privacy policy accepted'));
105
        yield 'termsOfUseAccepted' => DateTimeField::new('termsOfUseAccepted', t('Terms of use accepted'))->hideOnIndex();
106
        yield 'tradeConditionsAccepted' => DateTimeField::new('tradeConditionsAccepted', t('Trade conditions accepted'))->hideOnIndex();
107
        yield 'cancellationRightPolicyAccepted' => DateTimeField::new('cancellationRightPolicyAccepted', t('Cancellation right policy accepted'))->hideOnIndex();
108
        yield 'agePolicyAccepted' => DateTimeField::new('agePolicyAccepted', t('Age policy accepted'))->hideOnIndex();
109
110
        // yield 'attributes' => CollectionField... if eventually needed
111
    }
112
113
    public function configureFilters(Filters $filters): Filters
114
    {
115
        return $filters
116
            ->add('id')
117
            ->add('username')
118
            ->add('email')
119
            ->add('enabled')
120
            ->add(DateTimeFilter::new('lastLogin'))
121
            ->add(DateTimeFilter::new('passwordRequestedAt'))
122
            ->add(ChoiceFilter::new('roles')->setChoices($this->choiceHelper->getRoles())->canSelectMultiple())
123
            ->add(EntityFilter::new('groups')->canSelectMultiple())
124
            ->add(TextFilter::new('locale')->setFormTypeOptions(['value_type' => LocaleType::class, 'value_type_options.placeholder' => t('All')]))
125
            ->add(TextFilter::new('timezone')->setFormTypeOptions(['value_type' => TimezoneType::class, 'value_type_options.placeholder' => t('All')]))
126
127
            // custom additions
128
            ->add(ChoiceFilter::new('activated')->setChoices($this->choiceHelper->getActivatedValues())->canSelectMultiple())
129
            ->add(DateTimeFilter::new('approvedDate'))
130
            ->add('approvedBy')
131
            ->add(DateTimeFilter::new('registrationDate'))
132
        ;
133
    }
134
135
    public function configureActions(Actions $actions): Actions
136
    {
137
        return $actions
138
            ->add(Crud::PAGE_INDEX, Action::DETAIL)
139
            ->add(Crud::PAGE_EDIT, Action::INDEX)
140
            ->add(Crud::PAGE_NEW, Action::INDEX)
141
            ->add(Crud::PAGE_EDIT, Action::DETAIL)
142
            ->add(Crud::PAGE_EDIT, Action::DELETE)
143
            ->add(Crud::PAGE_NEW, Action::SAVE_AND_CONTINUE)
144
        ;
145
    }
146
147
    public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
148
    {
149
        $this->userManager->updateUser($entityInstance);
150
    }
151
152
    public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
153
    {
154
        $this->userManager->updateUser($entityInstance);
155
    }
156
157
    public function deleteEntity(EntityManagerInterface $entityManager, $entityInstance): void
158
    {
159
        $this->userManager->deleteUser($entityInstance);
160
    }
161
}
162