mirrored from git://git.moodle.org/moodle.git
-
Notifications
You must be signed in to change notification settings - Fork 6.6k
/
modchooser.js
166 lines (149 loc) · 6.11 KB
/
modchooser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
YUI.add('moodle-course-modchooser', function(Y) {
var CSS = {
PAGECONTENT : 'div#page-content',
SECTION : 'li.section',
SECTIONMODCHOOSER : 'span.section-modchooser-link',
SITEMENU : 'div.block_site_main_menu',
SITETOPIC : 'div.sitetopic'
};
var MODCHOOSERNAME = 'course-modchooser';
var MODCHOOSER = function() {
MODCHOOSER.superclass.constructor.apply(this, arguments);
}
Y.extend(MODCHOOSER, M.core.chooserdialogue, {
// The current section ID
sectionid : null,
// The hidden element holding the jump param
jumplink : null,
initializer : function(config) {
var dialogue = Y.one('.chooserdialoguebody');
var header = Y.one('.choosertitle');
var params = {};
this.setup_chooser_dialogue(dialogue, header, params);
// Initialize existing sections and register for dynamically created sections
this.setup_for_section();
M.course.coursebase.register_module(this);
// Catch the page toggle
Y.all('.block_settings #settingsnav .type_course .modchoosertoggle a').on('click', this.toggle_mod_chooser, this);
},
/**
* Update any section areas within the scope of the specified
* selector with AJAX equivalents
*
* @param baseselector The selector to limit scope to
* @return void
*/
setup_for_section : function(baseselector) {
if (!baseselector) {
var baseselector = CSS.PAGECONTENT;
}
// Setup for site topics
Y.one(baseselector).all(CSS.SITETOPIC).each(function(section) {
this._setup_for_section(section);
}, this);
// Setup for standard course topics
Y.one(baseselector).all(CSS.SECTION).each(function(section) {
this._setup_for_section(section);
}, this);
// Setup for the block site menu
Y.one(baseselector).all(CSS.SITEMENU).each(function(section) {
this._setup_for_section(section);
}, this);
},
_setup_for_section : function(section, sectionid) {
var chooserspan = section.one(CSS.SECTIONMODCHOOSER);
if (!chooserspan) {
return;
}
var chooserlink = Y.Node.create("<a href='#' />");
chooserspan.get('children').each(function(node) {
chooserlink.appendChild(node);
});
chooserspan.insertBefore(chooserlink);
chooserlink.on('click', this.display_mod_chooser, this);
},
/**
* Display the module chooser
*
* @param e Event Triggering Event
* @param secitonid integer The ID of the section triggering the dialogue
* @return void
*/
display_mod_chooser : function (e) {
// Set the section for this version of the dialogue
if (e.target.ancestor(CSS.SITETOPIC)) {
// The site topic has a sectionid of 1
this.sectionid = 1;
} else if (e.target.ancestor(CSS.SECTION)) {
var section = e.target.ancestor(CSS.SECTION);
this.sectionid = section.get('id').replace('section-', '');
} else if (e.target.ancestor(CSS.SITEMENU)) {
// The block site menu has a sectionid of 0
this.sectionid = 0;
}
this.display_chooser(e);
},
toggle_mod_chooser : function(e) {
// Get the add section link
var modchooserlinks = Y.all('div.addresourcemodchooser');
// Get the dropdowns
var dropdowns = Y.all('div.addresourcedropdown');
if (modchooserlinks.size() == 0) {
// Continue with non-js action if there are no modchoosers to add
return;
}
// We need to update the text and link
var togglelink = Y.one('.block_settings #settingsnav .type_course .modchoosertoggle a');
// The actual text is in the last child
var toggletext = togglelink.get('lastChild');
var usemodchooser;
// Determine whether they're currently hidden
if (modchooserlinks.item(0).hasClass('visibleifjs')) {
// The modchooser is currently visible, hide it
usemodchooser = 0;
modchooserlinks
.removeClass('visibleifjs')
.addClass('hiddenifjs');
dropdowns
.addClass('visibleifjs')
.removeClass('hiddenifjs');
toggletext.set('data', M.util.get_string('modchooserenable', 'moodle'));
togglelink.set('href', togglelink.get('href').replace('off', 'on'));
} else {
// The modchooser is currently not visible, show it
usemodchooser = 1;
modchooserlinks
.addClass('visibleifjs')
.removeClass('hiddenifjs');
dropdowns
.removeClass('visibleifjs')
.addClass('hiddenifjs');
toggletext.set('data', M.util.get_string('modchooserdisable', 'moodle'));
togglelink.set('href', togglelink.get('href').replace('on', 'off'));
}
M.util.set_user_preference('usemodchooser', usemodchooser);
// Prevent the page from reloading
e.preventDefault();
},
option_selected : function(thisoption) {
// Add the sectionid to the URL
this.jumplink.set('value', thisoption.get('value') + '§ion=' + this.sectionid);
}
},
{
NAME : MODCHOOSERNAME,
ATTRS : {
maxheight : {
value : 800
}
}
});
M.course = M.course || {};
M.course.init_chooser = function(config) {
return new MODCHOOSER(config);
}
},
'@VERSION@', {
requires:['base', 'overlay', 'moodle-core-chooserdialogue', 'transition']
}
);