-
Notifications
You must be signed in to change notification settings - Fork 21
/
jquery.uitablefilter.js
108 lines (93 loc) · 3.07 KB
/
jquery.uitablefilter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* Copyright (c) 2008 Greg Weber greg at gregweber.info
* Dual licensed under the MIT and GPLv2 licenses just as jQuery is:
* http://jquery.org/license
*
* Multi-columns support by natinusala
*
* documentation at http://gregweber.info/projects/uitablefilter
*
* allows table rows to be filtered (made invisible)
* <code>
* t = $('table')
* $.uiTableFilter( t, phrase )
* </code>
* arguments:
* jQuery object containing table rows
* phrase to search for
* optional arguments:
* array of columns to limit search too (the column title in the table header)
* ifHidden - callback to execute if one or more elements was hidden
* tdElem - specific element within <td> to be considered for searching or to limit search to,
* default:whole <td>. useful if <td> has more than one elements inside but want to
* limit search within only some of elements or only visible elements. eg tdElem can be "td span"
*/
(function ($) {
$.uiTableFilter = function (jq, phrase, column, ifHidden, tdElem) {
if (!tdElem) tdElem = "td";
var new_hidden = false;
if (this.last_phrase === phrase) return false;
var phrase_length = phrase.length;
var words = phrase.toLowerCase().split(" ");
// these function pointers may change
var matches = function (elem) { elem.show() }
var noMatch = function (elem) { elem.hide(); new_hidden = true }
var getText = function (elem) { return elem.text() }
if (column) {
if (!$.isArray(column)) {
column = new Array(column);
}
var index = new Array();
jq.find("thead > tr:last > th").each(function (i) {
for (var j = 0; j < column.length; j++) {
if ($.trim($(this).text()) == column[j]) {
index[j] = i;
break;
}
}
});
getText = function (elem) {
var selector = "";
for (var i = 0; i < index.length; i++) {
if (i != 0) { selector += ","; }
selector += tdElem + ":eq(" + index[i] + ")";
}
return $(elem.find((selector))).text();
}
}
// if added one letter to last time,
// just check newest word and only need to hide
if ((words.size > 1) && (phrase.substr(0, phrase_length - 1) ===
this.last_phrase)) {
if (phrase[-1] === " ") { this.last_phrase = phrase; return false; }
var words = words[-1]; // just search for the newest word
// only hide visible rows
matches = function (elem) { ; }
var elems = jq.find("tbody:first > tr:visible")
}
else {
new_hidden = true;
var elems = jq.find("tbody:first > tr")
}
elems.each(function () {
var elem = $(this);
$.uiTableFilter.has_words(getText(elem), words, false) ?
matches(elem) : noMatch(elem);
});
last_phrase = phrase;
if (ifHidden && new_hidden) ifHidden();
return jq;
};
// caching for speedup
$.uiTableFilter.last_phrase = ""
// not jQuery dependent
// "" [""] -> Boolean
// "" [""] Boolean -> Boolean
$.uiTableFilter.has_words = function (str, words, caseSensitive) {
var text = caseSensitive ? str : str.toLowerCase();
for (var i = 0; i < words.length; i++) {
if (text.indexOf(words[i]) === -1) return false;
}
return true;
}
})(jQuery);