diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index e6195fa1..b4fd8b7a 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -10,6 +10,16 @@ parameters: count: 1 path: src/Action/LoginAction.php + - + message: "#^Property Nucleos\\\\UserAdminBundle\\\\Admin\\\\Model\\\\GroupAdmin\\:\\:\\$groupManager with generic interface Nucleos\\\\UserBundle\\\\Model\\\\GroupManagerInterface does not specify its types\\: GroupTemplate$#" + count: 1 + path: src/Admin/Model/GroupAdmin.php + + - + message: "#^Method Nucleos\\\\UserAdminBundle\\\\Admin\\\\Model\\\\GroupAdmin\\:\\:__construct\\(\\) has parameter \\$groupManager with generic interface Nucleos\\\\UserBundle\\\\Model\\\\GroupManagerInterface but does not specify its types\\: GroupTemplate$#" + count: 1 + path: src/Admin/Model/GroupAdmin.php + - message: "#^Call to an undefined method Symfony\\\\Component\\\\Config\\\\Definition\\\\Builder\\\\NodeDefinition\\:\\:children\\(\\)\\.$#" count: 1 diff --git a/src/Admin/Model/GroupAdmin.php b/src/Admin/Model/GroupAdmin.php index 642605ef..3cf4515b 100644 --- a/src/Admin/Model/GroupAdmin.php +++ b/src/Admin/Model/GroupAdmin.php @@ -13,7 +13,8 @@ namespace Nucleos\UserAdminBundle\Admin\Model; -use Nucleos\UserAdminBundle\Form\Type\SecurityRolesType; +use Nucleos\UserAdminBundle\Form\Type\RolesMatrixType; +use Nucleos\UserBundle\Model\GroupManagerInterface; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Datagrid\ListMapper; @@ -28,11 +29,21 @@ abstract class GroupAdmin extends AbstractAdmin 'validation_groups' => 'Registration', ]; - public function getNewInstance() + /** + * @var GroupManagerInterface + */ + private $groupManager; + + public function __construct($code, $class, $baseControllerName, GroupManagerInterface $groupManager) { - $class = $this->getClass(); + parent::__construct($code, $class, $baseControllerName); - return new $class('', []); + $this->groupManager = $groupManager; + } + + public function getNewInstance() + { + return $this->groupManager->createGroup(''); } protected function configureListFields(ListMapper $listMapper): void @@ -61,7 +72,7 @@ protected function configureFormFields(FormMapper $formMapper): void ->tab('Security') ->with('Roles', ['class' => 'col-md-12']) - ->add('roles', SecurityRolesType::class, [ + ->add('roles', RolesMatrixType::class, [ 'expanded' => true, 'multiple' => true, 'required' => false, diff --git a/src/Admin/Model/UserAdmin.php b/src/Admin/Model/UserAdmin.php index d836a1d5..20ba6bde 100644 --- a/src/Admin/Model/UserAdmin.php +++ b/src/Admin/Model/UserAdmin.php @@ -13,7 +13,9 @@ namespace Nucleos\UserAdminBundle\Admin\Model; -use Nucleos\UserAdminBundle\Form\Type\SecurityRolesType; +use DomainException; +use Nucleos\UserAdminBundle\Form\Type\RolesMatrixType; +use Nucleos\UserBundle\Model\LocaleAwareInterface; use Nucleos\UserBundle\Model\UserInterface; use Nucleos\UserBundle\Model\UserManagerInterface; use Sonata\AdminBundle\Admin\AbstractAdmin; @@ -22,7 +24,9 @@ use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Form\Type\ModelType; use Sonata\AdminBundle\Show\ShowMapper; +use Symfony\Component\Form\Extension\Core\Type\LocaleType; use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\Extension\Core\Type\TimezoneType; use Symfony\Component\Form\FormBuilderInterface; abstract class UserAdmin extends AbstractAdmin @@ -39,6 +43,27 @@ public function __construct($code, $class, $baseControllerName, UserManagerInter $this->userManager = $userManager; } + public function getNewInstance() + { + $instance = $this->userManager->createUser(); + + // TODO: Find a better way to create editable form models + // BC layer + try { + $instance->getUsername(); + } catch (DomainException $exception) { + $instance->setUsername(''); + } + + try { + $instance->getEmail(); + } catch (DomainException $exception) { + $instance->setEmail(''); + } + + return $instance; + } + public function getFormBuilder(): FormBuilderInterface { $this->formOptions['data_class'] = $this->getClass(); @@ -84,12 +109,13 @@ protected function configureListFields(ListMapper $listMapper): void ->add('email') ->add('groups') ->add('enabled', null, ['editable' => true]) - ->add('createdAt') ; if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) { $listMapper - ->add('impersonating', 'string', ['template' => '@NucleosUserAdmin/Admin/Field/impersonating.html.twig']) + ->add('impersonating', 'string', [ + 'template' => '@NucleosUserAdmin/Admin/Field/impersonating.html.twig', + ]) ; } } @@ -114,10 +140,6 @@ protected function configureShowFields(ShowMapper $showMapper): void ->with('Groups') ->add('groups') ->end() - ->with('Security') - ->add('token') - ->add('twoStepVerificationCode') - ->end() ; } @@ -126,12 +148,14 @@ protected function configureFormFields(FormMapper $formMapper): void $formMapper ->tab('User') ->with('General', ['class' => 'col-md-6'])->end() + ->ifTrue($this->isLocaleAwareSubject()) + ->with('Locale', ['class' => 'col-md-6'])->end() + ->ifEnd() ->end() ->tab('Security') + ->with('Groups', ['class' => 'col-md-8'])->end() ->with('Status', ['class' => 'col-md-4'])->end() - ->with('Groups', ['class' => 'col-md-4'])->end() - ->with('Keys', ['class' => 'col-md-4'])->end() ->with('Roles', ['class' => 'col-md-12'])->end() ->end() ; @@ -145,6 +169,16 @@ protected function configureFormFields(FormMapper $formMapper): void 'required' => $this->isNewInstance(), ]) ->end() + ->ifTrue($this->isLocaleAwareSubject()) + ->with('Locale') + ->add('locale', LocaleType::class, [ + 'required' => false, + ]) + ->add('timezone', TimezoneType::class, [ + 'required' => false, + ]) + ->end() + ->ifEnd() ->end() ->tab('Security') @@ -159,17 +193,13 @@ protected function configureFormFields(FormMapper $formMapper): void ]) ->end() ->with('Roles') - ->add('realRoles', SecurityRolesType::class, [ + ->add('roles', RolesMatrixType::class, [ 'label' => 'form.label_roles', 'expanded' => true, 'multiple' => true, 'required' => false, ]) ->end() - ->with('Keys') - ->add('token', null, ['required' => false]) - ->add('twoStepVerificationCode', null, ['required' => false]) - ->end() ->end() ; } @@ -178,4 +208,9 @@ private function isNewInstance(): bool { return !$this->hasSubject() || null === $this->getSubject()|| null === $this->id($this->getSubject()); } + + private function isLocaleAwareSubject(): bool + { + return is_subclass_of($this->getClass(), LocaleAwareInterface::class); + } } diff --git a/src/Resources/config/admin_mongodb.xml b/src/Resources/config/admin_mongodb.xml index cefc30f1..0da01460 100755 --- a/src/Resources/config/admin_mongodb.xml +++ b/src/Resources/config/admin_mongodb.xml @@ -21,6 +21,7 @@ %nucleos_user.model.group.class% %nucleos_user_admin.admin.group.controller% + %nucleos_user_admin.admin.group.translation_domain% diff --git a/src/Resources/config/admin_orm.xml b/src/Resources/config/admin_orm.xml index baa69597..c7df3fb3 100644 --- a/src/Resources/config/admin_orm.xml +++ b/src/Resources/config/admin_orm.xml @@ -21,6 +21,7 @@ %nucleos_user.model.group.class% %nucleos_user_admin.admin.group.controller% + %nucleos_user_admin.admin.group.translation_domain% diff --git a/src/Resources/translations/NucleosUserAdminBundle.de.xliff b/src/Resources/translations/NucleosUserAdminBundle.de.xliff index ca566006..d77d135f 100644 --- a/src/Resources/translations/NucleosUserAdminBundle.de.xliff +++ b/src/Resources/translations/NucleosUserAdminBundle.de.xliff @@ -286,6 +286,10 @@ General Allgemein + + Locale + Ort + Profile Profil @@ -306,10 +310,6 @@ Roles Rollen - - Keys - Schlüssel - Security Sicherheit diff --git a/src/Resources/translations/NucleosUserAdminBundle.en.xliff b/src/Resources/translations/NucleosUserAdminBundle.en.xliff index 13c902eb..71202610 100644 --- a/src/Resources/translations/NucleosUserAdminBundle.en.xliff +++ b/src/Resources/translations/NucleosUserAdminBundle.en.xliff @@ -210,6 +210,10 @@ General General + + Locale + Locale + Groups Groups diff --git a/src/Resources/views/Form/roles_matrix_list.html.twig b/src/Resources/views/Form/roles_matrix_list.html.twig index c2846e70..ab2c9d2a 100644 --- a/src/Resources/views/Form/roles_matrix_list.html.twig +++ b/src/Resources/views/Form/roles_matrix_list.html.twig @@ -1,5 +1,5 @@ {% for role, attributes in roles|sort %} -
  • {{ form_widget(attributes.form, {label: attributes.role_translated, value: attributes.role}) }}
  • +
  • {{ form_widget(attributes.form, {label: attributes.role_translated, translation_domain: false, value: attributes.role}) }}
  • {% if not attributes.is_granted %}