From 887be85b5590f55d8d216168dadc8eb91517e5b4 Mon Sep 17 00:00:00 2001
From: Marcin Grabias <mgrabias@ogtrading.eu>
Date: Thu, 1 May 2025 13:27:18 +0200
Subject: [PATCH] Conditionally hide the roles selector; unset roles if hidden
 selector value leaks.

---
 src/Hook/CourseMembershipHooksBase.php | 15 +++++++++------
 src/Hook/LmsCourseMembershipHooks.php  |  4 ++--
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/Hook/CourseMembershipHooksBase.php b/src/Hook/CourseMembershipHooksBase.php
index 750ff10..790e01f 100644
--- a/src/Hook/CourseMembershipHooksBase.php
+++ b/src/Hook/CourseMembershipHooksBase.php
@@ -42,17 +42,12 @@ abstract class CourseMembershipHooksBase {
       return;
     }
 
-    // Roles selected - don't do anything.
-    $roles = $form_state->getValue('group_roles');
-    if (\is_array($roles) && \count(\array_filter($roles)) > 0) {
-      return;
-    }
-
     $class_id = (string) $form_state->getValue('class');
     if ($class_id === '' || $class_id === '0') {
       return;
     }
 
+    $form_state->setValue('group_roles', []);
     $user_id = $form_state->getValue(['entity_id', '0', 'target_id']);
     $potential_member = $this->entityTypeManager->getStorage('user')->load($user_id);
     if ($course->isClassMember($potential_member)) {
@@ -89,6 +84,14 @@ abstract class CourseMembershipHooksBase {
       '#description' => $self_join ? $this->t('You will be added to the selected class.') : $this->t('Student will be added to the selected class.'),
       '#options' => $options,
     ];
+
+    if (\array_key_exists('group_roles', $form)) {
+      $form['group_roles']['#states'] = [
+        'visible' => [
+          'select[name=class]' => ['value' => '0'],
+        ],
+      ];
+    }
   }
 
   /**
diff --git a/src/Hook/LmsCourseMembershipHooks.php b/src/Hook/LmsCourseMembershipHooks.php
index 62e956d..2ed04f1 100644
--- a/src/Hook/LmsCourseMembershipHooks.php
+++ b/src/Hook/LmsCourseMembershipHooks.php
@@ -55,10 +55,10 @@ final class LmsCourseMembershipHooks extends CourseMembershipHooksBase {
     if ($self_join) {
       $form['actions']['submit']['#value'] = $this->t('Join training');
     }
-    $form['#validate'][] = [
+    \array_unshift($form['#validate'], [
       $this,
       'membershipFormValidate',
-    ];
+    ]);
 
     $this->addClassSelector($form, $course, $self_join);
 
-- 
GitLab