Skip to content

Instantly share code, notes, and snippets.

@mkrogh
Created March 6, 2013 08:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkrogh/5097672 to your computer and use it in GitHub Desktop.
Save mkrogh/5097672 to your computer and use it in GitHub Desktop.
Simple JS filter function for searching in tables. Done in an MVC fashion.
(function($){
var makeObservable = function() {
var observers = [];
var addObserver = function(observer) {
observers.push(observer);
};
var removeObserver = function(observer){
var idx = observers.indexOf(observer);
if(idx != -1) observers.splice(idx, 1);
};
var notify = function(value) {
for(var i=0; i < observers.length; i++){
observers[i](value);
}
};
return {
addObserver: addObserver,
removeObserver: removeObserver,
notify: notify
};
};
var makeRowModel = function(row, columnSelector){
var statusObserver = makeObservable();
var visible = true;
var allText = $(columnSelector,row).text();
var hide = function() {
if(visible){
visible = false;
statusObserver.notify(visible);
}
};
var show = function() {
if(!visible){
visible = true;
statusObserver.notify(visible);
}
};
var hasText = function(text){
return allText.toLowerCase().indexOf(text.toLowerCase()) != -1 ? true : false;
};
return {
addStatusObserver: statusObserver.addObserver,
removeStatusObserver: statusObserver.removeObserver,
hasText: hasText,
show: show,
hide: hide,
getRow: function(){return row;}
};
};
var makeTableModel = function(tableRows){
var filter = function(text){
for(var i=0; i < tableRows.length; i++){
if(tableRows[i].hasText(text)){
tableRows[i].show();
}else{
tableRows[i].hide();
}
}
};
return {
filter: filter,
getRows: function(){return rows;}
};
};
var makeFilterController = function(){
var handleKeyUp = function(tableModel,value){
tableModel.filter(value);
};
return {
handleKeyUp: handleKeyUp
};
};
var makeRowView = function(rowModel){
var rowStatusObserver = function(isVisible){
if(isVisible){
$(rowModel.getRow()).show();
}else{
$(rowModel.getRow()).hide();
}
};
rowModel.addStatusObserver(rowStatusObserver);
return {};
};
var makeFilterView = function(tableModel, filterController){
var input = $('<input class="filter" placeholder="filter"/>');
input.keyup( function(event) {
filterController.handleKeyUp(tableModel, $(this).val());
});
return {
inputFilter: function(){return input;}
};
};
/****************
* bootstrapping (suitable for pluginifying?)
****************/
$.fn.filterByText = function(options){
var defaults = {
rowSelector: "tbody tr",
columnSelector: "td:not(.exclude)"
};
var opts = $.extend(defaults, options);
return this.each(function(){
var table = $(this);
var rows = $(opts.rowSelector, table);
//TODO: add exclude class to relevant TDs based on thead
var filterController = makeFilterController();
var rowViews = [];
var rowModels = [];
var rowModel;
for(var i=0; i < rows.length; i++){
rowModel = makeRowModel(rows[i], opts.columnSelector);
rowModels.push(rowModel);
rowViews.push(makeRowView(rowModel));
}
var tableModel = makeTableModel(rowModels);
var filterView = makeFilterView(tableModel, filterController);
table.before(filterView.inputFilter);
});
};
})(jQuery);
$(document).ready($(".manage").filterByText());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment