b8f07db27db01079560db3d0829e19084d96a72e
[moodle.git] / course / yui / src / management / js / console.js
1 /**
2  * Provides drop down menus for list of action links.
3  *
4  * @module moodle-core_course-management
5  */
7 /**
8  * Management JS console.
9  *
10  * Provides the organisation for course and category management JS.
11  *
12  * @namespace M.core_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      */
42     categorylisting : {},
44     /**
45      * The course listing container node.
46      * @attribute courselisting
47      * @type Node
48      */
49     courselisting : {},
51     /**
52      * The course details container node.
53      * @attribute coursedetails
54      * @type Node|null
55      * @default null
56      */
57     coursedetails : {
58         value: null
59     },
61     /**
62      * The id of the currently active category.
63      * @attribute activecategoryid
64      * @type Int
65      */
66     activecategoryid : {},
68     /**
69      * The id of the currently active course.
70      * @attribute activecourseid
71      * @type Int
72      */
73     activecourseid : {},
75     /**
76      * The categories that are currently available through the management interface.
77      * @attribute categories
78      * @type Array
79      * @default []
80      */
81     categories : {
82         setter : function(item, name) {
83             if (Y.Lang.isArray(item)) {
84                 return item;
85             }
86             var items = this.get(name);
87             items.push(item);
88             return items;
89         },
90         value : []
91     },
93     /**
94      * The courses that are currently available through the management interface.
95      * @attribute courses
96      * @type Array
97      * @default []
98      */
99     courses : {
100         setter : function(item, name) {
101             if (Y.Lang.isArray(item)) {
102                 return item;
103             }
104             var items = this.get(name);
105             items.push(item);
106             return items;
107         },
108         value : []
109     },
111     /**
112      * The currently displayed page of courses.
113      * @attribute page
114      * @type Int
115      * @default null
116      */
117     page : {
118         getter : function(value, name) {
119             if (value === null) {
120                 value = this.get('element').getData(name);
121                 this.set(name, value);
122             }
123             return value;
124         },
125         value : null
126     },
128     /**
129      * The total pages of courses that can be shown for this category.
130      * @attribute totalpages
131      * @type Int
132      * @default null
133      */
134     totalpages : {
135         getter : function(value, name) {
136             if (value === null) {
137                 value = this.get('element').getData(name);
138                 this.set(name, value);
139             }
140             return value;
141         },
142         value : null
143     },
145     /**
146      * The total number of courses belonging to this category.
147      * @attribute totalcourses
148      * @type Int
149      * @default null
150      */
151     totalcourses : {
152         getter : function(value, name) {
153             if (value === null) {
154                 value = this.get('element').getData(name);
155                 this.set(name, value);
156             }
157             return value;
158         },
159         value : null
160     },
162     /**
163      * The URL to use for AJAX actions/requests.
164      * @attribute ajaxurl
165      * @type String
166      * @default /course/ajax/management.php
167      */
168     ajaxurl : {
169         getter : function(value) {
170             if (value === null) {
171                 value = M.cfg.wwwroot + '/course/ajax/management.php';
172             }
173             return value;
174         },
175         value : null
176     },
178     /**
179      * The drag drop handler
180      * @attribute dragdrop
181      * @type DragDrop
182      * @default null
183      */
184     dragdrop : {
185         value : null
186     }
187 };
188 Console.prototype = {
190     /**
191      * Gets set to true once the first categories have been initialised.
192      * @property categoriesinit
193      * @private
194      * @type {boolean}
195      */
196     categoriesinit : false,
198     /**
199      * Initialises a new instance of the Console.
200      * @method initializer
201      */
202     initializer : function() {
203         Y.log('Initialising course category management console', 'note', 'core_course');
204         this.set('element', 'coursecat-management');
205         var element = this.get('element'),
206             categorylisting = element.one('#category-listing'),
207             courselisting = element.one('#course-listing'),
208             selectedcategory = null,
209             selectedcourse = null;
211         if (categorylisting) {
212             selectedcategory = categorylisting.one('.listitem[data-selected="1"]');
213         }
214         if (courselisting) {
215             selectedcourse = courselisting.one('.listitem[data-selected="1"]');
216         }
217         this.set('categorylisting', categorylisting);
218         this.set('courselisting', courselisting);
219         this.set('coursedetails', element.one('#course-detail'));
220         if (selectedcategory) {
221             this.set('activecategoryid', selectedcategory.getData('id'));
222         }
223         if (selectedcourse) {
224             this.set('activecourseid', selectedcourse.getData('id'));
225         }
226         this.initialise_categories(categorylisting);
227         this.initialise_courses();
229         if (courselisting) {
230             // No need for dragdrop if we don't have a course listing.
231             this.set('dragdrop', new DragDrop({console:this}));
232         }
233     },
235     /**
236      * Initialises all the categories being shown.
237      * @method initialise_categories
238      * @private
239      * @returns {boolean}
240      */
241     initialise_categories : function(listing) {
242         var count = 0;
243         if (!listing) {
244             return false;
245         }
246         listing.all('.listitem[data-id]').each(function(node){
247             this.set('categories', new Category({
248                 node : node,
249                 console : this
250             }));
251             count++;
252         }, this);
253         if (!this.categoriesinit) {
254             this.get('categorylisting').delegate('click', this.handle_category_delegation, 'a[data-action]', this);
255             this.categoriesinit = true;
256             Y.log(count+' categories being managed', 'note', 'core_course');
257         } else {
258             Y.log(count+' new categories being managed', 'note', 'core_course');
259         }
260     },
262     /**
263      * Initialises all the categories being shown.
264      * @method initialise_courses
265      * @private
266      * @returns {boolean}
267      */
268     initialise_courses : function() {
269         var category = this.get_category_by_id(this.get('activecategoryid')),
270             listing = this.get('courselisting'),
271             count = 0;
272         if (!listing) {
273             return false;
274         }
275         listing.all('.listitem[data-id]').each(function(node){
276             this.set('courses', new Course({
277                 node : node,
278                 console : this,
279                 category : category
280             }));
281             count++;
282         }, this);
283         listing.delegate('click', this.handle_course_delegation, 'a[data-action]', this);
284         Y.log(count+' courses being managed', 'note', 'core_course');
285     },
287     /**
288      * Handles the event fired by a delegated course listener.
289      *
290      * @method handle_course_delegation
291      * @protected
292      * @param {EventFacade} e
293      */
294     handle_course_delegation : function(e) {
295         var target = e.currentTarget,
296             action = target.getData('action'),
297             courseid = target.ancestor('.listitem').getData('id'),
298             course = this.get_course_by_id(courseid);
299         course.handle(action, e);
300     },
302     /**
303      * Handles the event fired by a delegated course listener.
304      *
305      * @method handle_category_delegation
306      * @protected
307      * @param {EventFacade} e
308      */
309     handle_category_delegation : function(e) {
310         var target = e.currentTarget,
311             action = target.getData('action'),
312             categoryid = target.ancestor('.listitem').getData('id'),
313             category = this.get_category_by_id(categoryid);
314         category.handle(action, e);
315     },
317     /**
318      * Returns the category with the given ID.
319      * @method get_category_by_id
320      * @param {Int} id
321      * @returns {Category|Int} The category or the categoryid given if there is no matching category.
322      */
323     get_category_by_id : function(id) {
324         var i, category, categories = this.get('categories'), length = categories.length;
325         for (i = 0; i < length; i++) {
326             category = categories[i];
327             if (category.get('categoryid') === id) {
328                 return category;
329             }
330         }
331         return id;
332     },
334     /**
335      * Returns the course with the given id.
336      * @method get_course_by_id
337      * @param {Int} id
338      * @returns {Category|Int} The course or the courseid given if there is no matching category.
339      */
340     get_course_by_id : function(id) {
341         var i, course, courses = this.get('courses'), length = courses.length;
342         for (i = 0; i < length; i++) {
343             course = courses[i];
344             if (course.get('courseid') === id) {
345                 return course;
346             }
347         }
348         return false;
349     },
351     /**
352      * Removes the course with the given ID.
353      * @method remove_course_by_id
354      * @param {Int} id
355      */
356     remove_course_by_id : function() {
357         var courses = this.get('courses'),
358             i;
359         for (i = 0; i < length; i++) {
360             course = courses[i];
361             if (course.get('courseid') === id) {
362                 courses.splice(i, 1);
363                 break;
364             }
365         }
366     },
368     /**
369      * Performs an AJAX action.
370      *
371      * @method perform_ajax_action
372      * @param {String} action The action to perform.
373      * @param {Object} args The arguments to pass through with teh request.
374      * @param {Function} callback The function to call when all is done.
375      * @param {Object} context The object to use as the context for the callback.
376      */
377     perform_ajax_action : function(action, args, callback, context) {
378         var io = new Y.IO();
379         args.action = action;
380         args.ajax = '1';
381         args.sesskey = M.cfg.sesskey;
382         io.send(this.get('ajaxurl'), {
383             method : 'POST',
384             on : {
385                 complete : callback
386             },
387             context : context,
388             data : build_querystring(args),
389             'arguments' : args
390         });
391     }
392 };
393 Y.extend(Console, Y.Base, Console.prototype);
395 /**
396  * Course namespace.
397  * @static
398  * @namespace M
399  * @class course
400  */
401 M.course = M.course || {};
403 /**
404  * Initalises the course management console.
405  * @static
406  * @param {Object} config
407  */
408 M.course.init_management = function(config) {
409     M.course.console = new Console(config);
410 };