Skip to content

Commit

Permalink
Separate module from test-code
Browse files Browse the repository at this point in the history
  • Loading branch information
mattiash committed Aug 21, 2013
1 parent 19f7f9d commit f09e6de
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 146 deletions.
146 changes: 146 additions & 0 deletions js/angular-tablesort.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@

var tableSortModule = angular.module( 'tableSort', [] );

tableSortModule.directive('tsWrapper', function( $log, $parse ) {
return {
scope: true,
controller: function($scope) {
$scope.sortExpression = [];
$scope.headings = [];

var parse_sortexpr = function( expr ) {
return [$parse( expr ), null, false];
};

this.setSortField = function( sortexpr, element ) {
var i;
var expr = parse_sortexpr( sortexpr );
if( $scope.sortExpression.length === 1
&& $scope.sortExpression[0][0] === expr[0] ) {
if( $scope.sortExpression[0][2] ) {
element.removeClass( "tablesort-desc" );
element.addClass( "tablesort-asc" );
$scope.sortExpression[0][2] = false;
}
else {
element.removeClass( "tablesort-asc" );
element.addClass( "tablesort-desc" );
$scope.sortExpression[0][2] = true;
}
}
else {
for( i=0; i<$scope.headings.length; i=i+1 ) {
$scope.headings[i]
.removeClass( "tablesort-desc" )
.removeClass( "tablesort-asc" );
}
element.addClass( "tablesort-asc" );
$scope.sortExpression = [expr];
}
};

this.addSortField = function( sortexpr, element ) {
var i;
var toggle_order = false;
var expr = parse_sortexpr( sortexpr );
for( i=0; i<$scope.sortExpression.length; i=i+1 ) {
if( $scope.sortExpression[i][0] === expr[0] ) {
if( $scope.sortExpression[i][2] ) {
element.removeClass( "tablesort-desc" );
element.addClass( "tablesort-asc" );
$scope.sortExpression[i][2] = false;
}
else {
element.removeClass( "tablesort-asc" );
element.addClass( "tablesort-desc" );
$scope.sortExpression[i][2] = true;
}
toggle_order = true;
}
}
if( !toggle_order ) {
element.addClass( "tablesort-asc" );
$scope.sortExpression.push( expr );
}
};

this.registerHeading = function( headingelement ) {
$scope.headings.push( headingelement );
};

$scope.sortFun = function( a, b ) {
var i, aval, bval, descending;
for( i=0; i<$scope.sortExpression.length; i=i+1 ){
aval = $scope.sortExpression[i][0](a);
bval = $scope.sortExpression[i][0](b);
filterFun = b[$scope.sortExpression[i][1]];
if( filterFun ) {
aval = filterFun( aval );
bval = filterFun( bval );
}
descending = $scope.sortExpression[i][2];
if( aval > bval ) {
return descending ? -1 : 1;
}
else if( aval < bval ) {
return descending ? 1 : -1;
}
}
return 0;
};
}
};
} );

tableSortModule.directive('tsCriteria', function() {
return {
require: "^tsWrapper",
link: function(scope, element, attrs, tsWrapperCtrl) {
var clickingCallback = function(event) {
scope.$apply( function() {
if( event.shiftKey ) {
tsWrapperCtrl.addSortField(attrs.tsCriteria, element);
}
else {
tsWrapperCtrl.setSortField(attrs.tsCriteria, element);
}
} );
};
element.bind('click', clickingCallback);
if( "tsDefault" in attrs && attrs.tsDefault !== "0" ) {
tsWrapperCtrl.addSortField( attrs.tsCriteria, element );
}
tsWrapperCtrl.registerHeading( element );
}
};
});

tableSortModule.directive("tsRepeat", function() {
return {
require: "^tsWrapper",
priority: 2000,
compile: function(tElement, tAttrs, transclude) {
tAttrs.ngRepeat += " | tablesortOrderBy:sortFun";
}
};
} );

tableSortModule.filter( 'tablesortOrderBy', function(){
return function(array, sortfun ) {
var arrayCopy = [];
for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
return arrayCopy.sort( sortfun );
};
} );

tableSortModule.filter( 'parseInt', function(){
return function(input) {
return parseInt( input );
};
} );

tableSortModule.filter( 'parseFloat', function(){
return function(input) {
return parseFloat( input );
};
} );
146 changes: 0 additions & 146 deletions js/table.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,149 +10,3 @@ function ShoppingCartCtrl($scope) {
{Name: "Shampoo", Price: "100", Quantity: "5"}
];
}

