You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.7 KiB
185 lines
6.7 KiB
/**
|
|
* This class filters the rows of a table like the one on the define or
|
|
* override roles pages. It adds a search box just above the table, and if
|
|
* content is typed into that box, it hides any rows in the table where the
|
|
* capability name does not contain that text.
|
|
*/
|
|
|
|
/**
|
|
* Role namespace
|
|
*/
|
|
M.core_role = {};
|
|
|
|
/**
|
|
* @param {YUI} Y
|
|
* @param {string} tableid
|
|
* @param {int} contextid
|
|
*/
|
|
M.core_role.init_cap_table_filter = function(Y, tableid, contextid) {
|
|
|
|
var CapTableFilter = function(tableid) {
|
|
this.tableid = tableid;
|
|
this.context = contextid;
|
|
this.initializer();
|
|
};
|
|
CapTableFilter.prototype = {
|
|
tableid : null, // ID of the cap table
|
|
context : null, // Context ID associated with what ever we are looking at
|
|
delayhandle : -1,
|
|
searchdelay : 100, // milliseconds
|
|
table : null,
|
|
div : null,
|
|
input : null,
|
|
label : null,
|
|
button : null,
|
|
/**
|
|
* Initialises the CapTableFilter object.
|
|
* This is called initializer so that a move to convert this to a proper
|
|
* YUI module will be easier.
|
|
*/
|
|
initializer : function() {
|
|
// Get any existing filter value
|
|
var filtervalue = this.getFilterCookieValue();
|
|
|
|
// Find the form controls.
|
|
this.table = Y.one('#'+this.tableid);
|
|
|
|
// Create a div to hold the search UI.
|
|
this.div = Y.Node.create('<div class="capabilitysearchui form-inline"></div>').setStyles({
|
|
width : this.table.get('offsetWidth'),
|
|
marginLeft : 'auto',
|
|
marginRight : 'auto'
|
|
});
|
|
// Create the capability search input.
|
|
this.input = Y.Node.create('<input class="form-control mx-1" type="text"' +
|
|
' id="'+this.table.get('id')+'capabilitysearch" value="'+Y.Escape.html(filtervalue)+'" />');
|
|
// Create a label for the search input.
|
|
this.label = Y.Node.create('<label for="' + this.input.get('id') + '">' +
|
|
M.util.get_string('filter', 'moodle') + ' </label>');
|
|
// Create a clear button to clear the input.
|
|
this.button = Y.Node.create('<input type="button" class="btn btn-primary"' +
|
|
' value="'+M.util.get_string('clear', 'moodle')+'" />').set('disabled', filtervalue=='');
|
|
|
|
// Tie it all together
|
|
this.div.append(this.label).append(this.input).append(this.button);
|
|
|
|
// Insert it into the div
|
|
this.table.ancestor().insert(this.div, this.table);
|
|
|
|
// Wire the events so it actually does something
|
|
this.input.on('keyup', this.change, this);
|
|
this.button.on('click', this.clear, this);
|
|
|
|
if (filtervalue != '') {
|
|
this.filter();
|
|
}
|
|
},
|
|
/**
|
|
* Sets a cookie that describes the filter value.
|
|
* The cookie stores the context, and the time it was created and upon
|
|
* retrieval is checked to ensure that the cookie is for the correct
|
|
* context and is no more than an hour old.
|
|
*/
|
|
setFilterCookieValue : function(value) {
|
|
var cookie = {
|
|
fltcontext : this.context,
|
|
flttime : new Date().getTime(),
|
|
fltvalue : value
|
|
}
|
|
Y.Cookie.setSubs("captblflt", cookie);
|
|
},
|
|
/**
|
|
* Gets the existing filter value if there is one.
|
|
* The cookie stores the context, and the time it was created and upon
|
|
* retrieval is checked to ensure that the cookie is for the correct
|
|
* context and is no more than an hour old.
|
|
*/
|
|
getFilterCookieValue : function() {
|
|
var cookie = Y.Cookie.getSubs('captblflt');
|
|
if (cookie!=null && cookie.fltcontext && cookie.fltcontext == this.context && parseInt(cookie.flttime) > new Date().getTime()-(60*60*1000)) {
|
|
return cookie.fltvalue;
|
|
}
|
|
return '';
|
|
},
|
|
/**
|
|
* Clears the filter value.
|
|
*/
|
|
clear : function() {
|
|
this.input.set('value', '');
|
|
if (this.delayhandle != -1) {
|
|
clearTimeout(this.delayhandle);
|
|
this.delayhandle = -1;
|
|
}
|
|
this.filter();
|
|
},
|
|
/**
|
|
* Event callback for when the filter value changes
|
|
*/
|
|
change : function() {
|
|
var self = this;
|
|
var handle = setTimeout(function(){self.filter();}, this.searchdelay);
|
|
if (this.delayhandle != -1) {
|
|
clearTimeout(this.delayhandle);
|
|
}
|
|
this.delayhandle = handle;
|
|
},
|
|
/**
|
|
* Marks a row as visible or hidden
|
|
*/
|
|
setVisible : function(row, visible) {
|
|
if (visible) {
|
|
row.removeClass('hiddenrow');
|
|
} else {
|
|
row.addClass('hiddenrow');
|
|
}
|
|
},
|
|
/**
|
|
* Filters the capability table
|
|
*/
|
|
filter : function() {
|
|
var filtertext = this.input.get('value').toLowerCase(),
|
|
lastheading = null;
|
|
|
|
this.setFilterCookieValue(filtertext);
|
|
|
|
this.button.set('disabled', (filtertext == ''));
|
|
|
|
this.table.all('tr').each(function(row){
|
|
if (row.hasClass('rolecapheading')) {
|
|
this.setVisible(row, false);
|
|
lastheading = row;
|
|
}
|
|
if (row.hasClass('rolecap')) {
|
|
var capname = row.one('.cap-name').get('text') + '|' + row.one('.cap-desc a').get('text').toLowerCase();
|
|
if (capname.indexOf(filtertext) >= 0) {
|
|
this.setVisible(row, true);
|
|
if (lastheading) {
|
|
this.setVisible(lastheading, true);
|
|
lastheading = null;
|
|
}
|
|
} else {
|
|
this.setVisible(row, false);
|
|
}
|
|
}
|
|
}, this);
|
|
}
|
|
}
|
|
|
|
new CapTableFilter(tableid);
|
|
};
|
|
|
|
M.core_role.init_add_assign_page = function(Y) {
|
|
var add = Y.one('#add');
|
|
var addselect = M.core_user.get_user_selector('addselect');
|
|
add.set('disabled', addselect.is_selection_empty());
|
|
addselect.on('user_selector:selectionchanged', function(isempty) {
|
|
add.set('disabled', isempty);
|
|
});
|
|
|
|
var remove = Y.one('#remove');
|
|
var removeselect = M.core_user.get_user_selector('removeselect');
|
|
remove.set('disabled', removeselect.is_selection_empty());
|
|
removeselect.on('user_selector:selectionchanged', function(isempty) {
|
|
remove.set('disabled', isempty);
|
|
});
|
|
};
|
|
|