]> git.mjollnir.org Git - moodle.git/commitdiff
group MDL-20005 added display of other groups users are in
authorAndrew Davis <andrew@affinitysoftware.net>
Mon, 21 Dec 2009 08:13:50 +0000 (08:13 +0000)
committerAndrew Davis <andrew@affinitysoftware.net>
Mon, 21 Dec 2009 08:13:50 +0000 (08:13 +0000)
group/clientlib.js
group/members.php
user/selector/lib.php

index 2ab972424f078826364630c6d11a4c0455471ca2..e1d61c7d9205388edc92a8033951c31cb306bbbe 100644 (file)
@@ -202,6 +202,29 @@ var removeLoaderImgs = function (elClass, parentId) {
     }
 };
 
+function updateUserSummary() {
+     var selectEl = document.getElementById('addselect');
+     var summaryDiv = document.getElementById('group-usersummary');
+     var length = selectEl.length;
+     var selectCnt = 0;
+     var selectIdx = -1;
+
+     for(i=0;i<length;i++) {
+         if (selectEl.options[i].selected) {
+                 selectCnt++;
+             selectIdx = i;
+         }
+     }
+
+     if (selectCnt == 1 && userSummaries[selectIdx]) {
+         summaryDiv.innerHTML = userSummaries[selectIdx];
+     } else {
+         summaryDiv.innerHTML = '';
+     }
+
+     return(true);
+}
+
 function init_add_remove_members_page() {
     var addselect = user_selector.get('addselect');
     document.getElementById('add').disabled = addselect.is_selection_empty();
@@ -214,4 +237,7 @@ function init_add_remove_members_page() {
     removeselect.subscribe('selectionchanged', function(isempty) {
         document.getElementById('remove').disabled = isempty;
     });
+
+    addselect = document.getElementById('addselect');
+    addselect.onchange = updateUserSummary;
 }
\ No newline at end of file
index 1564460aab4eb036efadc7aab65626bba77468c1..8fdec28389e8a39f19ee3bcc81835a624d84c997 100644 (file)
@@ -116,6 +116,10 @@ echo $OUTPUT->header();
           </p>
           <?php $potentialmembersselector->display(); ?>
       </td>
+      <td>
+        <p><?php echo($strusergroupmembership) ?></p>
+        <div id="group-usersummary"></div>
+      </td>
     </tr>
     <tr><td colspan="3" id='backcell'>
         <input type="submit" name="cancel" value="<?php print_string('backtogroups', 'group'); ?>" />
@@ -126,6 +130,9 @@ echo $OUTPUT->header();
 </div>
 
 <?php
+    //outputs the JS array used to display the other groups users are in
+    $potentialmembersselector->print_user_summaries($course->id);
+
     //this must be after calling display() on the selectors so their setup JS executes first
     $PAGE->requires->js_function_call('init_add_remove_members_page');
 
index 8b1d3b4a8130fbc07988bbe138ea13ffd53c2c3c..0bbf0ed8453dfe1bcae0969dc9af4dfc27b9f5f4 100644 (file)
@@ -718,15 +718,78 @@ class group_members_selector extends groups_user_selector_base {
 
 /**
  * User selector subclass for the list of users who are not in a certain group.
- * Used on the add group memebers page.
+ * Used on the add group members page.
  */
 class group_non_members_selector extends groups_user_selector_base {
     const MAX_USERS_PER_PAGE = 100;
 
+    /**
+     * An array of user ids populated by find_users() used in print_user_summaries()
+     */
+    private $potentialmembersids = array();
+
     public function output_user($user) {
         return parent::output_user($user) . ' (' . $user->numgroups . ')';
     }
 
+    /**
+     * Outputs a Javascript array containing the other groups non-members are in.
+     * Used on the add group members page.
+     */
+    public function print_user_summaries($courseid) {
+        global $DB;
+
+        echo <<<END
+        <script type="text/javascript">
+//<![CDATA[
+var userSummaries = Array(
+END;
+        // Get other groups user already belongs to
+        $usergroups = array();
+        $potentialmembersids = $this->potentialmembersids;
+        if( empty($potentialmembersids)==false ) {
+            list($membersidsclause, $params) = $DB->get_in_or_equal($potentialmembersids, SQL_PARAMS_NAMED, 'pm0');
+            $sql = "SELECT u.id AS userid, g.*
+                   FROM {user} u
+                   JOIN {groups_members} gm ON u.id = gm.userid
+                   JOIN {groups} g ON gm.groupid = g.id
+                  WHERE u.id $membersidsclause AND g.courseid = :courseid ";
+            $params['courseid'] = $courseid;
+            if ($rs = $DB->get_recordset_sql($sql, $params)) {
+                foreach ($rs as $usergroup) {
+                    $usergroups[$usergroup->userid][$usergroup->id] = $usergroup;
+                }
+                $rs->close();
+            }
+
+            $membercnt = count($potentialmembersids);
+            $i=1;
+            foreach ($potentialmembersids as $userid) {
+             if (isset($usergroups[$userid])) {
+                 $usergrouplist = '<ul>';
+
+                 foreach ($usergroups[$userid] as $groupitem) {
+                     $usergrouplist .= '<li>'.addslashes_js(format_string($groupitem->name)).'</li>';
+                 }
+                 $usergrouplist .= '</ul>';
+             }
+             else {
+                 $usergrouplist = '';
+             }
+             echo "'$usergrouplist'";
+             if ($i < $membercnt) {
+                 echo ', ';
+             }
+             $i++;
+            }
+        }
+echo <<<END
+);
+//]]>
+</script>
+END;
+    }
+
     public function find_users($search) {
         global $DB;
 
@@ -770,6 +833,19 @@ class group_non_members_selector extends groups_user_selector_base {
         $rs = $DB->get_recordset_sql($fields . $sql . $orderby, $params);
         $roles =  groups_calculate_role_people($rs, $context);
 
+        //don't hold onto user IDs if we're doing validation
+        if( empty($this->validatinguserids) ) {
+            if($roles) {
+                foreach($roles as $k=>$v) {
+                    if($v) {
+                        foreach($v->users as $uid=>$userobject) {
+                            $this->potentialmembersids[] = $uid;
+                        }
+                    }
+                }
+            }
+        }
+
         return $this->convert_array_format($roles, $search);
     }
 }