forked from rwjblue/pivot.js
/
filters.js
146 lines (124 loc) · 3.82 KB
/
filters.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/**
* Entry point for several filter methods.
* See:
*
* * getFilters() - returns filters applied to current pivot
* * setFilters() - sets a series of filters
* * appendFilter() - adds a filter to current pivot filters
* * applyFilter() - runs the filters on the values
*
* @param {String}
* @return {function} One of the fucntions defined above.
*/
function pivotFilters(type){
var opts = {
all: getFilters,
set: setFilters,
apply: applyFilter,
add: appendFilter
}
if (type !== undefined) {
return opts[type]
} else {
return opts
};
};
function castFilterValues(restrictions){
if (restrictions === undefined) restrictions = filters;
var field;
for (field in restrictions){
if (restrictions.hasOwnProperty(field))
if (isRegExp(restrictions[field])) {
// no need to change
} else if (isArray(restrictions[field])) {
var i = -1, m = restrictions[field].length;
while (++i < m) {
restrictions[field][i] = castFieldValue(field, restrictions[field][i])
};
} else {
restrictions[field] = castFieldValue(field, restrictions[field])
}
};
};
/**
* Takes a new restrction (filter) and appends it to current pivot's filters
* @param {Object} newRestriction should looke like {"last_name":"Jackson"}
*/
function appendFilter(newRestriction) {
for (var key in newRestriction) {
if (newRestriction.hasOwnProperty(key))
filters[key] = newRestriction[key];
}
castFilterValues();
};
/**
* Returns current pivot's filters
*/
function getFilters(){
return filters;
};
/**
* Accepts list of restrictions, assigns them as current pivot's filters and casts their values.
* @param {Object} restrictions - should looke something like {"employer":"Acme Corp"}
*/
function setFilters(restrictions){
filters = restrictions;
resetResults();
castFilterValues();
};
/**
* Applies the current pivot's filters to the data returning a list of values
* Optionally allows you to set filters and apply them.
* @param {Object} restrictions allows you to pass the filters to apply without using set first.
*/
function applyFilter(restrictions){
var dataToFilter = data,
filteredData = [];
if (restrictions !== undefined) setFilters(restrictions);
var preserveFilter = preserveFilteredData();
if (preserveFilter) {
dataToFilter = data;
} else {
dataToFilter = rawData;
}
var dataToFilterLength = dataToFilter.length,
filterLength = objectKeys(filters).length,
i = -1;
while (++i < dataToFilterLength) {
var row = dataToFilter[i],
matches = 0;
for (var key in filters) {
if (filters.hasOwnProperty(key) && row.hasOwnProperty(key) && matchesFilter(filters[key], row[key]))
matches += 1;
}
if (matches === filterLength) {
filteredData.push(row);
};
};
data = filteredData;
dataFilters = shallowClone(filters);
resetResults();
return data;
};
function matchesFilter(filter, value){
if (isArray(filter)) {
var i = -1, m = filter.length;
while (++i < m) {
if(filter[i] === value) return true
};
} else if (isRegExp(filter)){
return filter.test(value);
} else {
return value === filter;
}
return false
};
function preserveFilteredData(){
var matches = 0,
dataFiltersLength = objectKeys(dataFilters).length;
for (var key in dataFilters) {
if (dataFilters.hasOwnProperty(key) && dataFilters.hasOwnProperty(key) && filters[key] === dataFilters[key])
matches += 1;
}
return dataFiltersLength > 0 && matches >= dataFiltersLength;
};