From 80b534abe5ac807f9bea3d44aadf8e0e1943db1e Mon Sep 17 00:00:00 2001
From: Sam Wilson <sam@samwilson.id.au>
Date: Thu, 16 Jun 2016 13:40:13 +0100
Subject: [PATCH] MDL-29774 Update the Ajax user selector to also return users'
 group-membership summaries.

---
 user/selector/lib.php    | 22 ++++++++++++++++++----
 user/selector/module.js  |  5 +++++
 user/selector/search.php | 13 ++++++++++---
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/user/selector/lib.php b/user/selector/lib.php
index 8812d93..975799d 100644
--- a/user/selector/lib.php
+++ b/user/selector/lib.php
@@ -799,12 +799,27 @@ class group_non_members_selector extends groups_user_selector_base {
      *
      * Used by /group/clientlib.js
      *
-     * @global moodle_database $DB
      * @global moodle_page $PAGE
      * @param int $courseid
      */
     public function print_user_summaries($courseid) {
-        global $DB, $PAGE;
+        global $PAGE;
+        $usersummaries = $this->get_user_summaries($courseid);
+        $PAGE->requires->data_for_js('userSummaries', $usersummaries);
+    }
+
+    /**
+     * Construct HTML lists of group-memberships of the current set of users.
+     *
+     * Used in user/selector/search.php to repopulate the userSummaries JS global
+     * that is created in self::print_user_summaries() above.
+     *
+     * @global moodle_database $DB
+     * @param int $courseid The course
+     * @return string[] Array of HTML lists of groups.
+     */
+    public function get_user_summaries($courseid) {
+        global $DB;
 
         $usersummaries = array();
 
@@ -838,8 +853,7 @@ class group_non_members_selector extends groups_user_selector_base {
                 $usersummaries[] = $usergrouplist;
             }
         }
-
-        $PAGE->requires->data_for_js('userSummaries', $usersummaries);
+        return $usersummaries;
     }
 
     /**
diff --git a/user/selector/module.js b/user/selector/module.js
index 6f6d4e3..9a2a78b 100644
--- a/user/selector/module.js
+++ b/user/selector/module.js
@@ -179,6 +179,11 @@ M.core_user.init_user_selector = function (Y, name, hash, extrafields, lastsearc
                     return new M.core.ajaxException(data);
                 }
                 this.output_options(data);
+                // If updated userSummaries are present, overwrite the global variable
+                // that's output by group_non_members_selector::print_user_summaries() in user/selector/lib.php
+                if (typeof data.userSummaries !== "undefined") {
+                    userSummaries = data.userSummaries;
+                }
             } catch (e) {
                 this.listbox.setStyle('background','');
                 this.searchfield.addClass('error');
diff --git a/user/selector/search.php b/user/selector/search.php
index 9125d0b..726c4bb 100644
--- a/user/selector/search.php
+++ b/user/selector/search.php
@@ -61,7 +61,7 @@ $userselector = new $classname($name, $options);
 
 // Do the search and output the results.
 $results = $userselector->find_users($search);
-$json = array();
+$jsonresults = array();
 foreach ($results as $groupname => $users) {
     $groupdata = array('name' => $groupname, 'users' => array());
     foreach ($users as $user) {
@@ -76,7 +76,14 @@ foreach ($results as $groupname => $users) {
         }
         $groupdata['users'][] = $output;
     }
-    $json[] = $groupdata;
+    $jsonresults[] = $groupdata;
 }
 
-echo json_encode(array('results' => $json));
+$json = array('results' => $jsonresults);
+
+// Also add users' group membership summaries, if possible.
+if (is_callable(array($userselector, 'get_user_summaries'))) {
+    $json['userSummaries'] = $userselector->get_user_summaries($options['courseid']);
+}
+
+echo json_encode($json);
-- 
2.5.0

