59b662adf6f35c461f2036432b2b0a9db75cf4b8
[moodle.git] / course / yui / src / management / js / category.js
1 /**
2  * A managed category.
3  *
4  * @namespace M.core_course.management
5  * @class Category
6  * @constructor
7  * @extends Item
8  */
9 function Category() {
10     Category.superclass.constructor.apply(this, arguments);
11 }
12 Category.NAME = 'moodle-course-management-category';
13 Category.CSS_PREFIX = 'management-category';
14 Category.ATTRS = {
15     /**
16      * The category ID relating to this category.
17      * @attribute categoryid
18      * @type Int
19      */
20     categoryid : {},
22     /**
23      * True if this category is the currently selected category.
24      * @attribute selected
25      * @type Boolean
26      * @default null
27      */
28     selected : {
29         getter : function(value, name) {
30             if (value === null) {
31                 value = this.get('node').getData(name);
32                 if (value === null) {
33                     value = false;
34                 }
35                 this.set(name, value);
36             }
37             return value;
38         },
39         value : null
40     },
42     /**
43      * An array fo courses belonging to this category
44      * @attribute courses
45      * @type Course[]
46      * @default []
47      */
48     courses : {
49         setter : function(item, name) {
50             if (Y.Lang.isArray(item)) {
51                 return item;
52             }
53             var items = this.get(name);
54             items.push(item);
55             return items;
56         },
57         value : []
58     }
59 };
60 Category.prototype = {
61     /**
62      * Initialises an instance of a Category.
63      * @method initializer
64      */
65     initializer : function() {
66         var node = this.get('node');
67         this.set('categoryid', node.getData('id'));
68         this.set('itemname', 'category');
69     },
71     /**
72      * Returns the name of the category.
73      * @method getName
74      * @returns {String}
75      */
76     getName : function() {
77         return this.get('node').one('a.categoryname').get('innerHTML');
78     },
80     /**
81      * Registers a course as belonging to this category.
82      * @method register_course
83      * @param {Course} course
84      */
85     register_course : function(course) {
86         this.set('courses', course);
87     },
89     /**
90      * Handles a category related event.
91      *
92      * @method handle
93      * @param {String} action
94      * @param {EventFacade} e
95      * @returns {Boolean}
96      */
97     handle : function(action, e) {
98         var catarg = {categoryid : this.get('categoryid')};
99         switch (action) {
100             case 'moveup':
101                 e.halt();
102                 this.get('console').perform_ajax_action('movecategoryup', catarg, this.moveup, this);
103                 break;
104             case 'movedown':
105                 e.halt();
106                 this.get('console').perform_ajax_action('movecategorydown', catarg, this.movedown, this);
107                 break;
108             case 'show':
109                 e.halt();
110                 this.get('console').perform_ajax_action('showcategory', catarg, this.show, this);
111                 break;
112             case 'hide':
113                 e.halt();
114                 this.get('console').perform_ajax_action('hidecategory', catarg, this.hide, this);
115                 break;
116             case 'expand':
117                 e.halt();
118                 if (this.get('node').getData('expanded') === '0') {
119                     this.get('node').setData('expanded', true);
120                     this.get('console').perform_ajax_action('getsubcategorieshtml', catarg, this.loadSubcategories, this);
121                 }
122                 this.expand();
123                 break;
124             case 'collapse':
125                 e.halt();
126                 this.collapse();
127                 break;
128             default:
129                 Y.log('Invalid AJAX action requested of managed category.', 'warn', 'core_course');
130                 return false;
131         }
132     },
134     /**
135      * Expands the category making its sub categories visible.
136      * @method expand
137      */
138     expand : function() {
139         var node = this.get('node'),
140             action = node.one('a[data-action=expand]');
141         node.removeClass('collapsed');
142         action.setAttribute('data-action', 'collapse');
143         action.one('img').setAttrs({
144             src : M.util.image_url('t/switch_minus', 'moodle'),
145             title : M.util.get_string('collapse', 'moodle'),
146             alt : M.util.get_string('collapse', 'moodle')
147         });
148     },
150     /**
151      * Collapses the category making its sub categories hidden.
152      * @method collapse
153      */
154     collapse : function() {
155         var node = this.get('node'),
156             action = node.one('a[data-action=collapse]');
157         node.addClass('collapsed');
158         action.setAttribute('data-action', 'expand');
159         action.one('img').setAttrs({
160             src : M.util.image_url('t/switch_plus', 'moodle'),
161             title : M.util.get_string('expand', 'moodle'),
162             alt : M.util.get_string('expand', 'moodle')
163         });
164     },
166     /**
167      * Loads sub categories provided by an AJAX request..
168      *
169      * @method loadSubcategories
170      * @protected
171      * @param {Int} transactionid The transaction ID of the AJAX request (unique)
172      * @param {Object} response The response from the AJAX request.
173      * @param {Object} args The arguments given to the request.
174      * @returns {Boolean}
175      */
176     loadSubcategories : function(transactionid, response, args) {
177         var outcome = this.check_ajax_response(transactionid, response, args),
178             node = this.get('node'),
179             console = this.get('console');
180         if (outcome === false) {
181             Y.log('AJAX failed to load sub categories for '+this.get('itemname'), 'warn', 'core_course');
182             return false;
183         }
184         Y.log('AJAX loaded subcategories for '+this.get('itemname'), 'info', 'core_course');
185         node.append(outcome.html);
186         console.initialise_categories(node);
187         if (M.core && M.core.actionmenu && M.core.actionmenu.newDOMNode) {
188             M.core.actionmenu.newDOMNode(node);
189         }
190     },
192     /**
193      * Moves the course to this category.
194      *
195      * @method moveCourseTo
196      * @param {Course} course
197      */
198     moveCourseTo : function(course) {
199         var self = this;
200         Y.use('moodle-core-notification-confirm', function() {
201             var confirm = new M.core.confirm({
202                 title : M.util.get_string('confirm', 'moodle'),
203                 question : M.util.get_string('confirmcoursemove', 'moodle', {
204                     course : course.getName(),
205                     category : self.getName()
206                 }),
207                 yesLabel : M.util.get_string('yes', 'moodle'),
208                 noLabel : M.util.get_string('no', 'moodle')
209             });
210             confirm.on('complete-yes', function() {
211                 confirm.hide();
212                 confirm.destroy();
213                 this.get('console').perform_ajax_action('movecourseintocategory', {
214                     categoryid : this.get('categoryid'),
215                     courseid : course.get('courseid')
216                 }, this.completeMoveCourse, this);
217             }, self);
218             confirm.show();
219         });
220     },
222     /**
223      * Completes moving a course to this category.
224      * @method completeMoveCourse
225      * @protected
226      * @param {Int} transactionid The transaction ID of the AJAX request (unique)
227      * @param {Object} response The response from the AJAX request.
228      * @param {Object} args The arguments given to the request.
229      * @returns {Boolean}
230      */
231     completeMoveCourse : function(transactionid, response, args) {
232         var outcome = this.check_ajax_response(transactionid, response, args),
233             course;
234         if (outcome === false) {
235             Y.log('AJAX failed to move courses into this category: '+this.get('itemname'), 'warn', 'core_course');
236             return false;
237         }
238         course = this.get('console').get_course_by_id(args.courseid);
239         Y.log('Moved the course ('+course.getName()+') into this category ('+this.getName()+')', 'info', 'core_course');
240         this.highlight();
241         if (course) {
242             course.remove();
243         }
244         return true;
245     },
247     /**
248      * Makes an item visible.
249      *
250      * @method show
251      * @param {Int} transactionid The transaction ID of the AJAX request (unique)
252      * @param {Object} response The response from the AJAX request.
253      * @param {Object} args The arguments given to the request.
254      * @returns {Boolean}
255      */
256     show : function(transactionid, response, args) {
257         var outcome = this.check_ajax_response(transactionid, response, args);
258         if (outcome === false) {
259             Y.log('AJAX request to show '+this.get('itemname')+' by outcome.', 'warn', 'core_course');
260             return false;
261         }
263         this.markVisible();
264         if (outcome.categoryvisibility) {
265             this.updateChildVisibility(outcome.categoryvisibility);
266         }
267         if (outcome.coursevisibility) {
268             this.updateCourseVisiblity(outcome.coursevisibility);
269         }
270         this.updated();
271         Y.log('Success: category made visible by AJAX.', 'info', 'core_course');
272     },
274     /**
275      * Hides an item.
276      *
277      * @method hide
278      * @param {Int} transactionid The transaction ID of the AJAX request (unique)
279      * @param {Object} response The response from the AJAX request.
280      * @param {Object} args The arguments given to the request.
281      * @returns {Boolean}
282      */
283     hide : function(transactionid, response, args) {
284         var outcome = this.check_ajax_response(transactionid, response, args);
285         if (outcome === false) {
286             Y.log('AJAX request to hide '+this.get('itemname')+' by outcome.', 'warn', 'core_course');
287             return false;
288         }
289         this.markHidden();
290         if (outcome.categoryvisibility) {
291             this.updateChildVisibility(outcome.categoryvisibility);
292         }
293         if (outcome.coursevisibility) {
294             this.updateCourseVisiblity(outcome.coursevisibility);
295         }
296         this.updated();
297         Y.log('Success: '+this.get('itemname')+' made hidden by AJAX.', 'info', 'core_course');
298     },
300     /**
301      * Updates the visibility of child courses if required.
302      * @method updateCourseVisiblity
303      * @param courses
304      */
305     updateCourseVisiblity : function(courses) {
306         var console = this.get('console'),
307             key,
308             course;
309         try {
310             for (key in courses) {
311                 course = console.get_course_by_id(courses[key].id);
312                 if (course.get) {
313                     if (courses[key].show === "1") {
314                         course.markVisible();
315                     } else {
316                         course.markHidden();
317                     }
318                 }
319             }
320         } catch (err) {
321             Y.log('Error trying to update course visibility: ' + err.message, 'warn', 'core_course');
322         }
323     },
325     /**
326      * Updates the visibility of subcategories if required.
327      * @method updateChildVisibility
328      * @param categories
329      */
330     updateChildVisibility : function(categories) {
331         var console = this.get('console'),
332             key,
333             category;
334         try {
335             for (key in categories) {
336                 category = console.get_category_by_id(categories[key].id);
337                 if (category.get) {
338                     if (categories[key].show === "1") {
339                         category.markVisible();
340                     } else {
341                         category.markHidden();
342                     }
343                 }
344             }
345         } catch (err) {
346             Y.log('Error trying to update category visibility: ' + err.message, 'warn', 'core_course');
347         }
348     }
349 };
350 Y.extend(Category, Item, Category.prototype);