From: sam_marshall Date: Fri, 24 Oct 2008 13:31:49 +0000 (+0000) Subject: MDL-16756: Groups bugfixes and multiple select support for deletion X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=f6eece19f7ea8fb253026993dd6bedf5e93a817e;p=moodle.git MDL-16756: Groups bugfixes and multiple select support for deletion --- diff --git a/group/clientlib.js b/group/clientlib.js index 6f74d1cf80..f9d32af921 100644 --- a/group/clientlib.js +++ b/group/clientlib.js @@ -123,15 +123,34 @@ function UpdatableMembersCombo(wwwRoot, courseId) { * The Add/Remove Users button also needs to be disabled/enabled * depending on whether or not a group is selected */ -UpdatableMembersCombo.prototype.refreshMembers = function (groupId) { - // Add the loader gif image. - createLoaderImg("membersloader", "memberslabel", this.wwwRoot); +UpdatableMembersCombo.prototype.refreshMembers = function () { + + // Get group selector and check selection type + var selectEl = document.getElementById("groups"); + var selectionCount=0,groupId=0; + if( selectEl ) { + for (var i = 0; i < selectEl.options.length; i++) { + if(selectEl.options[i].selected) { + selectionCount++; + if(!groupId) { + groupId=selectEl.options[i].value; + } + } + } + } + var singleSelection=selectionCount == 1; + + // Add the loader gif image (we only load for single selections) + if(singleSelection) { + createLoaderImg("membersloader", "memberslabel", this.wwwRoot); + } // Update the label. - var selectEl = document.getElementById("groups"); var spanEl = document.getElementById("thegroup"); - if (selectEl && selectEl.selectedIndex >= 0) { + if (singleSelection) { spanEl.innerHTML = selectEl.options[selectEl.selectedIndex].title; + } else { + spanEl.innerHTML = ' '; } // Clear the members list box. @@ -142,11 +161,14 @@ UpdatableMembersCombo.prototype.refreshMembers = function (groupId) { } } - document.getElementById("showaddmembersform").disabled = false; - document.getElementById("showeditgroupsettingsform").disabled = false; - document.getElementById("deletegroup").disabled = false; - var sUrl = this.wwwRoot+"/group/index.php?id="+this.courseId+"&group="+groupId+"&act_ajax_getmembersingroup"; - YAHOO.util.Connect.asyncRequest("GET", sUrl, this.connectCallback, null); + document.getElementById("showaddmembersform").disabled = !singleSelection; + document.getElementById("showeditgroupsettingsform").disabled = !singleSelection; + document.getElementById("deletegroup").disabled = selectionCount == 0; + + if(singleSelection) { + var sUrl = this.wwwRoot+"/group/index.php?id="+this.courseId+"&group="+groupId+"&act_ajax_getmembersingroup"; + YAHOO.util.Connect.asyncRequest("GET", sUrl, this.connectCallback, null); + } }; diff --git a/group/delete.php b/group/delete.php new file mode 100644 index 0000000000..f06e2d8f40 --- /dev/null +++ b/group/delete.php @@ -0,0 +1,74 @@ +get_record('course', array('id' => $courseid))) { + error('Course ID was incorrect'); +} +require_login($course); +$context = get_context_instance(CONTEXT_COURSE, $course->id); +require_capability('moodle/course:managegroups', $context); + +// Make sure all groups are OK and belong to course +$groupidarray = explode(',',$groupids); +$groupnames = array(); +foreach($groupidarray as $groupid) { + if (!$group = $DB->get_record('groups', array('id' => $groupid))) { + error('Group ID was incorrect'); + } + if ($courseid != $group->courseid) { + error('Group not on required course'); + } + $groupnames[] = format_string($group->name); +} + +$returnurl='index.php?id='.$course->id; + +if(count($groupidarray)==0) { + print_error('errorselectsome','group',$returnurl); +} + +if ($confirm && data_submitted()) { + if (!confirm_sesskey() ) { + print_error('confirmsesskeybad','error',$returnurl); + } + $DB->begin_sql(); + foreach($groupidarray as $groupid) { + if (!groups_delete_group($groupid)) { + print_error('erroreditgroup', 'group', $returnurl); + } + } + $DB->commit_sql(); + redirect($returnurl); +} else { + print_header(get_string('deleteselectedgroup', 'group'), get_string('deleteselectedgroup', 'group')); + $optionsyes = array('courseid'=>$courseid, 'groups'=>$groupids, 'sesskey'=>sesskey(), 'confirm'=>1); + $optionsno = array('id'=>$courseid); + if(count($groupnames)==1) { + $message=get_string('deletegroupconfirm', 'group', $groupnames[0]); + } else { + $message=get_string('deletegroupsconfirm', 'group').''; + } + notice_yesno($message, 'delete.php', 'index.php', $optionsyes, $optionsno, 'post', 'get'); + print_footer(); +} +?> diff --git a/group/group.php b/group/group.php index 27eecbd621..9fe6753ae7 100644 --- a/group/group.php +++ b/group/group.php @@ -19,6 +19,12 @@ $id = optional_param('id', 0, PARAM_INT); $delete = optional_param('delete', 0, PARAM_BOOL); $confirm = optional_param('confirm', 0, PARAM_BOOL); +// This script used to support group delete, but that has been moved. In case +// anyone still links to it, let's redirect to the new script. +if($delete) { + redirect('delete.php?courseid='.$courseid.'&groups='.$id); +} + if ($id) { if (!$group = $DB->get_record('groups', array('id'=>$id))) { print_error('invalidgroupid'); diff --git a/group/index.php b/group/index.php index d6c4565b1f..168817470a 100644 --- a/group/index.php +++ b/group/index.php @@ -20,6 +20,20 @@ $courseid = required_param('id', PARAM_INT); $groupid = optional_param('group', false, PARAM_INT); $userid = optional_param('user', false, PARAM_INT); $action = groups_param_action(); +// Support either single group= parameter, or array groups[] +if ($groupid) { + $groupids=array($groupid); +} else { + $groupids=array(); + if (isset($_REQUEST['groups'])) { + foreach ($_REQUEST['groups'] as $groupid) { + if ($groupid = clean_param($groupid, PARAM_INT)) { + $groupids[]=$groupid; + } + } + } +} +$singlegroup=count($groupids) == 1; $returnurl = $CFG->wwwroot.'/group/index.php?id='.$courseid; @@ -39,13 +53,24 @@ if (! has_capability('moodle/course:managegroups', $context)) { redirect(); //"group.php?id=$course->id"); // Not allowed to see all groups } +// Check for multiple/no group errors +if(!$singlegroup) { + switch($action) { + case 'ajax_getmembersingroup': + case 'showgroupsettingsform': + case 'showaddmembersform': + case 'updatemembers': + print_error('errorselectone','group',$returnurl); + } +} + switch ($action) { case false: //OK, display form. break; case 'ajax_getmembersingroup': $roles = array(); - if ($groupmemberroles = groups_get_members_by_role($groupid,$courseid,'u.id,u.firstname,u.lastname')) { + if ($groupmemberroles = groups_get_members_by_role($groupids[0],$courseid,'u.id,u.firstname,u.lastname')) { foreach($groupmemberroles as $roleid=>$roledata) { $shortroledata=new StdClass; $shortroledata->name=$roledata->name; @@ -63,7 +88,11 @@ switch ($action) { die; // Client side JavaScript takes it from here. case 'deletegroup': - redirect('group.php?delete=1&courseid='.$courseid.'&id='.$groupid); + if(count($groupids)==0) { + print_error('errorselectsome','group',$returnurl); + } + $groupidlist=implode(',',$groupids); + redirect('delete.php?courseid='.$courseid.'&groups='.$groupidlist); break; case 'showcreateorphangroupform': @@ -75,7 +104,7 @@ switch ($action) { break; case 'showgroupsettingsform': - redirect('group.php?courseid='.$courseid.'&id='.$groupid); + redirect('group.php?courseid='.$courseid.'&id='.$groupids[0]); break; case 'updategroups': //Currently reloading. @@ -85,7 +114,7 @@ switch ($action) { break; case 'showaddmembersform': - redirect('members.php?group='.$groupid); + redirect('members.php?group='.$groupids[0]); break; case 'updatemembers': //Currently reloading. @@ -113,19 +142,18 @@ $currenttab = 'groups'; require('tabs.php'); $disabled = 'disabled="disabled"'; - -$showeditgroupsettingsform_disabled = $disabled; -$deletegroup_disabled = $disabled; -$showcreategroupform_disabled = $disabled; - -if (!empty($groupid)) { +if (ajaxenabled()) { + // Some buttons are enabled if single group selected + $showaddmembersform_disabled = $singlegroup ? '' : $disabled; + $showeditgroupsettingsform_disabled = $singlegroup ? '' : $disabled; + $deletegroup_disabled = count($groupids)>0 ? '' : $disabled; +} else { + // Do not disable buttons. The buttons work based on the selected group, + // which you can change without reloading the page, so it is not appropriate + // to disable them if no group is selected. $showaddmembersform_disabled = ''; $showeditgroupsettingsform_disabled = ''; $deletegroup_disabled = ''; -} else { - $deletegroup_disabled = $disabled; - $showeditgroupsettingsform_disabled = $disabled; - $showaddmembersform_disabled = $disabled; } print_heading(format_string($course->shortname) .' '.$strgroups, 'center', 3); @@ -141,30 +169,31 @@ echo "\n"; echo '

'."\n"; if (ajaxenabled()) { - $onchange = 'membersCombo.refreshMembers(this.options[this.selectedIndex].value);'; + $onchange = 'membersCombo.refreshMembers();'; } else { $onchange = ''; } - -echo ''."\n"; $groups = groups_get_all_groups($courseid); - -$sel_groupid = 0; +$selectedname = ' '; if ($groups) { // Print out the HTML foreach ($groups as $group) { $select = ''; - if ($groupid == $group->id) { - $select = ' selected="selected"'; - $sel_groupid = $group->id; - } $usercount = $DB->count_records('groups_members', array('groupid'=>$group->id)); $groupname = format_string($group->name).' ('.$usercount.')'; - + if (in_array($group->id,$groupids)) { + $select = ' selected="selected"'; + if ($singlegroup) { + // Only keep selected name if there is one group selected + $selectedname = $groupname; + } + } + echo "\n"; } } else { @@ -188,7 +217,10 @@ echo '

'."\n"; -echo '

'."\n"; + +echo '

'."\n"; //NOTE: the SELECT was, multiple="multiple" name="user[]" - not used and breaks onclick. echo '