MDL-67264 core_course: Begin set up for Activity chooser
[moodle.git] / course / yui / src / modchooser / js / modchooser.js
1 /**
2  * The activity chooser dialogue for courses.
3  *
4  * @module moodle-course-modchooser
5  */
7 var CSS = {
8     PAGECONTENT: 'body',
9     SECTION: null,
10     SECTIONMODCHOOSER: 'button.section-modchooser-link',
11     SITEMENU: '.block_site_main_menu',
12     SITETOPIC: 'div.sitetopic'
13 };
15 var MODCHOOSERNAME = 'course-modchooser';
17 /**
18  * The activity chooser dialogue for courses.
19  *
20  * @constructor
21  * @class M.course.modchooser
22  * @extends M.core.chooserdialogue
23  */
24 var MODCHOOSER = function() {
25     MODCHOOSER.superclass.constructor.apply(this, arguments);
26 };
28 Y.extend(MODCHOOSER, M.core.chooserdialogue, {
29     /**
30      * The current section ID.
31      *
32      * @property sectionid
33      * @private
34      * @type Number
35      * @default null
36      */
37     sectionid: null,
39     /**
40      * Set up the activity chooser.
41      *
42      * @method initializer
43      */
44     initializer: function() {
45         var sectionclass = M.course.format.get_sectionwrapperclass();
46         if (sectionclass) {
47             CSS.SECTION = '.' + sectionclass;
48         }
49         var dialogue = Y.one('.chooserdialoguebody');
50         var header = Y.one('.choosertitle');
51         var params = {};
52         this.setup_chooser_dialogue(dialogue, header, params);
54         // Initialize existing sections and register for dynamically created sections
55         this.setup_for_section();
56         M.course.coursebase.register_module(this);
57     },
59     /**
60      * Update any section areas within the scope of the specified
61      * selector with AJAX equivalents
62      *
63      * @method setup_for_section
64      * @param baseselector The selector to limit scope to
65      */
66     setup_for_section: function(baseselector) {
67         if (!baseselector) {
68             baseselector = CSS.PAGECONTENT;
69         }
71         // Setup for site topics
72         Y.one(baseselector).all(CSS.SITETOPIC).each(function(section) {
73             this._setup_for_section(section);
74         }, this);
76         // Setup for standard course topics
77         if (CSS.SECTION) {
78             Y.one(baseselector).all(CSS.SECTION).each(function(section) {
79                 this._setup_for_section(section);
80             }, this);
81         }
83         // Setup for the block site menu
84         Y.one(baseselector).all(CSS.SITEMENU).each(function(section) {
85             this._setup_for_section(section);
86         }, this);
87     },
89     /**
90      * Update any section areas within the scope of the specified
91      * selector with AJAX equivalents
92      *
93      * @method _setup_for_section
94      * @private
95      * @param baseselector The selector to limit scope to
96      */
97     _setup_for_section: function(section) {
98         var chooserspan = section.one(CSS.SECTIONMODCHOOSER);
99         if (!chooserspan) {
100             return;
101         }
102         var chooserlink = Y.Node.create("<a href='#' />");
103         chooserspan.get('children').each(function(node) {
104             chooserlink.appendChild(node);
105         });
106         chooserspan.insertBefore(chooserlink);
107         chooserlink.on('click', this.display_mod_chooser, this);
108     },
109     /**
110      * Display the module chooser
111      *
112      * @method display_mod_chooser
113      * @param {EventFacade} e Triggering Event
114      */
115     display_mod_chooser: function(e) {
116         // Set the section for this version of the dialogue
117         if (e.target.ancestor(CSS.SITETOPIC)) {
118             // The site topic has a sectionid of 1
119             this.sectionid = 1;
120         } else if (e.target.ancestor(CSS.SECTION)) {
121             var section = e.target.ancestor(CSS.SECTION);
122             this.sectionid = section.get('id').replace('section-', '');
123         } else if (e.target.ancestor(CSS.SITEMENU)) {
124             // The block site menu has a sectionid of 0
125             this.sectionid = 0;
126         }
127         this.display_chooser(e);
128     },
130     /**
131      * Helper function to set the value of a hidden radio button when a
132      * selection is made.
133      *
134      * @method option_selected
135      * @param {String} thisoption The selected option value
136      * @private
137      */
138     option_selected: function(thisoption) {
139         // Add the sectionid to the URL.
140         this.hiddenRadioValue.setAttrs({
141             name: 'jump',
142             value: thisoption.get('value') + '&section=' + this.sectionid
143         });
144     }
145 },
147     NAME: MODCHOOSERNAME,
148     ATTRS: {
149         /**
150          * The maximum height (in pixels) of the activity chooser.
151          *
152          * @attribute maxheight
153          * @type Number
154          * @default 800
155          */
156         maxheight: {
157             value: 800
158         }
159     }
160 });
161 M.course = M.course || {};
162 M.course.init_chooser = function(config) {
163     return new MODCHOOSER(config);
164 };