MDL-34737 Course: Modchooser should use coursebase to determine the section class
[moodle.git] / course / yui / build / moodle-course-modchooser / moodle-course-modchooser-debug.js
1 YUI.add('moodle-course-modchooser', function (Y, NAME) {
3 /**
4  * The activity chooser dialogue for courses.
5  *
6  * @module moodle-course-modchooser
7  */
9 var CSS = {
10     PAGECONTENT : 'body',
11     SECTION: null,
12     SECTIONMODCHOOSER : 'span.section-modchooser-link',
13     SITEMENU : 'div.block_site_main_menu',
14     SITETOPIC : 'div.sitetopic'
15 };
17 var MODCHOOSERNAME = 'course-modchooser';
19 /**
20  * The activity chooser dialogue for courses.
21  *
22  * @constructor
23  * @class M.course.modchooser
24  * @extends M.core.chooserdialogue
25  */
26 var MODCHOOSER = function() {
27     MODCHOOSER.superclass.constructor.apply(this, arguments);
28 };
30 Y.extend(MODCHOOSER, M.core.chooserdialogue, {
31     /**
32      * The current section ID.
33      *
34      * @property sectionid
35      * @private
36      * @type Number
37      * @default null
38      */
39     sectionid : null,
41     /**
42      * Set up the activity chooser.
43      *
44      * @method initializer
45      */
46     initializer : function() {
47         var sectionclass = M.course.format.get_sectionwrapperclass();
48         if (sectionclass) {
49             CSS.SECTION = '.' + sectionclass;
50         }
51         var dialogue = Y.one('.chooserdialoguebody');
52         var header = Y.one('.choosertitle');
53         var params = {};
54         this.setup_chooser_dialogue(dialogue, header, params);
56         // Initialize existing sections and register for dynamically created sections
57         this.setup_for_section();
58         M.course.coursebase.register_module(this);
60         // Catch the page toggle
61         Y.all('.block_settings #settingsnav .type_course .modchoosertoggle a').on('click', this.toggle_mod_chooser, this);
62     },
64     /**
65      * Update any section areas within the scope of the specified
66      * selector with AJAX equivalents
67      *
68      * @method setup_for_section
69      * @param baseselector The selector to limit scope to
70      */
71     setup_for_section : function(baseselector) {
72         if (!baseselector) {
73             baseselector = CSS.PAGECONTENT;
74         }
76         // Setup for site topics
77         Y.one(baseselector).all(CSS.SITETOPIC).each(function(section) {
78             this._setup_for_section(section);
79         }, this);
81         // Setup for standard course topics
82         if (CSS.SECTION) {
83             Y.one(baseselector).all(CSS.SECTION).each(function(section) {
84                 this._setup_for_section(section);
85             }, this);
86         }
88         // Setup for the block site menu
89         Y.one(baseselector).all(CSS.SITEMENU).each(function(section) {
90             this._setup_for_section(section);
91         }, this);
92     },
94     /**
95      * Update any section areas within the scope of the specified
96      * selector with AJAX equivalents
97      *
98      * @method _setup_for_section
99      * @private
100      * @param baseselector The selector to limit scope to
101      */
102     _setup_for_section : function(section) {
103         var chooserspan = section.one(CSS.SECTIONMODCHOOSER);
104         if (!chooserspan) {
105             return;
106         }
107         var chooserlink = Y.Node.create("<a href='#' />");
108         chooserspan.get('children').each(function(node) {
109             chooserlink.appendChild(node);
110         });
111         chooserspan.insertBefore(chooserlink);
112         chooserlink.on('click', this.display_mod_chooser, this);
113     },
114     /**
115      * Display the module chooser
116      *
117      * @method display_mod_chooser
118      * @param {EventFacade} e Triggering Event
119      */
120     display_mod_chooser : function (e) {
121         // Set the section for this version of the dialogue
122         if (e.target.ancestor(CSS.SITETOPIC)) {
123             // The site topic has a sectionid of 1
124             this.sectionid = 1;
125         } else if (e.target.ancestor(CSS.SECTION)) {
126             var section = e.target.ancestor(CSS.SECTION);
127             this.sectionid = section.get('id').replace('section-', '');
128         } else if (e.target.ancestor(CSS.SITEMENU)) {
129             // The block site menu has a sectionid of 0
130             this.sectionid = 0;
131         }
132         this.display_chooser(e);
133     },
135     /**
136      * Toggle availability of the activity chooser.
137      *
138      * @method toggle_mod_chooser
139      * @param {EventFacade} e
140      */
141     toggle_mod_chooser : function(e) {
142         // Get the add section link
143         var modchooserlinks = Y.all('div.addresourcemodchooser');
145         // Get the dropdowns
146         var dropdowns = Y.all('div.addresourcedropdown');
148         if (modchooserlinks.size() === 0) {
149             // Continue with non-js action if there are no modchoosers to add
150             return;
151         }
153         // We need to update the text and link
154         var togglelink = Y.one('.block_settings #settingsnav .type_course .modchoosertoggle a');
156         // The actual text is in the last child
157         var toggletext = togglelink.get('lastChild');
159         var usemodchooser;
160         // Determine whether they're currently hidden
161         if (modchooserlinks.item(0).hasClass('visibleifjs')) {
162             // The modchooser is currently visible, hide it
163             usemodchooser = 0;
164             modchooserlinks
165                 .removeClass('visibleifjs')
166                 .addClass('hiddenifjs');
167             dropdowns
168                 .addClass('visibleifjs')
169                 .removeClass('hiddenifjs');
170             toggletext.set('data', M.util.get_string('modchooserenable', 'moodle'));
171             togglelink.set('href', togglelink.get('href').replace('off', 'on'));
172         } else {
173             // The modchooser is currently not visible, show it
174             usemodchooser = 1;
175             modchooserlinks
176                 .addClass('visibleifjs')
177                 .removeClass('hiddenifjs');
178             dropdowns
179                 .removeClass('visibleifjs')
180                 .addClass('hiddenifjs');
181             toggletext.set('data', M.util.get_string('modchooserdisable', 'moodle'));
182             togglelink.set('href', togglelink.get('href').replace('on', 'off'));
183         }
185         M.util.set_user_preference('usemodchooser', usemodchooser);
187         // Prevent the page from reloading
188         e.preventDefault();
189     },
191     /**
192      * Helper function to set the value of a hidden radio button when a
193      * selection is made.
194      *
195      * @method option_selected
196      * @param {String} thisoption The selected option value
197      * @private
198      */
199     option_selected : function(thisoption) {
200         // Add the sectionid to the URL.
201         this.hiddenRadioValue.setAttrs({
202             name: 'jump',
203             value: thisoption.get('value') + '&section=' + this.sectionid
204         });
205     }
206 },
208     NAME : MODCHOOSERNAME,
209     ATTRS : {
210         /**
211          * The maximum height (in pixels) of the activity chooser.
212          *
213          * @attribute maxheight
214          * @type Number
215          * @default 800
216          */
217         maxheight : {
218             value : 800
219         }
220     }
221 });
222 M.course = M.course || {};
223 M.course.init_chooser = function(config) {
224     return new MODCHOOSER(config);
225 };
228 }, '@VERSION@', {"requires": ["moodle-core-chooserdialogue", "moodle-course-coursebase"]});