From d98063eea86bc5ba5f2e0416da1fef80e3e42732 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 09:56:47 +0200 Subject: [PATCH 01/19] Added custom override class --- .../AuthorAssignmentNodeBulkFormOverride.php | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php new file mode 100644 index 00000000..f1ebeba3 --- /dev/null +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -0,0 +1,114 @@ +currentUser = $container->get('current_user'); + $instance->entityTypeManager = $container->get('entity_type.manager'); + $instance->languageCode = $container->get('language_manager')->getCurrentLanguage()->getId(); + $instance->accessStorage = $container->get('permissions_by_term.access_storage'); + return $instance; + } + + /** + * Gets the taxonomy terms that the current user has access to. + * + * @return array + * An array of term IDs that the current user has permission to access. + * Returns an empty array if no terms are accessible or if the user + * has no permissions. + */ + private function getUserTerms(): array { + $current_user = User::load($this->currentUser->id()); + + return $this->accessStorage->getPermittedTids($current_user->id(), $current_user->getRoles()); + } + + /** + * Retrieves a list of users based on term IDs. + * + * @param array $userTermsIds + * An array of term IDs for which to retrieve the associated users. + * + * @return array + * An associative array where the keys are user IDs and the values are + * the display names of the users. Returns empty array if no users are found. + */ + private function getUsersByTermId(array $userTermsIds): array { + $users = []; + if (!empty($userTermsIds)) { + // Get all users that have access to these terms. + foreach ($userTermsIds as $termId) { + $userIdsResult = $this->accessStorage->getAllowedUserIds($termId, $this->languageCode); + foreach ($userIdsResult as $userId) { + if (!isset($users[$userId])) { + if ($user = User::load($userId)) { + $users[$userId] = $user->getDisplayName(); + } + } + } + } + } + return $users; + } + + /** + * {@inheritdoc} + */ + public function viewsForm(&$form, FormStateInterface $form_state): void { + parent::viewsForm($form, $form_state); + + $form['header']['node_bulk_form']['assignee_uid']['#type'] = 'select'; + $form['header']['node_bulk_form']['assignee_uid']['#chosen'] = TRUE; + + $userTermsIds = $this->getUserTerms(); + $users = $this->getUsersByTermId($userTermsIds); + $form['header']['node_bulk_form']['assignee_uid']['#options'] = $users; + } + +} From c001d4963d1cd7c8286d3cbc48514adcbcfbe426 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 09:57:38 +0200 Subject: [PATCH 02/19] Hooked into author_assignment_node_bulk --- .../os2forms_selvbetjening/os2forms_selvbetjening.module | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module b/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module index 0a19ab20..f053b23f 100644 --- a/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module +++ b/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module @@ -27,3 +27,11 @@ function os2forms_selvbetjening_webform_element_alter(array &$element, FormState $element['#attributes']['class'][] = 'js-form-item'; } } + +function os2forms_selvbetjening_views_plugins_field_alter(array &$plugins) { + if (array_key_exists('author_assignment_node_bulk_form', $plugins)) { + $plugins['author_assignment_node_bulk_form']['id'] .= '_override'; + $plugins['author_assignment_node_bulk_form']['class'] = 'Drupal\os2forms_selvbetjening\Plugin\views\field\AuthorAssignmentNodeBulkFormOverride'; + $plugins['author_assignment_node_bulk_form']['provider'] = 'os2forms_selvbetjening'; + } +} From 8fbee7e6a01a988c05aae99c4b1f5c268e3f8bdf Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 09:58:10 +0200 Subject: [PATCH 03/19] Added chosen as a dependency for improved display of available owners --- .../os2forms_selvbetjening/os2forms_selvbetjening.info.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.info.yml b/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.info.yml index 83d3e8f5..26ab7cca 100644 --- a/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.info.yml +++ b/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.info.yml @@ -5,3 +5,4 @@ package: 'OS2Forms' core_version_requirement: ^9 || ^10 dependencies: - 'webform:webform' + - 'chosen:chosen' From ed281f2bdc5540a8cbdafe76838d5431ff0c253f Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 09:59:22 +0200 Subject: [PATCH 04/19] Added drupal/author_bulk_assignment and drupal/chosen modules --- composer.json | 2 + composer.lock | 191 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 192 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 752d10a6..b9ab3c3d 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,8 @@ "require": { "php": "^8.3", "composer/installers": "^2.0", + "drupal/author_bulk_assignment": "^2.0", + "drupal/chosen": "^5.0", "drupal/ckeditor": "^1.0", "drupal/clamav": "^2.0", "drupal/color": "^1.0", diff --git a/composer.lock b/composer.lock index 12dd5522..390a2ec2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ba4fba1f87c766ea7a46bfa629dbaaf0", + "content-hash": "2de54324c83dcd3b3d49fe7193b0afa5", "packages": [ { "name": "asm89/stack-cors", @@ -1548,6 +1548,52 @@ "source": "https://git.drupalcode.org/project/advancedqueue" } }, + { + "name": "drupal/author_bulk_assignment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/author_bulk_assignment.git", + "reference": "2.0.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/author_bulk_assignment-2.0.0.zip", + "reference": "2.0.0", + "shasum": "c055a2e21e9bd592662bfc66ec0b9c5c6537212f" + }, + "require": { + "drupal/core": "^10 || ^11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "2.0.0", + "datestamp": "1727438654", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Fathima Asmat", + "homepage": "https://www.drupal.org/u/fathimaasmat", + "role": "Maintainer" + } + ], + "description": "Author bulk assignment Drupal module", + "homepage": "https://www.drupal.org/project/author_bulk_assignment", + "support": { + "source": "https://git.drupalcode.org/project/author_bulk_assignment", + "issues": "https://www.drupal.org/project/issues/author_bulk_assignment" + } + }, { "name": "drupal/authorization", "version": "1.4.0", @@ -1658,6 +1704,149 @@ "source": "https://git.drupalcode.org/project/cache_control_override" } }, + { + "name": "drupal/chosen", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/chosen.git", + "reference": "5.0.2" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/chosen-5.0.2.zip", + "reference": "5.0.2", + "shasum": "bda191e28f3461bfa36f63d12b6d14c346104840" + }, + "require": { + "drupal/chosen_lib": "*", + "drupal/core": "^10.2 || ^11" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "5.0.2", + "datestamp": "1746293867", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "aidanlis", + "homepage": "https://www.drupal.org/user/502018" + }, + { + "name": "Cyclodex", + "homepage": "https://www.drupal.org/user/1305230" + }, + { + "name": "dave reid", + "homepage": "https://www.drupal.org/user/53892" + }, + { + "name": "hydra", + "homepage": "https://www.drupal.org/user/647364" + }, + { + "name": "kalman.hosszu", + "homepage": "https://www.drupal.org/user/267481" + }, + { + "name": "nagy.balint", + "homepage": "https://www.drupal.org/user/1763952" + }, + { + "name": "pol", + "homepage": "https://www.drupal.org/user/47194" + }, + { + "name": "shadcn", + "homepage": "https://www.drupal.org/user/571032" + }, + { + "name": "supercabbageuk", + "homepage": "https://www.drupal.org/user/235438" + } + ], + "description": "Makes select elements more user-friendly using Chosen.", + "homepage": "https://www.drupal.org/project/chosen", + "support": { + "source": "https://git.drupalcode.org/project/chosen" + } + }, + { + "name": "drupal/chosen_lib", + "version": "5.0.2", + "require": { + "drupal/chosen": "^5", + "drupal/core": "^10.2 || ^11" + }, + "type": "metapackage", + "extra": { + "drupal": { + "version": "5.0.2", + "datestamp": "1746293867", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "aidanlis", + "homepage": "https://www.drupal.org/user/502018" + }, + { + "name": "Cyclodex", + "homepage": "https://www.drupal.org/user/1305230" + }, + { + "name": "dave reid", + "homepage": "https://www.drupal.org/user/53892" + }, + { + "name": "hydra", + "homepage": "https://www.drupal.org/user/647364" + }, + { + "name": "kalman.hosszu", + "homepage": "https://www.drupal.org/user/267481" + }, + { + "name": "nagy.balint", + "homepage": "https://www.drupal.org/user/1763952" + }, + { + "name": "pol", + "homepage": "https://www.drupal.org/user/47194" + }, + { + "name": "shadcn", + "homepage": "https://www.drupal.org/user/571032" + }, + { + "name": "supercabbageuk", + "homepage": "https://www.drupal.org/user/235438" + } + ], + "description": "Add chosen library definition.", + "homepage": "https://www.drupal.org/project/chosen", + "support": { + "source": "https://git.drupalcode.org/project/chosen" + } + }, { "name": "drupal/ckeditor", "version": "1.0.2", From bb71ddb364fd0590b23db5824f6d6d2dec8d5861 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 10:09:10 +0200 Subject: [PATCH 05/19] Refactored and attempted to correct injection --- .../AuthorAssignmentNodeBulkFormOverride.php | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index f1ebeba3..efacd13f 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -3,7 +3,12 @@ namespace Drupal\os2forms_selvbetjening\Plugin\views\field; use Drupal\author_bulk_assignment\Plugin\views\field\AuthorAssignmentEntityBulkForm; +use Drupal\Core\Entity\EntityRepositoryInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Language\LanguageManagerInterface; +use Drupal\Core\Messenger\MessengerInterface; +use Drupal\Core\Session\AccountProxyInterface; use Drupal\permissions_by_term\Service\AccessStorage; use Drupal\user\Entity\User; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -18,8 +23,10 @@ class AuthorAssignmentNodeBulkFormOverride extends AuthorAssignmentEntityBulkFor /** * The current user. * + * @var \Drupal\Core\Session\AccountProxyInterface */ - protected Object|null $currentUser; + protected AccountProxyInterface $currentUser; + /** * The entity type manager. @@ -40,21 +47,48 @@ class AuthorAssignmentNodeBulkFormOverride extends AuthorAssignmentEntityBulkFor * * @var string */ - private string $languageCode = ''; + protected string $langcode; + + /** + * Constructs a new AuthorAssignmentNodeBulkFormOverride instance. + */ + public function __construct( + AccessStorage $access_storage, + array $configuration, + $plugin_id, + $plugin_definition, + EntityTypeManagerInterface $entity_type_manager, + LanguageManagerInterface $language_manager, + MessengerInterface $messenger, + EntityRepositoryInterface $entity_repository, + AccountProxyInterface $current_user + ) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $language_manager, $messenger, $entity_repository); + $this->accessStorage = $access_storage; + $this->entityTypeManager = $entity_type_manager; + $this->langcode = $language_manager->getCurrentLanguage()->getId(); + $this->currentUser = $current_user; + } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self { - $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition); - $instance->currentUser = $container->get('current_user'); - $instance->entityTypeManager = $container->get('entity_type.manager'); - $instance->languageCode = $container->get('language_manager')->getCurrentLanguage()->getId(); - $instance->accessStorage = $container->get('permissions_by_term.access_storage'); - return $instance; + return new static( + $container->get('permissions_by_term.access_storage'), + $configuration, + $plugin_id, + $plugin_definition, + $container->get('entity_type.manager'), + $container->get('language_manager'), + $container->get('messenger'), + $container->get('entity.repository'), + $container->get('current_user') + ); } + /** * Gets the taxonomy terms that the current user has access to. * @@ -84,7 +118,7 @@ private function getUsersByTermId(array $userTermsIds): array { if (!empty($userTermsIds)) { // Get all users that have access to these terms. foreach ($userTermsIds as $termId) { - $userIdsResult = $this->accessStorage->getAllowedUserIds($termId, $this->languageCode); + $userIdsResult = $this->accessStorage->getAllowedUserIds($termId, $this->langcode); foreach ($userIdsResult as $userId) { if (!isset($users[$userId])) { if ($user = User::load($userId)) { From d2789291df65223e345d198ab8b6c390ff7bcbe7 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 10:15:51 +0200 Subject: [PATCH 06/19] Coding standards --- .../os2forms_selvbetjening/os2forms_selvbetjening.module | 3 +++ .../views/field/AuthorAssignmentNodeBulkFormOverride.php | 9 ++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module b/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module index f053b23f..aedf8486 100644 --- a/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module +++ b/web/modules/custom/os2forms_selvbetjening/os2forms_selvbetjening.module @@ -28,6 +28,9 @@ function os2forms_selvbetjening_webform_element_alter(array &$element, FormState } } +/** + * Implements hook_views_plugins_field_alter(). + */ function os2forms_selvbetjening_views_plugins_field_alter(array &$plugins) { if (array_key_exists('author_assignment_node_bulk_form', $plugins)) { $plugins['author_assignment_node_bulk_form']['id'] .= '_override'; diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index efacd13f..7d2e45e1 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -2,13 +2,13 @@ namespace Drupal\os2forms_selvbetjening\Plugin\views\field; -use Drupal\author_bulk_assignment\Plugin\views\field\AuthorAssignmentEntityBulkForm; use Drupal\Core\Entity\EntityRepositoryInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountProxyInterface; +use Drupal\author_bulk_assignment\Plugin\views\field\AuthorAssignmentEntityBulkForm; use Drupal\permissions_by_term\Service\AccessStorage; use Drupal\user\Entity\User; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -49,7 +49,6 @@ class AuthorAssignmentNodeBulkFormOverride extends AuthorAssignmentEntityBulkFor */ protected string $langcode; - /** * Constructs a new AuthorAssignmentNodeBulkFormOverride instance. */ @@ -62,7 +61,7 @@ public function __construct( LanguageManagerInterface $language_manager, MessengerInterface $messenger, EntityRepositoryInterface $entity_repository, - AccountProxyInterface $current_user + AccountProxyInterface $current_user, ) { parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $language_manager, $messenger, $entity_repository); $this->accessStorage = $access_storage; @@ -88,7 +87,6 @@ public static function create(ContainerInterface $container, array $configuratio ); } - /** * Gets the taxonomy terms that the current user has access to. * @@ -111,7 +109,8 @@ private function getUserTerms(): array { * * @return array * An associative array where the keys are user IDs and the values are - * the display names of the users. Returns empty array if no users are found. + * the display names of the users. Returns an empty array if no users + * are found. */ private function getUsersByTermId(array $userTermsIds): array { $users = []; From f36c897d2ca2807143d3e3b29e6f490748f05c8f Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 10:17:03 +0200 Subject: [PATCH 07/19] Updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ddf52bc..970e6ee1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Nedenfor ses dato for release og beskrivelse af opgaver som er implementeret. ## [Under udvikling] +* Tilføjede mulighed for ændring af ejerskab på node [PR-421](https://github.com/itk-dev/os2forms_selvbetjening/pull/421). * Tilføjede apostrof-regel til kodestandarder [PR-414](https://github.com/itk-dev/os2forms_selvbetjening/pull/414) * Tilføjede maestro bycontentfunction validation [PR-413](https://github.com/itk-dev/os2forms_selvbetjening/pull/413). From 51177a7121ed8374877cfa77e90fced8ebe67603 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 10:25:27 +0200 Subject: [PATCH 08/19] Coding standards --- .../views/field/AuthorAssignmentNodeBulkFormOverride.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 7d2e45e1..8019a897 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -73,8 +73,9 @@ public function __construct( /** * {@inheritdoc} */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self { - return new static( + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static { + /** @var static */ + return new self( $container->get('permissions_by_term.access_storage'), $configuration, $plugin_id, From 1542456e4ad3dd1f87e836dee55a701452e10e37 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 10:33:02 +0200 Subject: [PATCH 09/19] Cleaned up --- .../AuthorAssignmentNodeBulkFormOverride.php | 26 +++---------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 8019a897..5e6bf001 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -20,14 +20,6 @@ */ class AuthorAssignmentNodeBulkFormOverride extends AuthorAssignmentEntityBulkForm { - /** - * The current user. - * - * @var \Drupal\Core\Session\AccountProxyInterface - */ - protected AccountProxyInterface $currentUser; - - /** * The entity type manager. * @@ -35,13 +27,6 @@ class AuthorAssignmentNodeBulkFormOverride extends AuthorAssignmentEntityBulkFor */ protected $entityTypeManager; - /** - * Permissions by term access storage. - * - * @var \Drupal\permissions_by_term\Service\AccessStorage - */ - protected AccessStorage $accessStorage; - /** * The current language code. * @@ -53,21 +38,18 @@ class AuthorAssignmentNodeBulkFormOverride extends AuthorAssignmentEntityBulkFor * Constructs a new AuthorAssignmentNodeBulkFormOverride instance. */ public function __construct( - AccessStorage $access_storage, + private readonly AccessStorage $accessStorage, array $configuration, $plugin_id, $plugin_definition, - EntityTypeManagerInterface $entity_type_manager, + EntityTypeManagerInterface $entityTypeManager, LanguageManagerInterface $language_manager, MessengerInterface $messenger, EntityRepositoryInterface $entity_repository, - AccountProxyInterface $current_user, + private readonly AccountProxyInterface $currentUser, ) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $language_manager, $messenger, $entity_repository); - $this->accessStorage = $access_storage; - $this->entityTypeManager = $entity_type_manager; + parent::__construct($configuration, $plugin_id, $plugin_definition, $entityTypeManager, $language_manager, $messenger, $entity_repository); $this->langcode = $language_manager->getCurrentLanguage()->getId(); - $this->currentUser = $current_user; } /** From 947e1e67731f75ddf261a8d72c623d75d066db4b Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 15:00:47 +0200 Subject: [PATCH 10/19] Added validation --- .../AuthorAssignmentNodeBulkFormOverride.php | 57 ++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 5e6bf001..39e0c0f4 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -9,6 +9,7 @@ use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\author_bulk_assignment\Plugin\views\field\AuthorAssignmentEntityBulkForm; +use Drupal\Core\TempStore\PrivateTempStoreFactory; use Drupal\permissions_by_term\Service\AccessStorage; use Drupal\user\Entity\User; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -79,9 +80,9 @@ public static function create(ContainerInterface $container, array $configuratio * has no permissions. */ private function getUserTerms(): array { - $current_user = User::load($this->currentUser->id()); + $currentUser = User::load($this->currentUser->id()); - return $this->accessStorage->getPermittedTids($current_user->id(), $current_user->getRoles()); + return $this->accessStorage->getPermittedTids($currentUser->id(), $currentUser->getRoles()); } /** @@ -113,6 +114,19 @@ private function getUsersByTermId(array $userTermsIds): array { return $users; } + private function filterUsersByWebformAccess(array $users, array $terms): array { + $mergedTerms = array_values($terms); + $mergedTerms = !empty($mergedTerms) ? (is_array($mergedTerms[0]) ? array_merge(...$mergedTerms) : $mergedTerms) : []; + + return array_filter($users, function($userName, $userId) use ($mergedTerms) { + $user = User::load($userId); + $userTermsIds = $this->accessStorage->getPermittedTids($user->id(), $user->getRoles()); + + // Check if all terms from $mergedTerms exist in $userTermsIds + return empty($mergedTerms) || count(array_intersect($userTermsIds, $mergedTerms)) === count($mergedTerms); + }, ARRAY_FILTER_USE_BOTH); + } + /** * {@inheritdoc} */ @@ -121,10 +135,49 @@ public function viewsForm(&$form, FormStateInterface $form_state): void { $form['header']['node_bulk_form']['assignee_uid']['#type'] = 'select'; $form['header']['node_bulk_form']['assignee_uid']['#chosen'] = TRUE; + $form['header']['node_bulk_form']['action']['#options']['node_author_bulk_assignment_action'] = $this->t('Change ownership'); $userTermsIds = $this->getUserTerms(); $users = $this->getUsersByTermId($userTermsIds); + $form_state->set('users', $users); + $form['header']['node_bulk_form']['assignee_uid']['#options'] = $users; } + /** + * {@inheritDoc} + */ + public function viewsFormValidate(&$form, FormStateInterface $form_state): void { + parent::viewsFormValidate($form, $form_state); + + $users = $form_state->get('users'); + $user_input = $form_state->getUserInput(); + $selected = array_filter($user_input[$this->options['id']]); + $webformPermissionsByTermArray = []; + + foreach ($selected as $bulk_form_key) { + $entity = $this->loadEntityFromBulkFormKey($bulk_form_key); + $webform_field = $entity->get('webform'); + $webform = $webform_field->entity; + + if ($webform) { + $webformPermissionsByTerm = $webform->getThirdPartySetting('os2forms_permissions_by_term', 'settings'); + // Flatten, disregard duplicates, add results to the main array. + $webformPermissionsByTermArray = array_values(array_unique(array_merge( + $webformPermissionsByTermArray, + array_filter($webformPermissionsByTerm, fn($v, $k) => $v == $k, ARRAY_FILTER_USE_BOTH) + ))); + } + else { + $form_state->setErrorByName('AuthorAssignmentNodeBulkFormError', $this->t('One or more of the selected nodes does not have a webform connected to it.')); + } + } + + $filteredUsers = $this->filterUsersByWebformAccess($users, $webformPermissionsByTermArray); + $selectedAssignee = $form_state->getValue('assignee_uid'); + + if (!isset($filteredUsers[$selectedAssignee]) && $selectedAssignee != 0) { + $form_state->setErrorByName('AuthorAssignmentNodeBulkFormError', $this->t('The selected user does not have access to one or more of the selected webforms.')); + } +} } From 19e85c2262d2952bd5d13ba4d691f5876237b43a Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 15:20:30 +0200 Subject: [PATCH 11/19] Exported config --- ...ancedqueue_queue.os2forms_queued_email.yml | 22 ------------------- .../sync/author_bulk_assignment.settings.yml | 2 ++ config/sync/chosen.settings.yml | 20 +++++++++++++++++ config/sync/core.extension.yml | 4 +++- config/sync/language/en/chosen.settings.yml | 3 +++ ...ion.node_author_bulk_assignment_action.yml | 12 ++++++++++ config/sync/user.role.site_admin.yml | 2 ++ 7 files changed, 42 insertions(+), 23 deletions(-) delete mode 100644 config/sync/advancedqueue.advancedqueue_queue.os2forms_queued_email.yml create mode 100644 config/sync/author_bulk_assignment.settings.yml create mode 100644 config/sync/chosen.settings.yml create mode 100644 config/sync/language/en/chosen.settings.yml create mode 100644 config/sync/system.action.node_author_bulk_assignment_action.yml diff --git a/config/sync/advancedqueue.advancedqueue_queue.os2forms_queued_email.yml b/config/sync/advancedqueue.advancedqueue_queue.os2forms_queued_email.yml deleted file mode 100644 index ac69f369..00000000 --- a/config/sync/advancedqueue.advancedqueue_queue.os2forms_queued_email.yml +++ /dev/null @@ -1,22 +0,0 @@ -uuid: ba4856c1-a666-4cd0-a506-1fa08bb66cd4 -langcode: da -status: true -dependencies: - enforced: - module: - - os2forms_queued_email -_core: - default_config_hash: N9qjjFEXcXH9WSKJH1J8zJ0v5TnB5KfvwBM_LY_Fd90 -id: os2forms_queued_email -label: 'OS2forms queued e-mail' -backend: database -backend_configuration: - lease_time: 300 -processor: daemon -processing_time: 280 -threshold: - type: 0 - limit: 0 - state: all -locked: false -stop_when_empty: true diff --git a/config/sync/author_bulk_assignment.settings.yml b/config/sync/author_bulk_assignment.settings.yml new file mode 100644 index 00000000..f9960ad5 --- /dev/null +++ b/config/sync/author_bulk_assignment.settings.yml @@ -0,0 +1,2 @@ +types: + - node diff --git a/config/sync/chosen.settings.yml b/config/sync/chosen.settings.yml new file mode 100644 index 00000000..e0ddf122 --- /dev/null +++ b/config/sync/chosen.settings.yml @@ -0,0 +1,20 @@ +_core: + default_config_hash: zDwqaWPY76K_8TgX6aS789W7nZIEg7lU9MJsoh61bAU +langcode: da +minimum_single: 20 +minimum_multiple: 20 +disable_search_threshold: 0 +minimum_width: 0 +max_shown_results: null +use_relative_width: false +jquery_selector: 'select:visible' +search_contains: false +disable_search: false +allow_single_deselect: false +allow_mobile: false +add_helper_buttons: false +disabled_themes: { } +chosen_include: 2 +placeholder_text_multiple: 'Choose some options' +placeholder_text_single: 'Choose an option' +no_results_text: 'No results match' diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 79d16c94..f75d5b0f 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -5,12 +5,15 @@ module: admin_toolbar: 0 admin_toolbar_tools: 0 advancedqueue: 0 + author_bulk_assignment: 0 automated_cron: 0 beskedfordeler: 0 big_pipe: 0 block: 0 block_content: 0 breakpoint: 0 + chosen: 0 + chosen_lib: 0 ckeditor: 0 ckeditor5: 0 clamav: 0 @@ -95,7 +98,6 @@ module: os2forms_payment: 0 os2forms_permission_alterations: 0 os2forms_permissions_by_term: 0 - os2forms_queued_email: 0 os2forms_rest_api: 0 os2forms_sbsys: 0 os2forms_selvbetjening: 0 diff --git a/config/sync/language/en/chosen.settings.yml b/config/sync/language/en/chosen.settings.yml new file mode 100644 index 00000000..4caab3a3 --- /dev/null +++ b/config/sync/language/en/chosen.settings.yml @@ -0,0 +1,3 @@ +placeholder_text_multiple: 'Choose some options' +placeholder_text_single: 'Choose an option' +no_results_text: 'No results match' diff --git a/config/sync/system.action.node_author_bulk_assignment_action.yml b/config/sync/system.action.node_author_bulk_assignment_action.yml new file mode 100644 index 00000000..b8023ea5 --- /dev/null +++ b/config/sync/system.action.node_author_bulk_assignment_action.yml @@ -0,0 +1,12 @@ +uuid: d851dc6b-d59c-48f1-a4f0-9eb8ab62d01b +langcode: da +status: true +dependencies: + module: + - author_bulk_assignment + - node +id: node_author_bulk_assignment_action +label: 'Assign bulk indholdselement to author' +type: node +plugin: 'entity:author_bulk_assignment_action:node' +configuration: { } diff --git a/config/sync/user.role.site_admin.yml b/config/sync/user.role.site_admin.yml index e9e69864..d285f0d7 100644 --- a/config/sync/user.role.site_admin.yml +++ b/config/sync/user.role.site_admin.yml @@ -8,6 +8,7 @@ dependencies: - node.type.webform - workflows.workflow.udgivelse_af_forlob_og_webformularer module: + - author_bulk_assignment - block_content - content_moderation - contextual @@ -68,6 +69,7 @@ permissions: - 'administer webform revisions' - 'administer webform submission' - 'administer webform templates' + - 'assign author to selected content' - 'bypass entity print access' - 'bypass honeypot protection' - 'can be workflow participant' From 6fd4ebe1524f4a7f4087039cbbc5ab3d6a7f6416 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Fri, 9 May 2025 15:23:52 +0200 Subject: [PATCH 12/19] Added missing doc comment --- .../field/AuthorAssignmentNodeBulkFormOverride.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 39e0c0f4..d73a57bc 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -114,6 +114,19 @@ private function getUsersByTermId(array $userTermsIds): array { return $users; } + /** + * Filters users by their access to webform terms. + * + * + * @param array $users + * An associative array of users where the key is the user ID and + * the value is the username. + * @param array $terms + * An array of terms or term groups defining access requirements. + * + * @return array + * A filtered list of users who have access to the given terms. + */ private function filterUsersByWebformAccess(array $users, array $terms): array { $mergedTerms = array_values($terms); $mergedTerms = !empty($mergedTerms) ? (is_array($mergedTerms[0]) ? array_merge(...$mergedTerms) : $mergedTerms) : []; From 1210a9f7a6156368c75b47377d7b7ed1aae54058 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 07:45:41 +0200 Subject: [PATCH 13/19] Coding standards --- .../views/field/AuthorAssignmentNodeBulkFormOverride.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index d73a57bc..45a1e61a 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -9,7 +9,6 @@ use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\author_bulk_assignment\Plugin\views\field\AuthorAssignmentEntityBulkForm; -use Drupal\Core\TempStore\PrivateTempStoreFactory; use Drupal\permissions_by_term\Service\AccessStorage; use Drupal\user\Entity\User; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -117,7 +116,6 @@ private function getUsersByTermId(array $userTermsIds): array { /** * Filters users by their access to webform terms. * - * * @param array $users * An associative array of users where the key is the user ID and * the value is the username. @@ -131,11 +129,11 @@ private function filterUsersByWebformAccess(array $users, array $terms): array { $mergedTerms = array_values($terms); $mergedTerms = !empty($mergedTerms) ? (is_array($mergedTerms[0]) ? array_merge(...$mergedTerms) : $mergedTerms) : []; - return array_filter($users, function($userName, $userId) use ($mergedTerms) { + return array_filter($users, function ($userName, $userId) use ($mergedTerms) { $user = User::load($userId); $userTermsIds = $this->accessStorage->getPermittedTids($user->id(), $user->getRoles()); - // Check if all terms from $mergedTerms exist in $userTermsIds + // Check if all terms from $mergedTerms exist in $userTermsIds. return empty($mergedTerms) || count(array_intersect($userTermsIds, $mergedTerms)) === count($mergedTerms); }, ARRAY_FILTER_USE_BOTH); } @@ -192,5 +190,6 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void if (!isset($filteredUsers[$selectedAssignee]) && $selectedAssignee != 0) { $form_state->setErrorByName('AuthorAssignmentNodeBulkFormError', $this->t('The selected user does not have access to one or more of the selected webforms.')); } -} + } + } From aaa7ecc308c9d3787f1c08fa9b0798cf5433ae76 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 08:20:42 +0200 Subject: [PATCH 14/19] Coding standards --- .../AuthorAssignmentNodeBulkFormOverride.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 45a1e61a..4a22bfd9 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -9,8 +9,10 @@ use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\author_bulk_assignment\Plugin\views\field\AuthorAssignmentEntityBulkForm; +use Drupal\node\NodeInterface; use Drupal\permissions_by_term\Service\AccessStorage; use Drupal\user\Entity\User; +use Drupal\webform\Entity\Webform; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -156,7 +158,13 @@ public function viewsForm(&$form, FormStateInterface $form_state): void { } /** - * {@inheritDoc} + * Validates the bulk form submission for assigning nodes. + * + * @param array &$form + * An associative array containing the structure of the form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + * */ public function viewsFormValidate(&$form, FormStateInterface $form_state): void { parent::viewsFormValidate($form, $form_state); @@ -167,11 +175,13 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void $webformPermissionsByTermArray = []; foreach ($selected as $bulk_form_key) { + $webform = NULL; $entity = $this->loadEntityFromBulkFormKey($bulk_form_key); - $webform_field = $entity->get('webform'); - $webform = $webform_field->entity; + if ($entity instanceof NodeInterface && $entity->hasField('webform')) { + $webform = $entity->get('webform')->entity; + } - if ($webform) { + if ($webform instanceof Webform) { $webformPermissionsByTerm = $webform->getThirdPartySetting('os2forms_permissions_by_term', 'settings'); // Flatten, disregard duplicates, add results to the main array. $webformPermissionsByTermArray = array_values(array_unique(array_merge( From 887f19e4ccf292f0f6a1f46bdc326a5c649d3cb6 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 08:21:42 +0200 Subject: [PATCH 15/19] Coding standards --- .../Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 4a22bfd9..1e4ef03a 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -164,7 +164,6 @@ public function viewsForm(&$form, FormStateInterface $form_state): void { * An associative array containing the structure of the form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. - * */ public function viewsFormValidate(&$form, FormStateInterface $form_state): void { parent::viewsFormValidate($form, $form_state); From 2b35f3e79179432a4d3d526be661cad5efb85347 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 09:11:49 +0200 Subject: [PATCH 16/19] Simplfied complex action through extraction --- .../AuthorAssignmentNodeBulkFormOverride.php | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 1e4ef03a..eec5c244 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -182,11 +182,11 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void if ($webform instanceof Webform) { $webformPermissionsByTerm = $webform->getThirdPartySetting('os2forms_permissions_by_term', 'settings'); - // Flatten, disregard duplicates, add results to the main array. - $webformPermissionsByTermArray = array_values(array_unique(array_merge( + $webformPermissionsByTermArray = $this->mergeUniquePermissions( $webformPermissionsByTermArray, - array_filter($webformPermissionsByTerm, fn($v, $k) => $v == $k, ARRAY_FILTER_USE_BOTH) - ))); + $webformPermissionsByTerm + ); + } else { $form_state->setErrorByName('AuthorAssignmentNodeBulkFormError', $this->t('One or more of the selected nodes does not have a webform connected to it.')); @@ -201,4 +201,27 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void } } + /** + * Merges unique permissions into the existing permissions array. + * + * @param array $existingPermissions + * The current permissions array. + * @param array $newPermissions + * Permissions to merge. + * + * @return array + * The merged and filtered permissions array + */ + private function mergeUniquePermissions(array $existingPermissions, array $newPermissions): array { + $uniquePermissions = array_filter( + $newPermissions, + fn($value, $key) => $value == $key, + ARRAY_FILTER_USE_BOTH + ); + + return array_values(array_unique( + array_merge($existingPermissions, $uniquePermissions) + )); + } + } From fdad45674f4bb509bf262ba9c88c915a6b0c836b Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 09:14:25 +0200 Subject: [PATCH 17/19] Renamed method --- .../views/field/AuthorAssignmentNodeBulkFormOverride.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index eec5c244..97a02d1f 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -182,7 +182,7 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void if ($webform instanceof Webform) { $webformPermissionsByTerm = $webform->getThirdPartySetting('os2forms_permissions_by_term', 'settings'); - $webformPermissionsByTermArray = $this->mergeUniquePermissions( + $webformPermissionsByTermArray = $this->addUniquePermissions( $webformPermissionsByTermArray, $webformPermissionsByTerm ); @@ -202,7 +202,7 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void } /** - * Merges unique permissions into the existing permissions array. + * Adds unique permissions into the existing permissions array and disregards duplicates. * * @param array $existingPermissions * The current permissions array. @@ -212,7 +212,7 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void * @return array * The merged and filtered permissions array */ - private function mergeUniquePermissions(array $existingPermissions, array $newPermissions): array { + private function addUniquePermissions(array $existingPermissions, array $newPermissions): array { $uniquePermissions = array_filter( $newPermissions, fn($value, $key) => $value == $key, From 3db542c9e629e56c13f676d84115e047eeb81732 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 09:16:34 +0200 Subject: [PATCH 18/19] Coding standards --- .../views/field/AuthorAssignmentNodeBulkFormOverride.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 97a02d1f..50584813 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -202,7 +202,8 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void } /** - * Adds unique permissions into the existing permissions array and disregards duplicates. + * Adds unique permissions into the existing permissions array + * and disregards duplicates. * * @param array $existingPermissions * The current permissions array. From 8ed4f21647fb492621884290b7f1e1af8d7b9829 Mon Sep 17 00:00:00 2001 From: Jeppe Krogh Date: Mon, 12 May 2025 09:29:56 +0200 Subject: [PATCH 19/19] Coding standards --- .../views/field/AuthorAssignmentNodeBulkFormOverride.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php index 50584813..eb54414b 100644 --- a/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php +++ b/web/modules/custom/os2forms_selvbetjening/src/Plugin/views/field/AuthorAssignmentNodeBulkFormOverride.php @@ -202,8 +202,7 @@ public function viewsFormValidate(&$form, FormStateInterface $form_state): void } /** - * Adds unique permissions into the existing permissions array - * and disregards duplicates. + * Adds unique permissions into the existing permissions array. * * @param array $existingPermissions * The current permissions array.