You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
8.6 KiB
266 lines
8.6 KiB
2 years ago
|
// This file is part of Moodle - http://moodle.org/
|
||
|
//
|
||
|
// Moodle is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License as published by
|
||
|
// the Free Software Foundation, either version 3 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
//
|
||
|
// Moodle is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU General Public License
|
||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
/**
|
||
|
* Client-side JavaScript for group management interface.
|
||
|
* @copyright vy-shane AT moodle.com
|
||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
|
* @package core_group
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Class UpdatableGroupsCombo
|
||
|
*/
|
||
|
function UpdatableGroupsCombo(wwwRoot, courseId) {
|
||
|
this.wwwRoot = wwwRoot;
|
||
|
this.courseId = courseId;
|
||
|
|
||
|
this.connectCallback = {
|
||
|
|
||
|
success: function(o) {
|
||
|
if (o.responseText !== undefined) {
|
||
|
var groupsComboEl = document.getElementById("groups");
|
||
|
var membersComboEl = document.getElementById("members");
|
||
|
if (membersComboEl) {
|
||
|
// Clear the members list box.
|
||
|
while (membersComboEl.firstChild) {
|
||
|
membersComboEl.removeChild(membersComboEl.firstChild);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (groupsComboEl && o.responseText) {
|
||
|
var groups = eval("("+o.responseText+")");
|
||
|
|
||
|
// Populate the groups list box.
|
||
|
for (var i=0; i<groups.length; i++) {
|
||
|
var optionEl = document.createElement("option");
|
||
|
optionEl.setAttribute("value", groups[i].id);
|
||
|
optionEl.title = groups[i].name;
|
||
|
optionEl.innerHTML = groups[i].name;
|
||
|
groupsComboEl.appendChild(optionEl);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Remove the loader gif image.
|
||
|
removeLoaderImgs("groupsloader", "groupslabel");
|
||
|
},
|
||
|
|
||
|
failure: function(o) {
|
||
|
removeLoaderImgs("membersloader", "memberslabel");
|
||
|
this.currentTransId = null;
|
||
|
}
|
||
|
|
||
|
};
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Class UpdatableMembersCombo
|
||
|
*/
|
||
|
function UpdatableMembersCombo(wwwRoot, courseId) {
|
||
|
this.wwwRoot = wwwRoot;
|
||
|
this.courseId = courseId;
|
||
|
|
||
|
this.connectCallback = {
|
||
|
success: function(t, o) {
|
||
|
|
||
|
if (o.responseText !== undefined) {
|
||
|
var selectEl = document.getElementById("members");
|
||
|
if (selectEl && o.responseText) {
|
||
|
var roles = eval("("+o.responseText+")");
|
||
|
|
||
|
// Clear the members list box.
|
||
|
if (selectEl) {
|
||
|
while (selectEl.firstChild) {
|
||
|
selectEl.removeChild(selectEl.firstChild);
|
||
|
}
|
||
|
}
|
||
|
// Populate the members list box.
|
||
|
for (var i=0; i<roles.length; i++) {
|
||
|
var optgroupEl = document.createElement("optgroup");
|
||
|
optgroupEl.setAttribute("label",roles[i].name);
|
||
|
|
||
|
for(var j=0; j<roles[i].users.length; j++) {
|
||
|
var optionEl = document.createElement("option");
|
||
|
optionEl.setAttribute("value", roles[i].users[j].id);
|
||
|
optionEl.title = roles[i].users[j].name;
|
||
|
optionEl.innerHTML = roles[i].users[j].name;
|
||
|
optgroupEl.appendChild(optionEl);
|
||
|
}
|
||
|
selectEl.appendChild(optgroupEl);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Remove the loader gif image.
|
||
|
removeLoaderImgs("membersloader", "memberslabel");
|
||
|
},
|
||
|
|
||
|
failure: function() {
|
||
|
removeLoaderImgs("membersloader", "memberslabel");
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
// Hide the updatemembers input since AJAX will take care of this.
|
||
|
var updatemembers = Y.one('#updatemembers');
|
||
|
if (updatemembers) {
|
||
|
updatemembers.hide();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* When a group is selected, we need to update the members.
|
||
|
* The Add/Remove Users button also needs to be disabled/enabled
|
||
|
* depending on whether or not a group is selected
|
||
|
*/
|
||
|
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 spanEl = document.getElementById("thegroup");
|
||
|
if (singleSelection) {
|
||
|
spanEl.innerHTML = selectEl.options[selectEl.selectedIndex].title;
|
||
|
} else {
|
||
|
spanEl.innerHTML = ' ';
|
||
|
}
|
||
|
|
||
|
// Clear the members list box.
|
||
|
selectEl = document.getElementById("members");
|
||
|
if (selectEl) {
|
||
|
while (selectEl.firstChild) {
|
||
|
selectEl.removeChild(selectEl.firstChild);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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";
|
||
|
var self = this;
|
||
|
YUI().use('io', function (Y) {
|
||
|
Y.io(sUrl, {
|
||
|
method: 'GET',
|
||
|
context: this,
|
||
|
on: self.connectCallback
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
var createLoaderImg = function (elClass, parentId, wwwRoot) {
|
||
|
var parentEl = document.getElementById(parentId);
|
||
|
if (!parentEl) {
|
||
|
return false;
|
||
|
}
|
||
|
if (document.getElementById("loaderImg")) {
|
||
|
// A loader image already exists.
|
||
|
return false;
|
||
|
}
|
||
|
var loadingImg = document.createElement("img");
|
||
|
|
||
|
loadingImg.setAttribute("src", M.util.image_url('/i/ajaxloader', 'moodle'));
|
||
|
loadingImg.setAttribute("class", elClass);
|
||
|
loadingImg.setAttribute("alt", "Loading");
|
||
|
loadingImg.setAttribute("id", "loaderImg");
|
||
|
parentEl.appendChild(loadingImg);
|
||
|
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
|
||
|
var removeLoaderImgs = function (elClass, parentId) {
|
||
|
var parentEl = document.getElementById(parentId);
|
||
|
if (parentEl) {
|
||
|
var loader = document.getElementById("loaderImg");
|
||
|
if (loader) {
|
||
|
parentEl.removeChild(loader);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Updates the current groups information shown about a user when a user is selected.
|
||
|
*
|
||
|
* @global {Array} userSummaries
|
||
|
* userSummaries is added to the page via /user/selector/lib.php - group_non_members_selector::print_user_summaries()
|
||
|
* as a global that can be used by this function.
|
||
|
*/
|
||
|
function updateUserSummary() {
|
||
|
var selectEl = document.getElementById('addselect'),
|
||
|
summaryDiv = document.getElementById('group-usersummary'),
|
||
|
length = selectEl.length,
|
||
|
selectCnt = 0,
|
||
|
selectIdx = -1,
|
||
|
i;
|
||
|
|
||
|
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(Y) {
|
||
|
var add = Y.one('#add');
|
||
|
var addselect = M.core_user.get_user_selector('addselect');
|
||
|
add.set('disabled', addselect.is_selection_empty());
|
||
|
addselect.on('user_selector:selectionchanged', function(isempty) {
|
||
|
add.set('disabled', isempty);
|
||
|
});
|
||
|
|
||
|
var remove = Y.one('#remove');
|
||
|
var removeselect = M.core_user.get_user_selector('removeselect');
|
||
|
remove.set('disabled', removeselect.is_selection_empty());
|
||
|
removeselect.on('user_selector:selectionchanged', function(isempty) {
|
||
|
remove.set('disabled', isempty);
|
||
|
});
|
||
|
|
||
|
addselect = document.getElementById('addselect');
|
||
|
addselect.onchange = updateUserSummary;
|
||
|
}
|