MDL-33328 enrol_manual: use correct parameter in search function
[moodle.git] / enrol / manual / yui / quickenrolment / quickenrolment.js
CommitLineData
b69ca6be 1YUI.add('moodle-enrol_manual-quickenrolment', function(Y) {
a70eb30f
SH
2
3 var UEP = {
4 NAME : 'Enrolment Manager',
5 /** Properties **/
6 BASE : 'base',
7 SEARCH : 'search',
fe8a06dc 8 SEARCHBTN : 'searchbtn',
a70eb30f
SH
9 PARAMS : 'params',
10 URL : 'url',
11 AJAXURL : 'ajaxurl',
12 MULTIPLE : 'multiple',
13 PAGE : 'page',
14 COURSEID : 'courseid',
15 USERS : 'users',
16 USERCOUNT : 'userCount',
17 REQUIREREFRESH : 'requiresRefresh',
18 LASTSEARCH : 'lastPreSearchValue',
19 INSTANCES : 'instances',
20 OPTIONSTARTDATE : 'optionsStartDate',
21 DEFAULTROLE : 'defaultRole',
22 DEFAULTSTARTDATE : 'defaultStartDate',
23 DEFAULTDURATION : 'defaultDuration',
13ba9036 24 ASSIGNABLEROLES : 'assignableRoles',
dbe93bc7 25 DISABLEGRADEHISTORY : 'disableGradeHistory',
4be3ed4b 26 RECOVERGRADESDEFAULT : 'recoverGradesDefault',
62a973ce 27 ENROLCOUNT : 'enrolCount',
b6548192
MG
28 PERPAGE : 'perPage',
29 COHORTSAVAILABLE : 'cohortsAvailable',
30 COHORTCOUNT : 'cohortCount'
3f35a7ff 31 };
a70eb30f 32 /** CSS classes for nodes in structure **/
3f35a7ff 33 var CSS = {
a70eb30f
SH
34 PANEL : 'user-enroller-panel',
35 WRAP : 'uep-wrap',
36 HEADER : 'uep-header',
37 CONTENT : 'uep-content',
38 AJAXCONTENT : 'uep-ajax-content',
39 SEARCHRESULTS : 'uep-search-results',
40 TOTALUSERS : 'totalusers',
41 USERS : 'users',
42 USER : 'user',
43 MORERESULTS : 'uep-more-results',
44 LIGHTBOX : 'uep-loading-lightbox',
45 LOADINGICON : 'loading-icon',
46 FOOTER : 'uep-footer',
47 ENROL : 'enrol',
48 ENROLLED : 'enrolled',
49 COUNT : 'count',
50 PICTURE : 'picture',
51 DETAILS : 'details',
52 FULLNAME : 'fullname',
b849c212 53 EXTRAFIELDS : 'extrafields',
a70eb30f
SH
54 OPTIONS : 'options',
55 ODD : 'odd',
56 EVEN : 'even',
57 HIDDEN : 'hidden',
d4c98cff
SH
58 RECOVERGRADES : 'recovergrades',
59 RECOVERGRADESTITLE : 'recovergradestitle',
a70eb30f
SH
60 SEARCHOPTIONS : 'uep-searchoptions',
61 COLLAPSIBLEHEADING : 'collapsibleheading',
62 COLLAPSIBLEAREA : 'collapsiblearea',
d4c98cff 63 ENROLMENTOPTION : 'uep-enrolment-option',
4a370785 64 SEARCHCONTROLS : 'uep-controls',
a70eb30f
SH
65 ROLE : 'role',
66 STARTDATE : 'startdate',
67 DURATION : 'duration',
68 ACTIVE : 'active',
69 SEARCH : 'uep-search',
fe8a06dc 70 SEARCHBTN : 'uep-search-btn',
af885128 71 CLOSE : 'close',
b6548192
MG
72 CLOSEBTN : 'close-button',
73 ENTITYSELECTOR : 'uep-entity-selector',
74 COHORTS : 'cohorts',
75 COHORT : 'cohort',
76 COHORTNAME : 'cohortname',
77 TOTALCOHORTS : 'totalcohorts'
a70eb30f 78 };
d4c98cff 79 var create = Y.Node.create;
a70eb30f
SH
80
81 var USERENROLLER = function(config) {
82 USERENROLLER.superclass.constructor.apply(this, arguments);
83 };
84 Y.extend(USERENROLLER, Y.Base, {
85 _searchTimeout : null,
86 _loadingNode : null,
87 _escCloseEvent : null,
88 initializer : function(config) {
d4c98cff 89 var recovergrades = null;
13ba9036 90 if (this.get(UEP.DISABLEGRADEHISTORY) != true) {
d4c98cff 91 recovergrades = create('<div class="'+CSS.ENROLMENTOPTION+' '+CSS.RECOVERGRADES+'"></div>')
64e7aa4d 92 .append(create('<label class="'+CSS.RECOVERGRADESTITLE+'" for="'+CSS.RECOVERGRADES+'">'+M.util.get_string('recovergrades', 'enrol')+'</label>'))
dbe93bc7 93 .append(create('<input type="checkbox" id="'+CSS.RECOVERGRADES+'" name="'+CSS.RECOVERGRADES+'"'+ this.get(UEP.RECOVERGRADESDEFAULT) +' />'))
13ba9036
AD
94 }
95
d4c98cff
SH
96 this.set(UEP.BASE, create('<div class="'+CSS.PANEL+' '+CSS.HIDDEN+'"></div>')
97 .append(create('<div class="'+CSS.WRAP+'"></div>')
98 .append(create('<div class="'+CSS.HEADER+' header"></div>')
99 .append(create('<div class="'+CSS.CLOSE+'"></div>'))
64e7aa4d 100 .append(create('<h2>'+M.util.get_string('enrolusers', 'enrol')+'</h2>')))
d4c98cff
SH
101 .append(create('<div class="'+CSS.CONTENT+'"></div>')
102 .append(create('<div class="'+CSS.SEARCHCONTROLS+'"></div>')
64e7aa4d
AN
103 .append(create('<div class="'+CSS.ENROLMENTOPTION+' '+CSS.ROLE+'"><label for="id_enrol_manual_assignable_roles">'+M.util.get_string('assignroles', 'role')+'</label></div>')
104 .append(create('<select id="id_enrol_manual_assignable_roles"><option value="">'+M.util.get_string('none', 'enrol')+'</option></select>'))
4a370785 105 )
b6548192 106 .append(create('<div class="'+CSS.ENTITYSELECTOR+'"></div>'))
d4c98cff 107 .append(create('<div class="'+CSS.SEARCHOPTIONS+'"></div>')
64e7aa4d 108 .append(create('<div class="'+CSS.COLLAPSIBLEHEADING+'"><img alt="" />'+M.util.get_string('enrolmentoptions', 'enrol')+'</div>'))
d4c98cff
SH
109 .append(create('<div class="'+CSS.COLLAPSIBLEAREA+' '+CSS.HIDDEN+'"></div>')
110 .append(recovergrades)
64e7aa4d 111 .append(create('<div class="'+CSS.ENROLMENTOPTION+' '+CSS.STARTDATE+'">'+M.util.get_string('startingfrom', 'moodle')+'</div>')
d4c98cff 112 .append(create('<select></select>')))
64e7aa4d
AN
113 .append(create('<div class="'+CSS.ENROLMENTOPTION+' '+CSS.DURATION+'">'+M.util.get_string('enrolperiod', 'enrol')+'</div>')
114 .append(create('<select><option value="0" selected="selected">'+M.util.get_string('unlimitedduration', 'enrol')+'</option></select>')))
4a370785 115 )
116 )
117 )
d4c98cff
SH
118 .append(create('<div class="'+CSS.AJAXCONTENT+'"></div>'))
119 .append(create('<div class="'+CSS.LIGHTBOX+' '+CSS.HIDDEN+'"></div>')
120 .append(create('<img alt="loading" class="'+CSS.LOADINGICON+'" />')
a70eb30f
SH
121 .setAttribute('src', M.util.image_url('i/loading', 'moodle')))
122 .setStyle('opacity', 0.5)))
d4c98cff 123 .append(create('<div class="'+CSS.FOOTER+'"></div>')
64e7aa4d 124 .append(create('<div class="'+CSS.SEARCH+'"><label for="enrolusersearch" class="accesshide">'+M.util.get_string('usersearch', 'enrol')+'</label></div>')
d4c98cff 125 .append(create('<input type="text" id="enrolusersearch" value="" />'))
64e7aa4d 126 .append(create('<input type="button" id="searchbtn" class="'+CSS.SEARCHBTN+'" value="'+M.util.get_string('usersearch', 'enrol')+'" />'))
a70eb30f 127 )
d4c98cff 128 .append(create('<div class="'+CSS.CLOSEBTN+'"></div>')
64e7aa4d 129 .append(create('<input type="button" value="'+M.util.get_string('finishenrollingusers', 'enrol')+'" />'))
af885128 130 )
a70eb30f
SH
131 )
132 )
133 );
134
135 this.set(UEP.SEARCH, this.get(UEP.BASE).one('#enrolusersearch'));
fe8a06dc 136 this.set(UEP.SEARCHBTN, this.get(UEP.BASE).one('#searchbtn'));
b69ca6be 137 Y.all('.enrol_manual_plugin input').each(function(node){
a70eb30f
SH
138 if (node.getAttribute('type', 'submit')) {
139 node.on('click', this.show, this);
140 }
141 }, this);
142 this.get(UEP.BASE).one('.'+CSS.HEADER+' .'+CSS.CLOSE).on('click', this.hide, this);
af885128 143 this.get(UEP.BASE).one('.'+CSS.FOOTER+' .'+CSS.CLOSEBTN+' input').on('click', this.hide, this);
a70eb30f
SH
144 this._loadingNode = this.get(UEP.BASE).one('.'+CSS.CONTENT+' .'+CSS.LIGHTBOX);
145 var params = this.get(UEP.PARAMS);
146 params['id'] = this.get(UEP.COURSEID);
147 this.set(UEP.PARAMS, params);
148
149 Y.on('key', this.preSearch, this.get(UEP.SEARCH), 'down:13', this);
fe8a06dc 150 this.get(UEP.SEARCHBTN).on('click', this.preSearch, this);
8505d925 151
b6548192
MG
152 if (this.get(UEP.COHORTSAVAILABLE)) {
153 this.get(UEP.BASE).one('.'+CSS.ENTITYSELECTOR)
154 .append(create('<input type="radio" id="id_enrol_manual_entity_users" name="enrol_manual_entity" value="users" checked="checked"/>'))
64e7aa4d 155 .append(create('<label for="id_enrol_manual_entity_users">'+ M.util.get_string('browseusers', 'enrol_manual')+'</label>'))
b6548192 156 .append(create('<input type="radio" id="id_enrol_manual_entity_cohorts" name="enrol_manual_entity" value="cohorts"/>'))
64e7aa4d 157 .append(create('<label for="id_enrol_manual_entity_cohorts">'+M.util.get_string('browsecohorts', 'enrol_manual')+'</label>'));
b6548192
MG
158 this.get(UEP.BASE).one('#id_enrol_manual_entity_cohorts').on('change', this.search, this);
159 this.get(UEP.BASE).one('#id_enrol_manual_entity_users').on('change', this.search, this);
160 } else {
161 this.get(UEP.BASE).one('.'+CSS.ENTITYSELECTOR)
162 .append(create('<input type="hidden" name="enrol_manual_entity" value="users"/>'));
163 }
164
a70eb30f
SH
165 Y.one(document.body).append(this.get(UEP.BASE));
166
167 var base = this.get(UEP.BASE);
168 base.plug(Y.Plugin.Drag);
169 base.dd.addHandle('.'+CSS.HEADER+' h2');
170 base.one('.'+CSS.HEADER+' h2').setStyle('cursor', 'move');
171
9fe40de6
NK
172 var collapsedimage = 't/collapsed'; // ltr mode
173 if ( Y.one(document.body).hasClass('dir-rtl') ) {
174 collapsedimage = 't/collapsed_rtl';
175 } else {
176 collapsedimage = 't/collapsed';
177 }
178
179 this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEHEADING).one('img').setAttribute('src', M.util.image_url(collapsedimage, 'moodle'));
571906e3
JM
180 this.populateStartDates();
181 this.populateDuration();
a70eb30f
SH
182 this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEHEADING).on('click', function(){
183 this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEHEADING).toggleClass(CSS.ACTIVE);
184 this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEAREA).toggleClass(CSS.HIDDEN);
185 if (this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEAREA).hasClass(CSS.HIDDEN)) {
9fe40de6 186 this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEHEADING).one('img').setAttribute('src', M.util.image_url(collapsedimage, 'moodle'));
a70eb30f
SH
187 } else {
188 this.get(UEP.BASE).one('.'+CSS.SEARCHOPTIONS+' .'+CSS.COLLAPSIBLEHEADING).one('img').setAttribute('src', M.util.image_url('t/expanded', 'moodle'));
189 }
190 }, this);
a70eb30f 191 this.populateAssignableRoles();
a70eb30f
SH
192 },
193 populateAssignableRoles : function() {
194 this.on('assignablerolesloaded', function(){
195 var roles = this.get(UEP.ASSIGNABLEROLES);
d4c98cff 196 var s = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.ROLE+' select');
a70eb30f
SH
197 var v = this.get(UEP.DEFAULTROLE);
198 var index = 0, count = 0;
199 for (var i in roles) {
200 count++;
d4c98cff 201 var option = create('<option value="'+i+'">'+roles[i]+'</option>');
a70eb30f
SH
202 if (i == v) {
203 index = count;
204 }
205 s.append(option);
206 }
207 s.set('selectedIndex', index);
f068cac1 208 Y.one('#id_enrol_manual_assignable_roles').focus();
a70eb30f
SH
209 }, this);
210 this.getAssignableRoles();
211 },
212 populateStartDates : function() {
d4c98cff 213 var select = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.STARTDATE+' select');
a70eb30f
SH
214 var defaultvalue = this.get(UEP.DEFAULTSTARTDATE);
215 var options = this.get(UEP.OPTIONSTARTDATE);
216 var index = 0, count = 0;
217 for (var i in options) {
218 count++;
d4c98cff 219 var option = create('<option value="'+i+'">'+options[i]+'</option>');
a70eb30f
SH
220 if (i == defaultvalue) {
221 index = count;
222 }
223 select.append(option);
224 }
225 select.set('selectedIndex', index);
226 },
227 populateDuration : function() {
d4c98cff 228 var select = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.DURATION+' select');
a70eb30f
SH
229 var defaultvalue = this.get(UEP.DEFAULTDURATION);
230 var index = 0, count = 0;
e7335920 231 var durationdays = M.util.get_string('durationdays', 'enrol', '{a}');
a70eb30f
SH
232 for (var i = 1; i <= 365; i++) {
233 count++;
e7335920 234 var option = create('<option value="'+i+'">'+durationdays.replace('{a}', i)+'</option>');
a70eb30f
SH
235 if (i == defaultvalue) {
236 index = count;
237 }
238 select.append(option);
239 }
240 select.set('selectedIndex', index);
241 },
242 getAssignableRoles : function(){
243 Y.io(M.cfg.wwwroot+'/enrol/ajax.php', {
244 method:'POST',
245 data:'id='+this.get(UEP.COURSEID)+'&action=getassignable&sesskey='+M.cfg.sesskey,
246 on: {
247 complete: function(tid, outcome, args) {
248 try {
249 var roles = Y.JSON.parse(outcome.responseText);
250 this.set(UEP.ASSIGNABLEROLES, roles.response);
251 } catch (e) {
6db3eee0 252 new M.core.exception(e);
a70eb30f
SH
253 }
254 this.getAssignableRoles = function() {
255 this.fire('assignablerolesloaded');
8505d925 256 };
a70eb30f
SH
257 this.getAssignableRoles();
258 }
259 },
260 context:this
261 });
262 },
263 preSearch : function(e) {
2568347e 264 this.search(e, false);
a70eb30f
SH
265 /*
266 var value = this.get(UEP.SEARCH).get('value');
267 if (value.length < 3 || value == this.get(UEP.LASTSEARCH)) {
268 return;
269 }
270 this.set(UEP.LASTSEARCH, value);
271 if (this._searchTimeout) {
272 clearTimeout(this._searchTimeout);
273 this._searchTimeout = null;
274 }
275 var self = this;
276 this._searchTimeout = setTimeout(function(){
277 self._searchTimeout = null;
278 self.search(null, false);
279 }, 300);
280 */
281 },
282 show : function(e) {
283 e.preventDefault();
284 e.halt();
285
286 var base = this.get(UEP.BASE);
287 base.removeClass(CSS.HIDDEN);
288 var x = (base.get('winWidth') - 400)/2;
289 var y = (parseInt(base.get('winHeight'))-base.get('offsetHeight'))/2 + parseInt(base.get('docScrollY'));
290 if (y < parseInt(base.get('winHeight'))*0.1) {
291 y = parseInt(base.get('winHeight'))*0.1;
292 }
293 base.setXY([x,y]);
8505d925 294
a70eb30f
SH
295 if (this.get(UEP.USERS)===null) {
296 this.search(e, false);
297 }
298
299 this._escCloseEvent = Y.on('key', this.hide, document.body, 'down:27', this);
f068cac1
DM
300 var rolesselect = Y.one('#id_enrol_manual_assignable_roles');
301 if (rolesselect) {
302 rolesselect.focus();
303 }
a70eb30f
SH
304 },
305 hide : function(e) {
306 if (this._escCloseEvent) {
307 this._escCloseEvent.detach();
308 this._escCloseEvent = null;
309 }
310 this.get(UEP.BASE).addClass(CSS.HIDDEN);
311 if (this.get(UEP.REQUIREREFRESH)) {
312 window.location = this.get(UEP.URL);
313 }
314 },
b6548192
MG
315 currentEntity : function() {
316 var entity = CSS.USER;
317 var cohortsinput = Y.one('#id_enrol_manual_entity_cohorts');
318 if (cohortsinput && cohortsinput.get('checked')) {
319 entity = CSS.COHORT;
320 }
321 return entity;
322 },
a70eb30f 323 search : function(e, append) {
b6548192
MG
324 var entity = this.currentEntity();
325
a70eb30f
SH
326 if (e) {
327 e.halt();
328 e.preventDefault();
329 }
330 var on, params;
331 if (append) {
332 this.set(UEP.PAGE, this.get(UEP.PAGE)+1);
333 } else {
334 this.set(UEP.USERCOUNT, 0);
b6548192 335 this.set(UEP.COHORTCOUNT, 0);
b8746370 336 this.set(UEP.PAGE, 0);
a70eb30f
SH
337 }
338 params = this.get(UEP.PARAMS);
339 params['sesskey'] = M.cfg.sesskey;
b6548192 340 params['action'] = (entity === CSS.USER) ? 'searchusers' : 'searchcohorts';
a70eb30f
SH
341 params['search'] = this.get(UEP.SEARCH).get('value');
342 params['page'] = this.get(UEP.PAGE);
4be3ed4b 343 params['enrolcount'] = this.get(UEP.ENROLCOUNT);
62a973ce 344 params['perpage'] = this.get(UEP.PERPAGE);
4be3ed4b 345
a70eb30f
SH
346 if (this.get(UEP.MULTIPLE)) {
347 alert('oh no there are multiple');
348 } else {
349 var instance = this.get(UEP.INSTANCES)[0];
350 params['enrolid'] = instance.id;
351 }
352 Y.io(M.cfg.wwwroot+this.get(UEP.AJAXURL), {
353 method:'POST',
354 data:build_querystring(params),
355 on : {
356 start : this.displayLoading,
b6548192 357 complete: ((entity === CSS.USER) ? this.processSearchResults : this.processCohortsSearchResults),
a70eb30f
SH
358 end : this.removeLoading
359 },
360 context:this,
361 arguments:{
362 append:append,
363 enrolid:params['enrolid']
364 }
365 });
366 },
367 displayLoading : function() {
368 this._loadingNode.removeClass(CSS.HIDDEN);
369 },
370 removeLoading : function() {
371 this._loadingNode.addClass(CSS.HIDDEN);
372 },
373 processSearchResults : function(tid, outcome, args) {
374 try {
375 var result = Y.JSON.parse(outcome.responseText);
6db3eee0
SH
376 if (result.error) {
377 return new M.core.ajaxException(result);
378 }
a70eb30f 379 } catch (e) {
6db3eee0 380 new M.core.exception(e);
a70eb30f
SH
381 }
382 if (!result.success) {
64e7aa4d 383 this.setContent = M.util.get_string('errajaxsearch', 'enrol');
a70eb30f
SH
384 }
385 var users;
386 if (!args.append) {
d4c98cff 387 users = create('<div class="'+CSS.USERS+'"></div>');
a70eb30f
SH
388 } else {
389 users = this.get(UEP.BASE).one('.'+CSS.SEARCHRESULTS+' .'+CSS.USERS);
390 }
391 var count = this.get(UEP.USERCOUNT);
392 for (var i in result.response.users) {
393 count++;
394 var user = result.response.users[i];
d4c98cff 395 users.append(create('<div class="'+CSS.USER+' clearfix" rel="'+user.id+'"></div>')
9e7cd6e7 396 .addClass((count%2)?CSS.ODD:CSS.EVEN)
d4c98cff
SH
397 .append(create('<div class="'+CSS.COUNT+'">'+count+'</div>'))
398 .append(create('<div class="'+CSS.PICTURE+'"></div>')
399 .append(create(user.picture)))
400 .append(create('<div class="'+CSS.DETAILS+'"></div>')
401 .append(create('<div class="'+CSS.FULLNAME+'">'+user.fullname+'</div>'))
b849c212 402 .append(create('<div class="'+CSS.EXTRAFIELDS+'">'+user.extrafields+'</div>')))
d4c98cff 403 .append(create('<div class="'+CSS.OPTIONS+'"></div>')
64e7aa4d 404 .append(create('<input type="button" class="'+CSS.ENROL+'" value="'+M.util.get_string('enrol', 'enrol')+'" />')))
a70eb30f
SH
405 );
406 }
407 this.set(UEP.USERCOUNT, count);
408 if (!args.append) {
64e7aa4d 409 var usersstr = (result.response.totalusers == '1')?M.util.get_string('ajaxoneuserfound', 'enrol'):M.util.get_string('ajaxxusersfound','enrol', result.response.totalusers);
d4c98cff
SH
410 var content = create('<div class="'+CSS.SEARCHRESULTS+'"></div>')
411 .append(create('<div class="'+CSS.TOTALUSERS+'">'+usersstr+'</div>'))
a70eb30f 412 .append(users);
62a973ce 413 if (result.response.totalusers > (this.get(UEP.PAGE)+1)*this.get(UEP.PERPAGE)) {
64e7aa4d 414 var fetchmore = create('<div class="'+CSS.MORERESULTS+'"><a href="#">'+M.util.get_string('ajaxnext25', 'enrol')+'</a></div>');
a70eb30f
SH
415 fetchmore.on('click', this.search, this, true);
416 content.append(fetchmore)
417 }
418 this.setContent(content);
419 Y.delegate("click", this.enrolUser, users, '.'+CSS.USER+' .'+CSS.ENROL, this, args);
420 } else {
62a973ce 421 if (result.response.totalusers <= (this.get(UEP.PAGE)+1)*this.get(UEP.PERPAGE)) {
a70eb30f
SH
422 this.get(UEP.BASE).one('.'+CSS.MORERESULTS).remove();
423 }
424 }
425 },
b6548192
MG
426 processCohortsSearchResults : function(tid, outcome, args) {
427 try {
428 var result = Y.JSON.parse(outcome.responseText);
429 if (result.error) {
430 return new M.core.ajaxException(result);
431 }
432 } catch (e) {
433 new M.core.exception(e);
434 }
435 if (!result.success) {
64e7aa4d 436 this.setContent = M.util.get_string('errajaxsearch', 'enrol');
b6548192
MG
437 }
438 var cohorts;
439 if (!args.append) {
440 cohorts = create('<div class="'+CSS.COHORTS+'"></div>');
441 } else {
442 cohorts = this.get(UEP.BASE).one('.'+CSS.SEARCHRESULTS+' .'+CSS.COHORTS);
443 }
444 var count = this.get(UEP.COHORTCOUNT);
445 for (var i in result.response.cohorts) {
446 count++;
447 var cohort = result.response.cohorts[i];
448 cohorts.append(create('<div class="'+CSS.COHORT+' clearfix" rel="'+cohort.id+'"></div>')
449 .addClass((count%2)?CSS.ODD:CSS.EVEN)
450 .append(create('<div class="'+CSS.COUNT+'">'+count+'</div>'))
451 .append(create('<div class="'+CSS.DETAILS+'"></div>')
452 .append(create('<div class="'+CSS.COHORTNAME+'">'+cohort.name+'</div>')))
453 .append(create('<div class="'+CSS.OPTIONS+'"></div>')
3a0c9c63 454 .append(create('<input type="button" class="' + CSS.ENROL + '" value="' + M.util.get_string('enrolxusers', 'enrol', cohort.cnt) + '" />')))
b6548192
MG
455 );
456 }
457 this.set(UEP.COHORTCOUNT, count);
458 if (!args.append) {
64e7aa4d 459 //var usersstr = (result.response.totalusers == '1')?M.util.get_string('ajaxoneuserfound', 'enrol'):M.util.get_string('ajaxxusersfound','enrol', result.response.totalusers);
3a0c9c63 460 var cohortsstr = M.util.get_string('foundxcohorts', 'enrol', result.response.totalcohorts);
b6548192
MG
461 var content = create('<div class="'+CSS.SEARCHRESULTS+'"></div>')
462 .append(create('<div class="'+CSS.TOTALCOHORTS+'">'+cohortsstr+'</div>'))
463 .append(cohorts);
464 if (result.response.totalcohorts > (this.get(UEP.PAGE)+1)*this.get(UEP.PERPAGE)) {
64e7aa4d 465 var fetchmore = create('<div class="'+CSS.MORERESULTS+'"><a href="#">'+M.util.get_string('ajaxnext25', 'enrol')+'</a></div>');
b6548192
MG
466 fetchmore.on('click', this.search, this, true);
467 content.append(fetchmore)
468 }
469 this.setContent(content);
470 Y.delegate("click", this.enrolUser, cohorts, '.'+CSS.COHORT+' .'+CSS.ENROL, this, args);
471 } else {
472 if (result.response.totalcohorts <= (this.get(UEP.PAGE)+1)*this.get(UEP.PERPAGE)) {
473 this.get(UEP.BASE).one('.'+CSS.MORERESULTS).remove();
474 }
475 }
476 },
a70eb30f 477 enrolUser : function(e, args) {
b6548192
MG
478 var entityname = this.currentEntity();
479
480 var entity = e.currentTarget.ancestor('.'+entityname);
a70eb30f
SH
481 var params = [];
482 params['id'] = this.get(UEP.COURSEID);
b6548192
MG
483 if (entityname === CSS.USER) {
484 params['userid'] = entity.getAttribute("rel");
485 } else {
486 params['cohortid'] = entity.getAttribute("rel");
487 }
a70eb30f
SH
488 params['enrolid'] = args.enrolid;
489 params['sesskey'] = M.cfg.sesskey;
490 params['action'] = 'enrol';
d4c98cff
SH
491 params['role'] = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.ROLE+' select').get('value');
492 params['startdate'] = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.STARTDATE+' select').get('value');
493 params['duration'] = this.get(UEP.BASE).one('.'+CSS.ENROLMENTOPTION+'.'+CSS.DURATION+' select').get('value');
f2ab2436
PS
494 if (this.get(UEP.DISABLEGRADEHISTORY) != true) {
495 params['recovergrades'] = this.get(UEP.BASE).one('#'+CSS.RECOVERGRADES).get('checked')?1:0;
496 } else {
497 params['recovergrades'] = 0;
498 }
13ba9036 499
a70eb30f
SH
500 Y.io(M.cfg.wwwroot+this.get(UEP.AJAXURL), {
501 method:'POST',
502 data:build_querystring(params),
503 on: {
504 start : this.displayLoading,
505 complete : function(tid, outcome, args) {
506 try {
507 var result = Y.JSON.parse(outcome.responseText);
6db3eee0
SH
508 if (result.error) {
509 return new M.core.ajaxException(result);
510 } else {
b6548192
MG
511 args.entityNode.addClass(CSS.ENROLLED);
512 args.entityNode.one('.'+CSS.ENROL).remove();
6db3eee0 513 this.set(UEP.REQUIREREFRESH, true);
4be3ed4b
RW
514 var countenrol = this.get(UEP.ENROLCOUNT)+1;
515 this.set(UEP.ENROLCOUNT, countenrol);
6db3eee0 516 }
a70eb30f 517 } catch (e) {
6db3eee0 518 new M.core.exception(e);
a70eb30f
SH
519 }
520 },
521 end : this.removeLoading
522 },
523 context:this,
524 arguments:{
525 params : params,
b6548192 526 entityNode : entity
a70eb30f
SH
527 }
528 });
529
530 },
531 setContent: function(content) {
532 this.get(UEP.BASE).one('.'+CSS.CONTENT+' .'+CSS.AJAXCONTENT).setContent(content);
533 }
534 }, {
535 NAME : UEP.NAME,
536 ATTRS : {
537 url : {
538 validator : Y.Lang.isString
539 },
540 ajaxurl : {
541 validator : Y.Lang.isString
542 },
543 base : {
544 setter : function(node) {
545 var n = Y.one(node);
546 if (!n) {
547 Y.fail(UEP.NAME+': invalid base node set');
548 }
549 return n;
550 }
551 },
552 users : {
553 validator : Y.Lang.isArray,
554 value : null
555 },
556 courseid : {
557 value : null
558 },
559 params : {
560 validator : Y.Lang.isArray,
561 value : []
562 },
563 instances : {
564 validator : Y.Lang.isArray,
565 setter : function(instances) {
566 var i,ia = [], count=0;
567 for (i in instances) {
568 ia.push(instances[i]);
569 count++;
570 }
571 this.set(UEP.MULTIPLE, (count>1));
572 }
573 },
574 multiple : {
575 validator : Y.Lang.isBool,
576 value : false
577 },
578 page : {
579 validator : Y.Lang.isNumber,
580 value : 0
581 },
582 userCount : {
583 value : 0,
584 validator : Y.Lang.isNumber
585 },
586 requiresRefresh : {
587 value : false,
588 validator : Y.Lang.isBool
589 },
590 search : {
591 setter : function(node) {
592 var n = Y.one(node);
593 if (!n) {
594 Y.fail(UEP.NAME+': invalid search node set');
595 }
596 return n;
597 }
598 },
599 lastPreSearchValue : {
600 value : '',
601 validator : Y.Lang.isString
602 },
603 strings : {
604 value : {},
605 validator : Y.Lang.isObject
606 },
607 defaultRole : {
23cee7a4 608 value : 0
a70eb30f
SH
609 },
610 defaultStartDate : {
611 value : 2,
612 validator : Y.Lang.isNumber
613 },
614 defaultDuration : {
615 value : ''
616 },
617 assignableRoles : {
618 value : []
619 },
620 optionsStartDate : {
621 value : []
13ba9036
AD
622 },
623 disableGradeHistory : {
624 value : 0
dbe93bc7
CF
625 },
626 recoverGradesDefault : {
627 value : ''
4be3ed4b
RW
628 },
629 enrolCount : {
630 value : 0,
631 validator : Y.Lang.isNumber
62a973ce
RW
632 },
633 perPage : {
634 value: 25,
635 Validator: Y.Lang.isNumber
b6548192
MG
636 },
637 cohortCount : {
638 value : 0,
639 validator : Y.Lang.isNumber
640 },
641 cohortsAvailable : {
642 value : null
a70eb30f
SH
643 }
644 }
645 });
646 Y.augment(USERENROLLER, Y.EventTarget);
647
b69ca6be
SH
648 M.enrol_manual = M.enrol_manual || {};
649 M.enrol_manual.quickenrolment = {
a70eb30f
SH
650 init : function(cfg) {
651 new USERENROLLER(cfg);
652 }
653 }
654
d2a27ab0 655}, '@VERSION@', {requires:['base','node', 'overlay', 'io-base', 'test', 'json-parse', 'event-delegate', 'dd-plugin', 'event-key', 'moodle-core-notification']});