[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 /** 2 * This class filters the rows of a table like the one on the define or 3 * override roles pages. It adds a search box just above the table, and if 4 * content is typed into that box, it hides any rows in the table where the 5 * capability name does not contain that text. 6 */ 7 8 /** 9 * Role namespace 10 */ 11 M.core_role = {}; 12 13 /** 14 * @param {YUI} Y 15 * @param {string} tableid 16 * @param {int} contextid 17 */ 18 M.core_role.init_cap_table_filter = function(Y, tableid, contextid) { 19 20 var CapTableFilter = function(tableid) { 21 this.tableid = tableid; 22 this.context = contextid; 23 this.initializer(); 24 }; 25 CapTableFilter.prototype = { 26 tableid : null, // ID of the cap table 27 context : null, // Context ID associated with what ever we are looking at 28 delayhandle : -1, 29 searchdelay : 100, // milliseconds 30 table : null, 31 div : null, 32 input : null, 33 label : null, 34 button : null, 35 /** 36 * Initialises the CapTableFilter object. 37 * This is called initializer so that a move to convert this to a proper 38 * YUI module will be easier. 39 */ 40 initializer : function() { 41 // Get any existing filter value 42 var filtervalue = this.getFilterCookieValue(); 43 44 // Find the form controls. 45 this.table = Y.one('#'+this.tableid); 46 47 // Create a div to hold the search UI. 48 this.div = Y.Node.create('<div class="capabilitysearchui"></div>').setStyles({ 49 width : this.table.get('offsetWidth'), 50 marginLeft : 'auto', 51 marginRight : 'auto' 52 }); 53 // Create the capability search input. 54 this.input = Y.Node.create('<input type="text" id="'+this.table.get('id')+'capabilitysearch" value="'+Y.Escape.html(filtervalue)+'" />'); 55 // Create a label for the search input. 56 this.label = Y.Node.create('<label for="'+this.input.get('id')+'">'+M.util.get_string('filter', 'moodle')+' </label>'); 57 // Create a clear button to clear the input. 58 this.button = Y.Node.create('<input type="button" value="'+M.util.get_string('clear', 'moodle')+'" />').set('disabled', filtervalue==''); 59 60 // Tie it all together 61 this.div.append(this.label).append(this.input).append(this.button); 62 63 // Insert it into the div 64 this.table.ancestor().insert(this.div, this.table); 65 66 // Wire the events so it actually does something 67 this.input.on('keyup', this.change, this); 68 this.button.on('click', this.clear, this); 69 70 if (filtervalue != '') { 71 this.filter(); 72 } 73 }, 74 /** 75 * Sets a cookie that describes the filter value. 76 * The cookie stores the context, and the time it was created and upon 77 * retrieval is checked to ensure that the cookie is for the correct 78 * context and is no more than an hour old. 79 */ 80 setFilterCookieValue : function(value) { 81 var cookie = { 82 fltcontext : this.context, 83 flttime : new Date().getTime(), 84 fltvalue : value 85 } 86 Y.Cookie.setSubs("captblflt", cookie); 87 }, 88 /** 89 * Gets the existing filter value if there is one. 90 * The cookie stores the context, and the time it was created and upon 91 * retrieval is checked to ensure that the cookie is for the correct 92 * context and is no more than an hour old. 93 */ 94 getFilterCookieValue : function() { 95 var cookie = Y.Cookie.getSubs('captblflt'); 96 if (cookie!=null && cookie.fltcontext && cookie.fltcontext == this.context && parseInt(cookie.flttime) > new Date().getTime()-(60*60*1000)) { 97 return cookie.fltvalue; 98 } 99 return ''; 100 }, 101 /** 102 * Clears the filter value. 103 */ 104 clear : function() { 105 this.input.set('value', ''); 106 if (this.delayhandle != -1) { 107 clearTimeout(this.delayhandle); 108 this.delayhandle = -1; 109 } 110 this.filter(); 111 }, 112 /** 113 * Event callback for when the filter value changes 114 */ 115 change : function() { 116 var self = this; 117 var handle = setTimeout(function(){self.filter();}, this.searchdelay); 118 if (this.delayhandle != -1) { 119 clearTimeout(this.delayhandle); 120 } 121 this.delayhandle = handle; 122 }, 123 /** 124 * Marks a row as visible or hidden 125 */ 126 setVisible : function(row, visible) { 127 if (visible) { 128 row.removeClass('hiddenrow'); 129 } else { 130 row.addClass('hiddenrow'); 131 } 132 }, 133 /** 134 * Filters the capability table 135 */ 136 filter : function() { 137 var filtertext = this.input.get('value').toLowerCase(), 138 lastheading = null; 139 140 this.setFilterCookieValue(filtertext); 141 142 this.button.set('disabled', (filtertext == '')); 143 144 this.table.all('tr').each(function(row){ 145 if (row.hasClass('rolecapheading')) { 146 this.setVisible(row, false); 147 lastheading = row; 148 } 149 if (row.hasClass('rolecap')) { 150 var capname = row.one('.cap-name').get('text') + '|' + row.one('.cap-desc a').get('text').toLowerCase(); 151 if (capname.indexOf(filtertext) >= 0) { 152 this.setVisible(row, true); 153 if (lastheading) { 154 this.setVisible(lastheading, true); 155 lastheading = null; 156 } 157 } else { 158 this.setVisible(row, false); 159 } 160 } 161 }, this); 162 } 163 } 164 165 new CapTableFilter(tableid); 166 }; 167 168 M.core_role.init_add_assign_page = function(Y) { 169 var add = Y.one('#add'); 170 var addselect = M.core_user.get_user_selector('addselect'); 171 add.set('disabled', addselect.is_selection_empty()); 172 addselect.on('user_selector:selectionchanged', function(isempty) { 173 add.set('disabled', isempty); 174 }); 175 176 var remove = Y.one('#remove'); 177 var removeselect = M.core_user.get_user_selector('removeselect'); 178 remove.set('disabled', removeselect.is_selection_empty()); 179 removeselect.on('user_selector:selectionchanged', function(isempty) { 180 remove.set('disabled', isempty); 181 }); 182 };
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |