diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml
index 70386de6ec..8e16e8d157 100644
--- a/src/bundle/Resources/config/services.yaml
+++ b/src/bundle/Resources/config/services.yaml
@@ -36,6 +36,7 @@ imports:
- { resource: services/user.yaml }
- { resource: services/commands.yaml }
- { resource: services/icons.yaml }
+ - { resource: services/role_form_mappers.yaml }
services:
_defaults:
diff --git a/src/bundle/Resources/config/services/role_form_mappers.yaml b/src/bundle/Resources/config/services/role_form_mappers.yaml
index 98adbb2f9a..2513dec543 100644
--- a/src/bundle/Resources/config/services/role_form_mappers.yaml
+++ b/src/bundle/Resources/config/services/role_form_mappers.yaml
@@ -219,8 +219,26 @@ services:
$roleService: '@ibexa.api.service.role'
$userService: '@ibexa.api.service.user'
calls:
- - [setLogger, ['@?logger']]
- [ setFormTemplate, [ '%ibexa.content_forms.limitation.multiple_selection.template%' ] ]
tags:
- { name: ibexa.admin_ui.limitation.mapper.form, limitationType: UserPermissions }
- { name: ibexa.admin_ui.limitation.mapper.value, limitationType: UserPermissions }
+
+ Ibexa\AdminUi\Limitation\Mapper\MemberOfLimitationMapper:
+ parent: Ibexa\AdminUi\Limitation\Mapper\MultipleSelectionBasedMapper
+ arguments:
+ $userService: '@ibexa.api.service.user'
+ $repository: '@ibexa.api.repository'
+ $contentService: '@ibexa.api.service.content'
+ $translator: '@translator'
+ tags:
+ - { name: ibexa.admin_ui.limitation.mapper.form, limitationType: MemberOf }
+ - { name: ibexa.admin_ui.limitation.mapper.value, limitationType: MemberOf }
+
+ Ibexa\AdminUi\Limitation\Mapper\RoleLimitationMapper:
+ parent: Ibexa\AdminUi\Limitation\Mapper\MultipleSelectionBasedMapper
+ arguments:
+ $roleService: '@ibexa.api.service.role'
+ tags:
+ - { name: ibexa.admin_ui.limitation.mapper.form, limitationType: Role }
+ - { name: ibexa.admin_ui.limitation.mapper.value, limitationType: Role }
diff --git a/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff b/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff
index 3f77a7e6be..46cbb0c5a0 100644
--- a/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff
+++ b/src/bundle/Resources/translations/ezplatform_content_forms_policies.en.xliff
@@ -26,6 +26,11 @@
Language
key: policy.limitation.identifier.language
+
+ MemberOf
+ MemberOf
+ key: policy.limitation.identifier.memberof
+
New Section
New Section
@@ -71,6 +76,11 @@
PersonalizationAccess
key: policy.limitation.identifier.personalizationaccess
+
+ Role
+ Role
+ key: policy.limitation.identifier.role
+
ProductType
ProductType
diff --git a/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff b/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff
index b220a2c16c..ac2b574e8c 100644
--- a/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff
+++ b/src/bundle/Resources/translations/ezplatform_content_forms_role.en.xliff
@@ -11,6 +11,11 @@
Self
key: policy.limitation.group.self
+
+ Self
+ Self
+ key: policy.limitation.member_of.self_user_group
+
Self
Self
diff --git a/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig b/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig
index be5d3f2120..f890f3ae39 100644
--- a/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig
+++ b/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig
@@ -141,3 +141,15 @@
{% endfor %}
{% endapply %}
{% endblock %}
+
+{% block ez_limitation_memberof_value %}
+ {% apply spaceless %}
+ {{ values|join(', ') }}
+ {% endapply %}
+{% endblock %}
+
+{% block ez_limitation_role_value %}
+ {% apply spaceless %}
+ {{ values|join(', ') }}
+ {% endapply %}
+{% endblock %}
diff --git a/src/lib/Limitation/Mapper/MemberOfLimitationMapper.php b/src/lib/Limitation/Mapper/MemberOfLimitationMapper.php
new file mode 100644
index 0000000000..62534a8ed9
--- /dev/null
+++ b/src/lib/Limitation/Mapper/MemberOfLimitationMapper.php
@@ -0,0 +1,100 @@
+userService = $userService;
+ $this->repository = $repository;
+ $this->contentService = $contentService;
+ $this->translator = $translator;
+ }
+
+ protected function getSelectionChoices(): array
+ {
+ $userGroups = $this->loadUserGroups();
+ $choices = [];
+ $choices[MemberOfLimitationType::SELF_USER_GROUP] = $this->getSelfUserGroupLabel();
+
+ foreach ($userGroups as $userGroup) {
+ $choices[$userGroup->id] = $userGroup->getName();
+ }
+
+ return $choices;
+ }
+
+ public function mapLimitationValue(Limitation $limitation): array
+ {
+ $values = [];
+ foreach ($limitation->limitationValues as $groupId) {
+ if ((int)$groupId === MemberOfLimitationType::SELF_USER_GROUP) {
+ $values[] = $this->getSelfUserGroupLabel();
+ continue;
+ }
+ $values[] = $this->userService->loadUserGroup((int)$groupId)->getName();
+ }
+
+ return $values;
+ }
+
+ /**
+ * @return \Ibexa\Contracts\Core\Repository\Values\User\UserGroup[]
+ */
+ private function loadUserGroups(): array
+ {
+ return $this->repository->sudo(function () {
+ $filter = new Filter();
+ $filter->withCriterion(new ContentTypeIdentifier('user_group'));
+ $filter->withSortClause(new ContentName());
+ $results = $this->contentService->find($filter);
+
+ $groups = [];
+ foreach ($results as $result) {
+ $groups[] = $this->userService->loadUserGroup($result->id);
+ }
+
+ return $groups;
+ });
+ }
+
+ private function getSelfUserGroupLabel(): string
+ {
+ return $this->translator->trans(
+ /** @Desc("Self") */
+ 'policy.limitation.member_of.self_user_group',
+ [],
+ 'ezplatform_content_forms_role'
+ );
+ }
+}
diff --git a/src/lib/Limitation/Mapper/RoleLimitationMapper.php b/src/lib/Limitation/Mapper/RoleLimitationMapper.php
new file mode 100644
index 0000000000..98a2a4ac8d
--- /dev/null
+++ b/src/lib/Limitation/Mapper/RoleLimitationMapper.php
@@ -0,0 +1,45 @@
+roleService = $roleService;
+ }
+
+ protected function getSelectionChoices(): array
+ {
+ $choices = [];
+ foreach ($this->roleService->loadRoles() as $role) {
+ $choices[$role->id] = $role->identifier;
+ }
+
+ return $choices;
+ }
+
+ public function mapLimitationValue(Limitation $limitation): array
+ {
+ $values = [];
+
+ foreach ($limitation->limitationValues as $roleId) {
+ $values[] = $this->roleService->loadRole((int)$roleId)->identifier;
+ }
+
+ return $values;
+ }
+}
diff --git a/src/lib/Limitation/Mapper/UserPermissionsLimitationMapper.php b/src/lib/Limitation/Mapper/UserPermissionsLimitationMapper.php
index 1e68cda73f..b9a0d7084d 100644
--- a/src/lib/Limitation/Mapper/UserPermissionsLimitationMapper.php
+++ b/src/lib/Limitation/Mapper/UserPermissionsLimitationMapper.php
@@ -4,6 +4,8 @@
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
+declare(strict_types=1);
+
namespace Ibexa\AdminUi\Limitation\Mapper;
use Ibexa\AdminUi\Limitation\LimitationFormMapperInterface;
@@ -15,8 +17,6 @@
use Ibexa\Contracts\Core\Repository\UserService;
use Ibexa\Contracts\Core\Repository\Values\User\Limitation;
use Ibexa\User\Form\ChoiceList\Loader\UserGroupsChoiceLoader;
-use Psr\Log\LoggerAwareTrait;
-use Psr\Log\NullLogger;
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
@@ -24,8 +24,6 @@
final class UserPermissionsLimitationMapper implements LimitationValueMapperInterface, LimitationFormMapperInterface
{
- use LoggerAwareTrait;
-
private RoleService $roleService;
private UserService $userService;
@@ -42,7 +40,6 @@ public function __construct(
RoleService $roleService,
UserService $userService
) {
- $this->logger = new NullLogger();
$this->roleService = $roleService;
$this->userService = $userService;
$this->repository = $repository;
@@ -100,7 +97,6 @@ function () {
'multiple' => true,
'required' => false,
]);
-
$form->add($sub);
}