MDL-31830 course: improvements to JS coding style
[moodle.git] / course / yui / src / management / js / item.js
1 /**
2  * A managed course.
3  *
4  * @namespace M.course.management
5  * @class Item
6  * @constructor
7  * @extends Y.Base
8  * @abstract
9  */
10 function Item() {
11     Item.superclass.constructor.apply(this, arguments);
12 }
13 Item.NAME = 'moodle-course-management-item';
14 Item.CSS_PREFIX = 'management-item';
15 Item.ATTRS = {
16     /**
17      * The node for this item.
18      * @attribute node
19      * @type Node
20      */
21     node : {},
23     /**
24      * The management console.
25      * @attribute console
26      * @type Console
27      */
28     console : {},
30     /**
31      * Describes the type of this item. Should be set by the extending class.
32      * @attribute itemname
33      * @type {String}
34      * @default item
35      */
36     itemname : {
37         value : 'item'
38     }
39 };
40 Item.prototype = {
41     /**
42      * The highlight timeout for this item if there is one.
43      * @property highlighttimeout
44      * @protected
45      * @type Timeout
46      * @default null
47      */
48     highlighttimeout : null,
50     /**
51      * Checks and parses an AJAX response for an item.
52      *
53      * @method checkAjaxResponse
54      * @protected
55      * @param {Number} transactionid The transaction ID of the AJAX request (unique)
56      * @param {Object} response The response from the AJAX request.
57      * @param {Object} args The arguments given to the request.
58      * @returns {Object|Boolean}
59      */
60     checkAjaxResponse : function(transactionid, response, args) {
61         if (response.status !== 200) {
62             Y.log('Error: AJAX response resulted in non 200 status.', 'error', 'Item.checkAjaxResponse');
63             return false;
64         }
65         if (transactionid === null || args === null) {
66             Y.log('Error: Invalid AJAX response details provided.', 'error', 'Item.checkAjaxResponse');
67             return false;
68         }
69         var outcome = Y.JSON.parse(response.responseText);
70         if (outcome.error !== false) {
71             new M.core.exception(outcome);
72         }
73         if (outcome.outcome === false) {
74             return false;
75         }
76         return outcome;
77     },
79     /**
80      * Moves an item up by one.
81      *
82      * @method moveup
83      * @param {Number} transactionid The transaction ID of the AJAX request (unique)
84      * @param {Object} response The response from the AJAX request.
85      * @param {Object} args The arguments given to the request.
86      * @returns {Boolean}
87      */
88     moveup : function(transactionid, response, args) {
89         var node,
90             nodeup,
91             nodedown,
92             previous,
93             previousup,
94             previousdown,
95             tmpnode,
96             outcome = this.checkAjaxResponse(transactionid, response, args);
97         if (outcome === false) {
98             Y.log('AJAX request to move '+this.get('itemname')+' up failed by outcome.', 'warn', 'moodle-course-management');
99             return false;
100         }
101         node = this.get('node');
102         previous = node.previous('.listitem');
103         if (previous) {
104             previous.insert(node, 'before');
105             previousup = previous.one(' > div a.action-moveup');
106             nodedown = node.one(' > div a.action-movedown');
107             if (!previousup || !nodedown) {
108                 // We can have two situations here:
109                 //   1. previousup is not set and nodedown is not set. This happens when there are only two courses.
110                 //   2. nodedown is not set. This happens when they are moving the bottom course up.
111                 // node up and previous down should always be there. They would be required to trigger the action.
112                 nodeup = node.one(' > div a.action-moveup');
113                 previousdown = previous.one(' > div a.action-movedown');
114                 if (!previousup && !nodedown) {
115                     // Ok, must be two courses. We need to switch the up and down icons.
116                     tmpnode = Y.Node.create('<a style="visibility:hidden;">&nbsp;</a>');
117                     previousdown.replace(tmpnode);
118                     nodeup.replace(previousdown);
119                     tmpnode.replace(nodeup);
120                     tmpnode.destroy();
121                 } else if (!nodedown) {
122                     // previous down needs to be given to node.
123                     nodeup.insert(previousdown, 'after');
124                 }
125             }
126             this.updated(true);
127             Y.log('Success: '+this.get('itemname')+' moved up by AJAX.', 'info', 'moodle-course-management');
128         } else {
129             Y.log(this.get('itemname')+' cannot be moved up as its the top item', 'warn', 'moodle-course-management');
130         }
131     },
133     /**
134      * Moves an item down by one.
135      *
136      * @method movedown
137      * @param {Number} transactionid The transaction ID of the AJAX request (unique)
138      * @param {Object} response The response from the AJAX request.
139      * @param {Object} args The arguments given to the request.
140      * @returns {Boolean}
141      */
142     movedown : function(transactionid, response, args) {
143         var node,
144             next,
145             nodeup,
146             nodedown,
147             nextup,
148             nextdown,
149             tmpnode,
150             outcome = this.checkAjaxResponse(transactionid, response, args);
151         if (outcome === false) {
152             Y.log('AJAX request to move '+this.get('itemname')+' down failed by outcome.', 'warn', 'moodle-course-management');
153             return false;
154         }
155         node = this.get('node');
156         next = node.next('.listitem');
157         if (next) {
158             node.insert(next, 'before');
159             nextdown = next.one(' > div a.action-movedown');
160             nodeup = node.one(' > div a.action-moveup');
161             if (!nextdown || !nodeup) {
162                 // next up and node down should always be there. They would be required to trigger the action.
163                 nextup = next.one(' > div a.action-moveup');
164                 nodedown = node.one(' > div a.action-movedown');
165                 if (!nextdown && !nodeup) {
166                     // We can have two situations here:
167                     //   1. nextdown is not set and nodeup is not set. This happens when there are only two courses.
168                     //   2. nodeup is not set. This happens when we are moving the first course down.
169                     // Ok, must be two courses. We need to switch the up and down icons.
170                     tmpnode = Y.Node.create('<a style="visibility:hidden;">&nbsp;</a>');
171                     nextup.replace(tmpnode);
172                     nodedown.replace(nextup);
173                     tmpnode.replace(nodedown);
174                     tmpnode.destroy();
175                 } else if (!nodeup) {
176                     // next up needs to be given to node.
177                     nodedown.insert(nextup, 'before');
178                 }
179             }
180             this.updated(true);
181             Y.log('Success: '+this.get('itemname')+' moved down by AJAX.', 'info', 'moodle-course-management');
182         } else {
183             Y.log(this.get('itemname')+' cannot be moved down as its the last item', 'warn', 'moodle-course-management');
184         }
185     },
187     /**
188      * Makes an item visible.
189      *
190      * @method show
191      * @param {Number} transactionid The transaction ID of the AJAX request (unique)
192      * @param {Object} response The response from the AJAX request.
193      * @param {Object} args The arguments given to the request.
194      * @returns {Boolean}
195      */
196     show : function(transactionid, response, args) {
197         var outcome = this.checkAjaxResponse(transactionid, response, args);
198         if (outcome === false) {
199             Y.log('AJAX request to show '+this.get('itemname')+' by outcome.', 'warn', 'moodle-course-management');
200             return false;
201         }
203         this.markVisible();
204         this.updated();
205         Y.log('Success: '+this.get('itemname')+' made visible by AJAX.', 'info', 'moodle-course-management');
206     },
208     /**
209      * Marks the item as visible
210      * @method markVisible
211      */
212     markVisible : function() {
213         this.get('node').setAttribute('data-visible', '1');
214         Y.log('Marked '+this.get('itemname')+' as visible', 'info', 'moodle-course-management');
215         return true;
216     },
218     /**
219      * Hides an item.
220      *
221      * @method hide
222      * @param {Number} transactionid The transaction ID of the AJAX request (unique)
223      * @param {Object} response The response from the AJAX request.
224      * @param {Object} args The arguments given to the request.
225      * @returns {Boolean}
226      */
227     hide : function(transactionid, response, args) {
228         var outcome = this.checkAjaxResponse(transactionid, response, args);
229         if (outcome === false) {
230             Y.log('AJAX request to hide '+this.get('itemname')+' by outcome.', 'warn', 'moodle-course-management');
231             return false;
232         }
233         this.markHidden();
234         this.updated();
235         Y.log('Success: '+this.get('itemname')+' made hidden by AJAX.', 'info', 'moodle-course-management');
236     },
238     /**
239      * Marks the item as hidden.
240      * @method makeHidden
241      */
242     markHidden : function() {
243         this.get('node').setAttribute('data-visible', '0');
244         Y.log('Marked '+this.get('itemname')+' as hidden', 'info', 'moodle-course-management');
245         return true;
246     },
248     /**
249      * Called when ever a node is updated.
250      *
251      * @method updated
252      * @param {Boolean} moved True if this item was moved.
253      */
254     updated : function(moved) {
255         if (moved) {
256             this.highlight();
257         }
258     },
260     /**
261      * Highlights this option for a breif time.
262      *
263      * @method highlight
264      */
265     highlight : function() {
266         var node = this.get('node');
267         node.siblings('.highlight').removeClass('highlight');
268         node.addClass('highlight');
269         if (this.highlighttimeout) {
270             window.clearTimeout(this.highlighttimeout);
271         }
272         this.highlighttimeout = window.setTimeout(function(){
273             node.removeClass('highlight');
274         }, 2500);
275     }
276 };
277 Y.extend(Item, Y.Base, Item.prototype);