MDL-38192 Backup and restore: Allow selection by activity type
[moodle.git] / backup / util / ui / yui / backupselectall / backupselectall.js
1 YUI.add('moodle-backup-backupselectall', function(Y) {
3 // Namespace for the backup
4 M.core_backup = M.core_backup || {};
6 /**
7  * Adds select all/none links to the top of the backup/restore/import schema page.
8  */
9 M.core_backup.select_all_init = function(modnames) {
10     var formid = null;
12     var helper = function(e, check, type, mod) {
13         e.preventDefault();
14         var prefix = '';
15         if (typeof mod !== 'undefined') {
16             prefix = 'setting_activity_' + mod + '_';
17         }
19         var len = type.length;
20         Y.all('input[type="checkbox"]').each(function(checkbox) {
21             var name = checkbox.get('name');
22             // If a prefix has been set, ignore checkboxes which don't have that prefix.
23             if (prefix && name.substring(0, prefix.length) !== prefix) {
24                 return;
25             }
26             if (name.substring(name.length - len) == type) {
27                 checkbox.set('checked', check);
28             }
29         });
31         // At this point, we really need to persuade the form we are part of to
32         // update all of its disabledIf rules. However, as far as I can see,
33         // given the way that lib/form/form.js is written, that is impossible.
34         if (formid && M.form) {
35             M.form.updateFormState(formid);
36         }
37     };
39     var html_generator = function(classname, idtype, heading, extra) {
40         if (typeof extra === 'undefined') {
41             extra = '';
42         }
43         return '<div class="' + classname + '">' +
44                     '<div class="fitem fitem_fcheckbox backup_selector">' +
45                         '<div class="fitemtitle">' + heading + '</div>' +
46                         '<div class="felement">' +
47                             '<a id="backup-all-' + idtype + '" href="#">' + M.util.get_string('all', 'moodle') + '</a> / ' +
48                             '<a id="backup-none-' + idtype + '" href="#">' + M.util.get_string('none', 'moodle') + '</a>' +
49                             extra +
50                         '</div>' +
51                     '</div>' +
52                 '</div>';
53     };
55     var firstsection = Y.one('fieldset#id_coursesettings .fcontainer.clearfix .grouped_settings.section_level');
56     if (!firstsection) {
57         // This is not a relevant page.
58         return;
59     }
60     if (!firstsection.one('.felement.fcheckbox')) {
61         // No checkboxes.
62         return;
63     }
65     formid = firstsection.ancestor('form').getAttribute('id');
67     var withuserdata = false;
68     Y.all('input[type="checkbox"]').each(function(checkbox) {
69         var name = checkbox.get('name');
70         if (name.substring(name.length - 9) == '_userdata') {
71             withuserdata = '_userdata';
72         } else if (name.substring(name.length - 9) == '_userinfo') {
73             withuserdata = '_userinfo';
74         }
75     });
77     // Add global select all/none options.
78     var html = html_generator('include_setting section_level', 'included', M.util.get_string('select', 'moodle'),
79             ' (<a id="backup-bytype" href="#">' + M.util.get_string('showtypes', 'backup') + '</a>)');
80     if (withuserdata) {
81         html += html_generator('normal_setting', 'userdata', M.util.get_string('select', 'moodle'));
82     }
83     var links = Y.Node.create('<div class="grouped_settings section_level">' + html + '</div>');
84     firstsection.insert(links, 'before');
86     // Add select all/none for each module type.
87     var initlinks = function(links, mod) {
88         Y.one('#backup-all-mod_' + mod).on('click', function(e) { helper(e, true, '_included', mod); });
89         Y.one('#backup-none-mod_' + mod).on('click', function(e) { helper(e, false, '_included', mod); });
90         if (withuserdata) {
91             Y.one('#backup-all-userdata-mod_' + mod).on('click', function(e) { helper(e, true, withuserdata, mod); });
92             Y.one('#backup-none-userdata-mod_' + mod).on('click', function(e) { helper(e, false, withuserdata, mod); });
93         }
94     };
96     // For each module type on the course, add hidden select all/none options.
97     var modlist = Y.Node.create('<div id="mod_select_links">');
98     modlist.hide();
99     modlist.currentlyshown = false;
100     links.appendChild(modlist);
101     for (var mod in modnames) {
102         // Only include actual values from the list.
103         if (!modnames.hasOwnProperty(mod)) {
104             continue;
105         }
106         var html = html_generator('include_setting section_level', 'mod_' + mod, modnames[mod]);
107         if (withuserdata) {
108             html += html_generator('normal_setting', 'userdata-mod_' + mod, modnames[mod]);
109         }
110         var modlinks = Y.Node.create(
111             '<div class="grouped_settings section_level">' + html + '</div>');
112         modlist.appendChild(modlinks);
113         initlinks(modlinks, mod);
114     }
116     // Toggles the display of the hidden module select all/none links.
117     var toggletypes = function() {
118         // Change text of type toggle link.
119         var link = Y.one('#backup-bytype');
120         if (modlist.currentlyshown) {
121             link.setHTML(M.util.get_string('showtypes', 'backup'));
122         } else {
123             link.setHTML(M.util.get_string('hidetypes', 'backup'));
124         }
126         // The link has now been toggled (from show to hide, or vice-versa).
127         modlist.currentlyshown = !modlist.currentlyshown;
129         // Either hide or show the links.
130         var animcfg = { node: modlist, duration: 0.2 };
131         if (modlist.currentlyshown) {
132             // Animate reveal of the module links.
133             modlist.show();
134             animcfg.to = { maxHeight: modlist.get('clientHeight') + 'px' };
135             modlist.setStyle('maxHeight', '0px');
136             var anim = new Y.Anim(animcfg);
137             anim.on('end', function() { modlist.setStyle('maxHeight', 'none'); });
138             anim.run();
139         } else {
140             // Animate hide of the module links.
141             animcfg.to = { maxHeight: '0px' };
142             modlist.setStyle('maxHeight', modlist.get('clientHeight') + 'px');
143             var anim = new Y.Anim(animcfg);
144             anim.on('end', function() { modlist.hide(); modlist.setStyle('maxHeight', 'none'); });
145             anim.run();
146         }
148     };
149     Y.one('#backup-bytype').on('click', function(e) { toggletypes(); });
151     Y.one('#backup-all-included').on('click',  function(e) { helper(e, true,  '_included'); });
152     Y.one('#backup-none-included').on('click', function(e) { helper(e, false, '_included'); });
153     if (withuserdata) {
154         Y.one('#backup-all-userdata').on('click',  function(e) { helper(e, true,  withuserdata); });
155         Y.one('#backup-none-userdata').on('click', function(e) { helper(e, false, withuserdata); });
156     }
159 }, '@VERSION@', {'requires':['base', 'node', 'event', 'node-event-simulate', 'anim']});