mirror of
https://github.com/moodle/moodle.git
synced 2025-03-09 18:30:03 +01:00
342 lines
15 KiB
JavaScript
342 lines
15 KiB
JavaScript
YUI.add('moodle-enrol-quickcohortenrolment', function(Y) {
|
|
|
|
var CONTROLLERNAME = 'Quick cohort enrolment controller',
|
|
COHORTNAME = 'Cohort',
|
|
COHORTID = 'cohortid',
|
|
ENROLLED = 'enrolled',
|
|
NAME = 'name',
|
|
USERS = 'users',
|
|
COURSEID = 'courseid',
|
|
ASSIGNABLEROLES = 'assignableRoles',
|
|
DEFAULTCOHORTROLE = 'defaultCohortRole',
|
|
COHORTS = 'cohorts',
|
|
PANELID = 'qce-panel-',
|
|
URL = 'url',
|
|
AJAXURL = 'ajaxurl',
|
|
MANUALENROLMENT = 'manualEnrolment',
|
|
CSS = {
|
|
COHORT : 'qce-cohort',
|
|
COHORTS : 'qce-cohorts',
|
|
COHORTBUTTON : 'qce-cohort-button',
|
|
COHORTENROLLED : 'qce-cohort-enrolled',
|
|
COHORTNAME : 'qce-cohort-name',
|
|
COHORTUSERS : 'qce-cohort-users',
|
|
PANEL : 'qce-panel',
|
|
PANELCONTENT : 'qce-panel-content',
|
|
PANELCOHORTS : 'qce-enrollable-cohorts',
|
|
PANELROLES : 'qce-assignable-roles',
|
|
PANELCONTROLS : 'qce-panel-controls',
|
|
ENROLUSERS : 'canenrolusers'
|
|
},
|
|
COUNT = 0;
|
|
|
|
|
|
var CONTROLLER = function(config) {
|
|
CONTROLLER.superclass.constructor.apply(this, arguments);
|
|
};
|
|
CONTROLLER.prototype = {
|
|
_preformingAction : false,
|
|
initializer : function(config) {
|
|
COUNT ++;
|
|
this.publish('assignablerolesloaded', {fireOnce:true});
|
|
this.publish('cohortsloaded');
|
|
this.publish('performingaction');
|
|
this.publish('actioncomplete');
|
|
this.publish('defaultcohortroleloaded', {fireOnce:true});
|
|
|
|
var close = Y.Node.create('<div class="close"></div>');
|
|
var panel = new Y.Overlay({
|
|
headerContent : Y.Node.create('<div></div>').append(Y.Node.create('<h2>'+M.str.enrol.enrolcohort+'</h2>')).append(close),
|
|
bodyContent : Y.Node.create('<div class="loading"></div>').append(Y.Node.create('<img alt="loading" />').setAttribute('src', M.cfg.loadingicon)),
|
|
constrain : true,
|
|
centered : true,
|
|
id : PANELID+COUNT,
|
|
visible : false
|
|
});
|
|
panel.get('boundingBox').addClass(CSS.PANEL);
|
|
panel.render(Y.one(document.body));
|
|
this.on('show', function(){
|
|
this.set('centered', true);
|
|
this.show();
|
|
}, panel);
|
|
this.on('hide', panel.hide, panel);
|
|
this.on('performingaction', function(){
|
|
this.get('boundingBox').append(Y.Node.create('<div class="performing-action"></div>').append(Y.Node.create('<img alt="loading" />').setAttribute('src', M.cfg.loadingicon)).setStyle('opacity', 0.5));
|
|
}, panel);
|
|
this.on('actioncomplete', function(){
|
|
this.get('boundingBox').one('.performing-action').remove();
|
|
}, panel);
|
|
this.on('assignablerolesloaded', this.updateContent, this, panel);
|
|
this.on('cohortsloaded', this.updateContent, this, panel);
|
|
this.on('defaultcohortroleloaded', this.updateContent, this, panel);
|
|
close.on('click', this.hide, this);
|
|
|
|
Y.all('.enrolcohortbutton input').each(function(node){
|
|
if (node.getAttribute('type', 'submit')) {
|
|
node.on('click', this.show, this);
|
|
}
|
|
}, this);
|
|
|
|
var base = panel.get('boundingBox');
|
|
base.plug(Y.Plugin.Drag);
|
|
base.dd.addHandle('.yui3-widget-hd h2');
|
|
base.one('.yui3-widget-hd h2').setStyle('cursor', 'move');
|
|
},
|
|
show : function(e) {
|
|
e.preventDefault();
|
|
this.getCohorts();
|
|
this.getAssignableRoles();
|
|
this.fire('show');
|
|
},
|
|
updateContent : function(e, panel) {
|
|
if (panel.get('contentBox').one('.loading')) {
|
|
panel.set('bodyContent', Y.Node.create('<div class="'+CSS.PANELCONTENT+'"></div>')
|
|
.append(Y.Node.create('<div class="'+CSS.PANELCOHORTS+'"><div class="'+CSS.COHORT+' headings"><div class="'+CSS.COHORTBUTTON+'"></div><div class="'+CSS.COHORTNAME+'">'+M.str.cohort.cohort+'</div><div class="'+CSS.COHORTUSERS+'">'+M.str.moodle.users+'</div></div></div>'))
|
|
.append(Y.Node.create('<div class="'+CSS.PANELROLES+'"></div>')));
|
|
}
|
|
var content, i, roles, cohorts, count=0, supportmanual = this.get(MANUALENROLMENT), defaultrole;
|
|
switch (e.type.replace(/^[^:]+:/, '')) {
|
|
case 'cohortsloaded' :
|
|
cohorts = this.get(COHORTS);
|
|
content = Y.Node.create('<div class="'+CSS.COHORTS+'"></div>');
|
|
if (supportmanual) {
|
|
content.addClass(CSS.ENROLUSERS);
|
|
}
|
|
for (i in cohorts) {
|
|
count++;
|
|
cohorts[i].on('enrolchort', this.enrolCohort, this, cohorts[i], panel.get('contentBox'), false);
|
|
cohorts[i].on('enrolusers', this.enrolCohort, this, cohorts[i], panel.get('contentBox'), true);
|
|
content.append(cohorts[i].toHTML(supportmanual).addClass((count%2)?'even':'odd'));
|
|
}
|
|
panel.get('contentBox').one('.'+CSS.PANELCOHORTS).setContent(content);
|
|
break;
|
|
case 'assignablerolesloaded':
|
|
roles = this.get(ASSIGNABLEROLES);
|
|
content = Y.Node.create('<select></select>');
|
|
for (i in roles) {
|
|
content.append(Y.Node.create('<option value="'+i+'">'+roles[i]+'</option>'));
|
|
}
|
|
panel.get('contentBox').one('.'+CSS.PANELROLES).setContent(Y.Node.create('<div>'+M.str.role.assignroles+': </div>').append(content));
|
|
|
|
this.getDefaultCohortRole();
|
|
break;
|
|
case 'defaultcohortroleloaded':
|
|
defaultrole = this.get(DEFAULTCOHORTROLE);
|
|
panel.get('contentBox').one('.'+CSS.PANELROLES).all('option').each(function(){
|
|
if (this.get('value')==defaultrole) {
|
|
this.setAttribute('selected', true);
|
|
}
|
|
});
|
|
break;
|
|
}
|
|
},
|
|
hide : function() {
|
|
this.fire('hide');
|
|
},
|
|
getCohorts : function() {
|
|
Y.io(M.cfg.wwwroot+this.get(AJAXURL), {
|
|
method:'POST',
|
|
data:'id='+this.get(COURSEID)+'&action=getcohorts&sesskey='+M.cfg.sesskey,
|
|
on: {
|
|
complete: function(tid, outcome, args) {
|
|
try {
|
|
var cohorts = Y.JSON.parse(outcome.responseText);
|
|
if (cohorts.error) {
|
|
new M.core.ajaxException(cohorts);
|
|
} else {
|
|
this.setCohorts(cohorts.response);
|
|
}
|
|
} catch (e) {
|
|
return new M.core.exception(e);
|
|
}
|
|
this.getCohorts = function() {
|
|
this.fire('cohortsloaded');
|
|
};
|
|
this.getCohorts();
|
|
}
|
|
},
|
|
context:this
|
|
});
|
|
},
|
|
setCohorts : function(rawcohorts) {
|
|
var cohorts = [], i=0;
|
|
for (i in rawcohorts) {
|
|
cohorts[rawcohorts[i].cohortid] = new COHORT(rawcohorts[i]);
|
|
}
|
|
this.set(COHORTS, cohorts);
|
|
},
|
|
getAssignableRoles : function() {
|
|
Y.io(M.cfg.wwwroot+this.get(AJAXURL), {
|
|
method:'POST',
|
|
data:'id='+this.get(COURSEID)+'&action=getassignable&sesskey='+M.cfg.sesskey,
|
|
on: {
|
|
complete: function(tid, outcome, args) {
|
|
try {
|
|
var roles = Y.JSON.parse(outcome.responseText);
|
|
this.set(ASSIGNABLEROLES, roles.response);
|
|
} catch (e) {
|
|
return new M.core.exception(e);
|
|
}
|
|
this.getAssignableRoles = function() {
|
|
this.fire('assignablerolesloaded');
|
|
};
|
|
this.getAssignableRoles();
|
|
}
|
|
},
|
|
context:this
|
|
});
|
|
},
|
|
getDefaultCohortRole : function() {
|
|
Y.io(M.cfg.wwwroot+this.get(AJAXURL), {
|
|
method:'POST',
|
|
data:'id='+this.get(COURSEID)+'&action=getdefaultcohortrole&sesskey='+M.cfg.sesskey,
|
|
on: {
|
|
complete: function(tid, outcome, args) {
|
|
try {
|
|
var roles = Y.JSON.parse(outcome.responseText);
|
|
this.set(DEFAULTCOHORTROLE, roles.response);
|
|
} catch (e) {
|
|
return new M.core.exception(e);
|
|
}
|
|
this.fire('defaultcohortroleloaded');
|
|
}
|
|
},
|
|
context:this
|
|
});
|
|
},
|
|
enrolCohort : function(e, cohort, node, usersonly) {
|
|
if (this._preformingAction) {
|
|
return true;
|
|
}
|
|
this._preformingAction = true;
|
|
this.fire('performingaction');
|
|
var params = {
|
|
id : this.get(COURSEID),
|
|
roleid : node.one('.'+CSS.PANELROLES+' select').get('value'),
|
|
cohortid : cohort.get(COHORTID),
|
|
action : (usersonly)?'enrolcohortusers':'enrolcohort',
|
|
sesskey : M.cfg.sesskey
|
|
};
|
|
Y.io(M.cfg.wwwroot+this.get(AJAXURL), {
|
|
method:'POST',
|
|
data:build_querystring(params),
|
|
on: {
|
|
complete: function(tid, outcome, args) {
|
|
try {
|
|
var result = Y.JSON.parse(outcome.responseText);
|
|
if (result.error) {
|
|
new M.core.ajaxException(result);
|
|
} else {
|
|
var redirecturl = this.get(URL), redirect = function() {
|
|
if (!usersonly || result.response.users) {
|
|
Y.one(document.body).append(
|
|
Y.Node.create('<div class="corelightbox"></div>')
|
|
.setStyle('height', Y.one(document.body).get('docHeight')+'px')
|
|
.setStyle('opacity', '0.4')
|
|
.append(Y.Node.create('<img alt="loading" />').setAttribute('src', M.cfg.loadingicon)));
|
|
window.location.href = redirecturl;
|
|
}
|
|
};
|
|
if (result.response && result.response.message) {
|
|
new M.core.alert(result.response).on('complete', redirect, this);
|
|
} else {
|
|
redirect();
|
|
}
|
|
}
|
|
this._preformingAction = false;
|
|
this.fire('actioncomplete');
|
|
} catch (e) {
|
|
new M.core.exception(e);
|
|
}
|
|
}
|
|
},
|
|
context:this
|
|
});
|
|
return true;
|
|
}
|
|
};
|
|
Y.extend(CONTROLLER, Y.Base, CONTROLLER.prototype, {
|
|
NAME : CONTROLLERNAME,
|
|
ATTRS : {
|
|
url : {
|
|
validator : Y.Lang.isString
|
|
},
|
|
ajaxurl : {
|
|
validator : Y.Lang.isString
|
|
},
|
|
courseid : {
|
|
value : null
|
|
},
|
|
cohorts : {
|
|
validator : Y.Lang.isArray,
|
|
value : null
|
|
},
|
|
assignableRoles : {
|
|
value : null
|
|
},
|
|
manualEnrolment : {
|
|
value : false
|
|
},
|
|
defaultCohortRole : {
|
|
value : null
|
|
}
|
|
}
|
|
});
|
|
Y.augment(CONTROLLER, Y.EventTarget);
|
|
|
|
var COHORT = function(config) {
|
|
COHORT.superclass.constructor.apply(this, arguments);
|
|
};
|
|
Y.extend(COHORT, Y.Base, {
|
|
toHTML : function(supportmanualenrolment){
|
|
var button, result, name, users, syncbutton, usersbutton;
|
|
result = Y.Node.create('<div class="'+CSS.COHORT+'"></div>');
|
|
if (this.get(ENROLLED)) {
|
|
button = Y.Node.create('<div class="'+CSS.COHORTBUTTON+' alreadyenrolled">'+M.str.enrol.synced+'</div>');
|
|
} else {
|
|
button = Y.Node.create('<div></div>');
|
|
|
|
syncbutton = Y.Node.create('<a class="'+CSS.COHORTBUTTON+' notenrolled enrolcohort">'+M.str.enrol.enrolcohort+'</a>');
|
|
syncbutton.on('click', function(){this.fire('enrolchort');}, this);
|
|
button.append(syncbutton);
|
|
|
|
if (supportmanualenrolment) {
|
|
usersbutton = Y.Node.create('<a class="'+CSS.COHORTBUTTON+' notenrolled enrolusers">'+M.str.enrol.enrolcohortusers+'</a>');
|
|
usersbutton.on('click', function(){this.fire('enrolusers');}, this);
|
|
button.append(usersbutton);
|
|
}
|
|
}
|
|
name = Y.Node.create('<div class="'+CSS.COHORTNAME+'">'+this.get(NAME)+'</div>');
|
|
users = Y.Node.create('<div class="'+CSS.COHORTUSERS+'">'+this.get(USERS)+'</div>');
|
|
if (this.get(ENROLLED)) {
|
|
button.one(CSS.COHORTENROLLED);
|
|
}
|
|
return result.append(button).append(name).append(users);
|
|
}
|
|
}, {
|
|
NAME : COHORTNAME,
|
|
ATTRS : {
|
|
cohortid : {
|
|
|
|
},
|
|
name : {
|
|
validator : Y.Lang.isString
|
|
},
|
|
enrolled : {
|
|
value : false
|
|
},
|
|
users : {
|
|
value : 0
|
|
}
|
|
}
|
|
});
|
|
Y.augment(COHORT, Y.EventTarget);
|
|
|
|
M.enrol = M.enrol || {};
|
|
M.enrol.quickcohortenrolment = {
|
|
init : function(cfg) {
|
|
new CONTROLLER(cfg);
|
|
}
|
|
}
|
|
|
|
}, '@VERSION@', {requires:['base','node', 'overlay', 'io', 'test', 'json-parse', 'event-delegate', 'dd-plugin', 'event-key', 'moodle-enrol-notification']}); |