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 %}