var tableSortModule = angular.module( 'tableSort', [] );

tableSortModule.directive('tsWrapper', function( $log, $parse ) {
return {
scope: true,
controller: function($scope) {
$scope.sortExpression = [];
$scope.headings = [];

var parse_sortexpr = function( expr ) {
return [$parse( expr ), null, false];
};

this.setSortField = function( sortexpr, element ) {
var i;
var expr = parse_sortexpr( sortexpr );
if( $scope.sortExpression.length === 1
&& $scope.sortExpression[0][0] === expr[0] ) {
if( $scope.sortExpression[0][2] ) {
element.removeClass( "tablesort-desc" );
element.addClass( "tablesort-asc" );
$scope.sortExpression[0][2] = false;
}
else {
element.removeClass( "tablesort-asc" );
element.addClass( "tablesort-desc" );
$scope.sortExpression[0][2] = true;
}
}
else {
for( i=0; i<$scope.headings.length; i=i+1 ) {
$scope.headings[i]
.removeClass( "tablesort-desc" )
.removeClass( "tablesort-asc" );
}
element.addClass( "tablesort-asc" );
$scope.sortExpression = [expr];
}
};

this.addSortField = function( sortexpr, element ) {
var i;
var toggle_order = false;
var expr = parse_sortexpr( sortexpr );
for( i=0; i<$scope.sortExpression.length; i=i+1 ) {
if( $scope.sortExpression[i][0] === expr[0] ) {
if( $scope.sortExpression[i][2] ) {
element.removeClass( "tablesort-desc" );
element.addClass( "tablesort-asc" );
$scope.sortExpression[i][2] = false;
}
else {
element.removeClass( "tablesort-asc" );
element.addClass( "tablesort-desc" );
$scope.sortExpression[i][2] = true;
}
toggle_order = true;
}
}
if( !toggle_order ) {
element.addClass( "tablesort-asc" );
$scope.sortExpression.push( expr );
}
};

this.registerHeading = function( headingelement ) {
$scope.headings.push( headingelement );
};

$scope.sortFun = function( a, b ) {
var i, aval, bval, descending;
for( i=0; i<$scope.sortExpression.length; i=i+1 ){
aval = $scope.sortExpression[i][0](a);
bval = $scope.sortExpression[i][0](b);
filterFun = b[$scope.sortExpression[i][1]];
if( filterFun ) {
aval = filterFun( aval );
bval = filterFun( bval );
}
descending = $scope.sortExpression[i][2];
if( aval > bval ) {
return descending ? -1 : 1;
}
else if( aval < bval ) {
return descending ? 1 : -1;
}
}
return 0;
};
}
};
} );

tableSortModule.directive('tsCriteria', function() {
return {
require: "^tsWrapper",
link: function(scope, element, attrs, tsWrapperCtrl) {
var clickingCallback = function(event) {
scope.$apply( function() {
if( event.shiftKey ) {
tsWrapperCtrl.addSortField(attrs.tsCriteria, element);
}
else {
tsWrapperCtrl.setSortField(attrs.tsCriteria, element);
}
} );
};
element.bind('click', clickingCallback);
if( "tsDefault" in attrs && attrs.tsDefault !== "0" ) {
tsWrapperCtrl.addSortField( attrs.tsCriteria, element );
}
tsWrapperCtrl.registerHeading( element );
}
};
});

tableSortModule.directive("tsRepeat", function() {
return {
require: "^tsWrapper",
priority: 2000,
compile: function(tElement, tAttrs, transclude) {
tAttrs.ngRepeat += " | tablesortOrderBy:sortFun";
}
};
} );

tableSortModule.filter( 'tablesortOrderBy', function(){
return function(array, sortfun ) {
var arrayCopy = [];
for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
return arrayCopy.sort( sortfun );
};
} );

tableSortModule.filter( 'parseInt', function(){
return function(input) {
return parseInt( input );
};
} );

tableSortModule.filter( 'parseFloat', function(){
return function(input) {
return parseFloat( input );
};
} );
1 change: 1 addition & 0 deletions test1.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ <h1>Tablesort</h2>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
<script src="js/angular-tablesort.js"></script>
<script src="js/table.js"></script>
</body>
</html>

0 comments on commit f09e6de

Please sign in to comment.