Created
March 6, 2013 08:36
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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