Universal lists ordering in Angular 1.4.x / Keywords: order list selector service sort
"use strict";
sortApp.service( "orderHandler" , function() {
/*
@param list - id of element to be sorted declared by "data-table-id" attribute value
@param sortBy - sorting pattern declared by "data-sort-id" attribute value
*/
this.sort = function( list , sortBy ) {
// Get specific table and selector
var table = document.querySelector("[data-table-id="+list+"]"),
current = table.getElementsByClassName("sort")[0],
sort;
// If there was a selection already get its settings
if( current ) {
var currentName = current.getAttribute("data-sort-id"),
currentSortingMethod = current.classList.contains("up");
// Remove selection
current.classList.remove( "sort" , "up" , "down" );
}
switch( sortBy == currentName ) {
case true:
switch( currentSortingMethod ) {
case true:
sort = "-"+currentName;
current.classList.add( "sort" , "down" );
break;
case false:
sort = currentName;
current.classList.add( "sort" , "up" );
break;
}
break;
case false:
sort = sortBy;
table.querySelector("[data-sort-id="+sortBy+"]").classList.add( "sort" , "up" );
break;
}
return sort;
}
});
"use strict";
var sortApp = angular.module("sortApp" , []);
sortApp.controller( "appController" , [ '$scope' , 'orderHandler' , function( $scope , orderHandler ) {
$scope.people = [
{
"name" : "Jan",
"age" : 25,
"city" : "Warsaw"
},
{
"name" : "Anna",
"age" : 30,
"city" : "Oslo"
},
{
"name" : "Teodor",
"age" : 27,
"city" : "Berlin"
},
{
"name" : "Marcin",
"age" : 40,
"city" : "New York"
},
{
"name" : "Baltazar",
"age" : 32,
"city" : "Buenos Aires"
}
];
$scope.order = "name";
$scope.orderBy = function( type ) {
$scope.order = orderHandler.sort( "people" , type );
return;
};
}]);
<!doctype html>
<html ng-app="sortApp">
<head>
<meta charset="utf-8">
<title></title>
<meta name='description' parent='' />
<meta name='keywords' parent='' />
<style type="text/css">
th { text-align: left; }
/* Sorting styles */
.order { cursor: pointer; }
.sort { text-decoration: underline; }
.up:after { content: " ▲"; }
.down:after { content: " ▼"; }
</style>
</head>
<body ng-controller="appController">
<table border='1' data-table-id='people'>
<thead>
<tr>
<th> <span data-sort-id='name' class='order sort up' ng-click="orderBy('name');"> Name </span> </th>
<th> <span data-sort-id='age' class='order' ng-click="orderBy('age');">Age</span> </th>
<th> <span data-sort-id='city' class='order' ng-click="orderBy('city');">City</span> </th>
</tr>
</thead>
<tbody>
<tr ng-repeat="person in people | orderBy: order">
<td>{{person.name}}</td>
<td>{{person.age}}</td>
<td>{{person.city}}</td>
</tr>
</tbody>
</table>
<script src="angular.min.js"></script>
<script type="text/javascript" src="app.js"></script>
<script type="text/javascript" src="sortingService.js"></script>
</body>
</html>