filter.js | |
---|---|
page: https://github.com/archaeron/filtertable license: MIT (http://www.opensource.org/licenses/mit-license.php) | (function(window, $)
{
'use strict';
var filterable = {},
rownames = [],
$table,
$rows, |
set standard options | options =
{ |
this class will be added to the elements to be hidden | hiddenClass : 'filtertable-hidden'
};
var tableFilter = function($element, opt)
{ |
initialize the variables at the beginning of the function | var init,
choose_op,
search_and,
search_or,
search_in_cell;
this.VERSION = '0.2.0';
$table = $element;
options = $.extend(options, opt);
init = function()
{
$rows = $table.children('tbody').find('tr');
var $theaders = $table.find('th');
$theaders.each(function(i)
{
var $elem = $(this);
var nosort = $elem.attr('data-tablefilter-nofilter');
if(!nosort)
{
var name_attr = $elem.attr('data-tablefilter-rowname');
var key = name_attr !== void 0 ? name_attr : $elem.text();
key = key.toLowerCase();
filterable[key] = i;
}
});
};
this.rows = function()
{
if(! rownames.length)
{
var length = filterable.length;
for(var name in filterable)
{
if(filterable.hasOwnProperty(name))
{
rownames.push(name);
}
}
}
return rownames;
};
this.search = function(searchparams)
{
$rows.each(function ()
{
var $this = $(this),
passed = choose_op(searchparams, $this);
if(!passed)
{
$this.toggleClass('filtertable-hideQueue', true);
}
});
$rows.filter(':not(.filtertable-hideQueue)').toggleClass(options.hiddenClass, false);
$rows.filter('.filtertable-hideQueue')
.toggleClass(options.hiddenClass, true)
.toggleClass('filtertable-hideQueue', false);
};
choose_op = function(params, $row)
{
switch(params.op)
{
case 'and':
return search_and(params.terms, $row);
case 'or':
return search_or(params.terms, $row);
}
};
search_or = function(terms, $row)
{
var $columns = $row.children();
var passed = false;
var length = terms.length;
for(var i = 0; i < length; i++)
{
var term = terms[i];
if(!term.op)
{
var column = filterable[term.row];
var $cell = $($columns[column]);
if(search_in_cell(term.value ,$cell))
{
/* break loop */
passed = true;
break;
}
}
else
{
var passed_branch = choose_op(term, $row);
if(passed_branch)
{
passed = true;
break;
}
}
}
if(!passed)
{
return false;
}
else
{
return true;
}
};
search_and = function(terms, $row)
{
var $columns = $row.children();
var length = terms.length;
for(var i = 0; i < length; i++)
{
var term = terms[i];
if(!term.op)
{
var column = filterable[term.row];
var $cell = $($columns[column]);
if(!search_in_cell(term.value ,$cell))
{
return false;
}
}
else
{
var passed_branch = choose_op(term, $row);
if(!passed_branch)
{
return false;
}
}
}
return true;
};
search_in_cell = function(searchfor, $cell)
{
var filterkey = $cell.attr('data-filterkey'),
to_search;
if(filterkey)
{
to_search = filterkey;
}
else
{
to_search = $cell.text();
}
to_search = to_search.toLowerCase();
searchfor = searchfor.toLowerCase();
if(to_search.indexOf(searchfor) === -1)
{
return false;
}
else
{
return true;
}
};
init();
};
window.tableFilter = tableFilter;
}(window, $));
|