MDL-31830 course: improvements to JS coding style
[moodle.git] / course / yui / src / management / js / console.js
1 /**
2  * Provides drop down menus for list of action links.
3  *
4  * @module moodle-course-management
5  */
7 /**
8  * Management JS console.
9  *
10  * Provides the organisation for course and category management JS.
11  *
12  * @namespace M.course.management
13  * @class Console
14  * @constructor
15  * @extends Y.Base
16  */
17 function Console() {
18     Console.superclass.constructor.apply(this, arguments);
19 }
20 Console.NAME = 'moodle-course-management';
21 Console.CSS_PREFIX = 'management';
22 Console.ATTRS = {
23     /**
24      * The HTML element containing the management interface.
25      * @attribute element
26      * @type Node
27      */
28     element : {
29         setter : function(node) {
30             if (typeof node === 'string') {
31                 node = Y.one('#'+node);
32             }
33             return node;
34         }
35     },
37     /**
38      * The category listing container node.
39      * @attribute categorylisting
40      * @type Node
41      * @default null
42      */
43     categorylisting : {
44         value : null
45     },
47     /**
48      * The course listing container node.
49      * @attribute courselisting
50      * @type Node
51      * @default null
52      */
53     courselisting : {
54         value : null
55     },
57     /**
58      * The course details container node.
59      * @attribute coursedetails
60      * @type Node|null
61      * @default null
62      */
63     coursedetails : {
64         value : null
65     },
67     /**
68      * The id of the currently active category.
69      * @attribute activecategoryid
70      * @type Number
71      * @default null
72      */
73     activecategoryid : {
74         value : null
75     },
77     /**
78      * The id of the currently active course.
79      * @attribute activecourseid
80      * @type Number
81      * @default Null
82      */
83     activecourseid : {
84         value : null
85     },
87     /**
88      * The categories that are currently available through the management interface.
89      * @attribute categories
90      * @type Array
91      * @default []
92      */
93     categories : {
94         setter : function(item, name) {
95             if (Y.Lang.isArray(item)) {
96                 return item;
97             }
98             var items = this.get(name);
99             items.push(item);
100             return items;
101         },
102         value : []
103     },
105     /**
106      * The courses that are currently available through the management interface.
107      * @attribute courses
108      * @type Course[]
109      * @default Array
110      */
111     courses : {
112         validator : function(val) {
113             return Y.Lang.isArray(val);
114         },
115         value : []
116     },
118     /**
119      * The currently displayed page of courses.
120      * @attribute page
121      * @type Number
122      * @default null
123      */
124     page : {
125         getter : function(value, name) {
126             if (value === null) {
127                 value = this.get('element').getData(name);
128                 this.set(name, value);
129             }
130             return value;
131         },
132         value : null
133     },
135     /**
136      * The total pages of courses that can be shown for this category.
137      * @attribute totalpages
138      * @type Number
139      * @default null
140      */
141     totalpages : {
142         getter : function(value, name) {
143             if (value === null) {
144                 value = this.get('element').getData(name);
145                 this.set(name, value);
146             }
147             return value;
148         },
149         value : null
150     },
152     /**
153      * The total number of courses belonging to this category.
154      * @attribute totalcourses
155      * @type Number
156      * @default null
157      */
158     totalcourses : {
159         getter : function(value, name) {
160             if (value === null) {
161                 value = this.get('element').getData(name);
162                 this.set(name, value);
163             }
164             return value;
165         },
166         value : null
167     },
169     /**
170      * The URL to use for AJAX actions/requests.
171      * @attribute ajaxurl
172      * @type String
173      * @default /course/ajax/management.php
174      */
175     ajaxurl : {
176         getter : function(value) {
177             if (value === null) {
178                 value = M.cfg.wwwroot + '/course/ajax/management.php';
179             }
180             return value;
181         },
182         value : null
183     },
185     /**
186      * The drag drop handler
187      * @attribute dragdrop
188      * @type DragDrop
189      * @default null
190      */
191     dragdrop : {
192         value : null
193     }
194 };
195 Console.prototype = {
197     /**
198      * Gets set to true once the first categories have been initialised.
199      * @property categoriesinit
200      * @private
201      * @type {boolean}
202      */
203     categoriesinit : false,
205     /**
206      * Initialises a new instance of the Console.
207      * @method initializer
208      */
209     initializer : function() {
210         Y.log('Initialising course category management console', 'info', 'moodle-course-management');
211         this.set('element', 'coursecat-management');
212         var element = this.get('element'),
213             categorylisting = element.one('#category-listing'),
214             courselisting = element.one('#course-listing'),
215             selectedcategory = null,
216             selectedcourse = null;
218         if (categorylisting) {
219             selectedcategory = categorylisting.one('.listitem[data-selected="1"]');
220         }
221         if (courselisting) {
222             selectedcourse = courselisting.one('.listitem[data-selected="1"]');
223         }
224         this.set('categorylisting', categorylisting);
225         this.set('courselisting', courselisting);
226         this.set('coursedetails', element.one('#course-detail'));
227         if (selectedcategory) {
228             this.set('activecategoryid', selectedcategory.getData('id'));
229         }
230         if (selectedcourse) {
231             this.set('activecourseid', selectedcourse.getData('id'));
232         }
233         this.initialiseCategories(categorylisting);
234         this.initialiseCourses();
236         if (courselisting) {
237             // No need for dragdrop if we don't have a course listing.
238             this.set('dragdrop', new DragDrop({console:this}));
239         }
240     },
242     /**
243      * Initialises all the categories being shown.
244      * @method initialiseCategories
245      * @private
246      * @returns {boolean}
247      */
248     initialiseCategories : function(listing) {
249         var count = 0;
250         if (!listing) {
251             return false;
252         }
253         listing.all('.listitem[data-id]').each(function(node){
254             this.set('categories', new Category({
255                 node : node,
256                 console : this
257             }));
258             count++;
259         }, this);
260         if (!this.categoriesinit) {
261             this.get('categorylisting').delegate('click', this.handleCategoryDelegation, 'a[data-action]', this);
262             this.categoriesinit = true;
263             Y.log(count+' categories being managed', 'info', 'moodle-course-management');
264         } else {
265             Y.log(count+' new categories being managed', 'info', 'moodle-course-management');
266         }
267     },
269     /**
270      * Initialises all the categories being shown.
271      * @method initialiseCourses
272      * @private
273      * @returns {boolean}
274      */
275     initialiseCourses : function() {
276         var category = this.getCategoryById(this.get('activecategoryid')),
277             listing = this.get('courselisting'),
278             count = 0;
279         if (!listing) {
280             return false;
281         }
282         if (!category) {
283             Y.log('Couldn\'t find the current category object.', 'warn', 'moodle-course-management');
284             return false;
285         }
286         listing.all('.listitem[data-id]').each(function(node){
287             this.registerCourse(new Course({
288                 node : node,
289                 console : this,
290                 category : category
291             }));
292             count++;
293         }, this);
294         listing.delegate('click', this.handleCourseDelegation, 'a[data-action]', this);
295         Y.log(count+' courses being managed', 'info', 'moodle-course-management');
296     },
298     /**
299      * Registers a course within the management display.
300      * @method registerCourse
301      * @param {Course} course
302      */
303     registerCourse : function(course) {
304         var courses = this.get('courses');
305         courses.push(course);
306         this.set('courses', courses);
307     },
309     /**
310      * Handles the event fired by a delegated course listener.
311      *
312      * @method handleCourseDelegation
313      * @protected
314      * @param {EventFacade} e
315      */
316     handleCourseDelegation : function(e) {
317         var target = e.currentTarget,
318             action = target.getData('action'),
319             courseid = target.ancestor('.listitem').getData('id'),
320             course = this.getCourseById(courseid);
321         if (course) {
322             course.handle(action, e);
323         } else {
324             Y.log('Course with ID '+courseid+' could not be found for delegation', 'error', 'moodle-course-management');
325         }
326     },
328     /**
329      * Handles the event fired by a delegated course listener.
330      *
331      * @method handleCategoryDelegation
332      * @protected
333      * @param {EventFacade} e
334      */
335     handleCategoryDelegation : function(e) {
336         var target = e.currentTarget,
337             action = target.getData('action'),
338             categoryid = target.ancestor('.listitem').getData('id'),
339             category = this.getCategoryById(categoryid);
340         if (category) {
341             category.handle(action, e);
342         } else {
343             Y.log('Could not find category to delegate to.', 'error', 'moodle-course-management');
344         }
345     },
347     /**
348      * Returns the category with the given ID.
349      * @method getCategoryById
350      * @param {Number} id
351      * @returns {Category|Boolean} The category or false if it can't be found.
352      */
353     getCategoryById : function(id) {
354         var i,
355             category,
356             categories = this.get('categories'),
357             length = categories.length;
358         for (i = 0; i < length; i++) {
359             category = categories[i];
360             if (category.get('categoryid') === id) {
361                 return category;
362             }
363         }
364         return false;
365     },
367     /**
368      * Returns the course with the given id.
369      * @method getCourseById
370      * @param {Number} id
371      * @returns {Course|Boolean} The course or false if not found/
372      */
373     getCourseById : function(id) {
374         var i,
375             course,
376             courses = this.get('courses'),
377             length = courses.length;
378         for (i = 0; i < length; i++) {
379             if (!courses.hadOwnPropery(i)) {
380                 course = courses[i];
381                 if (course.get('courseid') === id) {
382                     return course;
383                 }
384             }
385         }
386         return id;
387     },
389     /**
390      * Removes the course with the given ID.
391      * @method removeCourseById
392      * @param {Number} id
393      */
394     removeCourseById : function() {
395         var courses = this.get('courses'),
396             length = courses.length,
397             course,
398             i;
399         for (i = 0; i < length; i++) {
400             course = courses[i];
401             if (course.get('courseid') === id) {
402                 courses.splice(i, 1);
403                 break;
404             }
405         }
406     },
408     /**
409      * Performs an AJAX action.
410      *
411      * @method performAjaxAction
412      * @param {String} action The action to perform.
413      * @param {Object} args The arguments to pass through with teh request.
414      * @param {Function} callback The function to call when all is done.
415      * @param {Object} context The object to use as the context for the callback.
416      */
417     performAjaxAction : function(action, args, callback, context) {
418         var io = new Y.IO();
419         args.action = action;
420         args.ajax = '1';
421         args.sesskey = M.cfg.sesskey;
422         io.send(this.get('ajaxurl'), {
423             method : 'POST',
424             on : {
425                 complete : callback
426             },
427             context : context,
428             data : build_querystring(args),
429             'arguments' : args
430         });
431     }
432 };
433 Y.extend(Console, Y.Base, Console.prototype);
435 M.course = M.course || {};
436 M.course.management = M.course.management || {};
437 M.course.management.console = null;
439 /**
440  * Initalises the course management console.
441  * @static
442  * @param {Object} config
443  */
444 M.course.management.init = function(config) {
445     M.course.management.console = new Console(config);
446 };