Multiple Filter on ng-repeat
Set multiple parallel filter on ng-repeat and order the result by column. More information in my blog http://andreaskarz.blogspot.com/2014/03/mehrere-filter-auf-ng-repeat-anwenden.html
by andreas_karz
HTML
<div ng-app="app">
<div ng-controller="mainController">
<h2>Runlevel</h2>
<label>PAV</label>
<input type="checkbox" ng-model="Filter.runlevel.PAV" ng-true-value="PAV" ng-false-value="!PAV" />
<label>UAT</label>
<input type="checkbox" ng-model="Filter.runlevel.UAT" ng-true-value="UAT" ng-false-value="!UAT" />
<label>ST</label>
<input type="checkbox" ng-model="Filter.runlevel.ST" ng-true-value="ST" ng-false-value="!ST"/>
<hr />
<h2>Runmode</h2>
<label>Author</label>
<input type="checkbox" ng-model="Filter.mode.author" ng-true-value="author" ng-false-value="!author" />
<label>Publish</label>
<input type="checkbox" ng-model="Filter.mode.publish" ng-true-value="publish" ng-false-value="!publish" />
<hr />
<h2>Environment</h2>
<label>Intranet</label>
<input type="checkbox" ng-model="Filter.env.intranet" ng-true-value="intranet" ng-false-value="!intranet" />
<label>Internet</label>
<input type="checkbox" ng-model="Filter.env.internet" ng-true-value="internet" ng-false-value="!internet" />
<hr />
<h2>Server list</h2>
<table width="100%" cellpadding="5">
<tr>
<th ng-click="OrderFilter='name'">Name</th>
<th ng-click="OrderFilter='runlevel'">Runlevel</th>
<th ng-click="OrderFilter='mode'">Runmode</th>
<th ng-click="OrderFilter='env'">Environment</th>
</tr>
<tr ng-repeat="server in servers | searchFilter:Filter.runlevel | searchFilter:Filter.mode | searchFilter:Filter.env | orderBy:OrderFilter">
<td>{{server.name}}</td>
<td>{{server.runlevel}}</td>
<td>{{server.mode}}</td>
<td>{{server.env}}</td>
</tr>
</table>
</div>
</div>
CSS
body{
font-family:calibri,arial;
}
h2{
font-size:14pt;
font-weight:bold;
}
li{
font-family:courier;
}
th{
font-weight:bold;
cursor:pointer;
}
JavaScript
var app =angular.module('app', []);
app.controller('mainController', function($scope) {
// Data object
$scope.servers = [
{name:'ServerA', runlevel:'PAV', mode:'author', env:'intranet' },
{name:'Server7', runlevel:'PAV', mode:'publish', env:'intranet'},
{name:'Server2', runlevel:'PAV', mode:'publish', env:'intranet'},
{name:'ServerB', runlevel:'PAV', mode:'publish', env:'internet'},
{name:'ServerC', runlevel:'PAV', mode:'publish', env:'internet'},
{name:'Server1', runlevel:'UAT', mode:'author', env:'intranet'},
{name:'Server3', runlevel:'UAT', mode:'publish', env:'intranet'},
{name:'Server4', runlevel:'UAT', mode:'publish', env:'internet'},
{name:'ServerD', runlevel:'STA', mode:'author', env:'intranet'},
{name:'ServerE', runlevel:'STA', mode:'publish', env:'intranet'}
];
// Filter defaults
$scope.Filter = new Object();
$scope.Filter.runlevel = {'PAV':'PAV',
'UAT':'UAT',
'ST':'ST'
};
$scope.Filter.mode = {'author':'author',
'publish':'publish'
};
$scope.Filter.env = {'intranet':'intranet',
'internet':'internet'
};
// Default order
$scope.OrderFilter = 'runlevel';
});
// Global search filter
app.filter('searchFilter',function($filter) {
return function(items,searchfilter) {
var isSearchFilterEmpty = true;
angular.forEach(searchfilter, function(searchstring) {
if(searchstring !=null && searchstring !=""){
isSearchFilterEmpty= false;
}
});
if(!isSearchFilterEmpty){
var result = [];
angular.forEach(items, function(item) {
var isFound = false;
angular.forEach(item,...