Commit | Line | Data |
---|---|---|
b69ca6be | 1 | YUI.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']}); |