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); }