Skip to content

Commit 57673b3

Browse files
committed
Fixed esvit#93
Add expressions in the sortable attribute
1 parent f9102c2 commit 57673b3

15 files changed

+64
-55
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ For work in IE < 9 need jQuery, just add:
2424

2525
## Updates
2626

27+
### v0.3.1 (master)
28+
- Allow expressions in the sortable & filter attribute (Issue #93)
29+
2730
### v0.3.0
2831
- I abandoned from CoffeeScript in favor of a javascript, fully agree with http://blog.ponyfoo.com/2013/09/28/we-dont-want-your-coffee & (rus) http://habrahabr.ru/post/195944/
2932
- added examples of table with grouping

examples/demo10.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ <h1>Table with checkboxes</h1>
3232
<td data-title="'Name'" filter="{ 'name': 'select' }" filter-data="names($column)">
3333
{{user.name}}
3434
</td>
35-
<td data-title="'Money'" sortable="money">
35+
<td data-title="'Money'" sortable="'money'">
3636
{{user.money}}
3737
</td>
3838
</tr>

examples/demo12.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ <h1>Table with grouping</h1>
3232
</td>
3333
</tr>
3434
<tr ng-hide="group.$hideRows" ng-repeat="user in group.data">
35-
<td sortable="name" data-title="'Name'">
35+
<td sortable="'name'" data-title="'Name'">
3636
{{user.name}}
3737
</td>
38-
<td sortable="age" data-title="'Age'">
38+
<td sortable="'age'" data-title="'Age'">
3939
{{user.age}}
4040
</td>
4141
</tr>

examples/demo13.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ <h1>Table with grouping with callback</h1>
3333
</td>
3434
</tr>
3535
<tr ng-hide="group.$hideRows" ng-repeat="user in group.data">
36-
<td sortable="name" data-title="'Name'">
36+
<td sortable="'name'" data-title="'Name'">
3737
{{user.name}}
3838
</td>
39-
<td sortable="age" data-title="'Age'">
39+
<td sortable="'age'" data-title="'Age'">
4040
{{user.age}}
4141
</td>
4242
</tr>

examples/demo14.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ <h2>Dataset: <select ng-model="dataset" ng-options="ds for ds in datasets"></sel
2727

2828
<table ng-table="tableParams" class="table">
2929
<tr ng-repeat="user in $data">
30-
<td data-title="'Name'" sortable="name">
30+
<td data-title="'Name'" sortable="'name'">
3131
{{user.name}}
3232
</td>
3333
<td data-title="'Age'" sortable="'age'">

examples/demo18.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ <h1>Custom header</h1>
4747
</thead>
4848
<tbody>
4949
<tr ng-repeat="user in $data">
50-
<td data-title="'Name'" sortable="name">
50+
<td data-title="'Name'" sortable="'name'">
5151
{{user.name}}
5252
</td>
53-
<td data-title="'Age'" width="200">
53+
<td data-title="'Age'" width="200" sortable="'age'">
5454
{{user.age}}
5555
</td>
5656
<td data-title="'With default braces'" width="200">

examples/demo3.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ <h1>Table with sorting</h1>
2727

2828
<table ng-table="tableParams" class="table">
2929
<tr ng-repeat="user in $data">
30-
<td data-title="'Name'" sortable="name">
30+
<td data-title="'Name'" sortable="'name'">
3131
{{user.name}}
3232
</td>
3333
<td data-title="'Age'" sortable="'age'">

examples/demo5.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ <h1>Saving params in url</h1>
2424
<div ng-controller="DemoCtrl">
2525
<table ng-table="tableParams" class="table">
2626
<tr ng-repeat="user in $data">
27-
<td data-title="'Name'" sortable="name">
27+
<td data-title="'Name'" sortable="'name'">
2828
{{user.name}}
2929
</td>
30-
<td data-title="'Age'" sortable="age">
30+
<td data-title="'Age'" sortable="'age'">
3131
{{user.age}}
3232
</td>
3333
</tr>

examples/demo6.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ <h1>AJAX Data Loading</h1>
5050
<div loading-container="tableParams.settings().$loading">
5151
<table ng-table="tableParams" show-filter="true" class="table">
5252
<tr ng-repeat="user in $data">
53-
<td data-title="'Name'" filter="{ 'name': 'text' }" sortable="name">
53+
<td data-title="'Name'" filter="{ 'name': 'text' }" sortable="'name'">
5454
{{user.name}}
5555
{{$loading}}
5656
</td>
57-
<td data-title="'Age'" sortable="age">
57+
<td data-title="'Age'" sortable="'age'">
5858
{{user.age}}
5959
</td>
6060
</tr>

ng-table.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ng-table.map

+1-1
Large diffs are not rendered by default.

ng-table.src.js

+22-19
Original file line numberDiff line numberDiff line change
@@ -438,13 +438,13 @@ var ngTableController = ['$scope', 'ngTableParams', '$q', function($scope, ngTab
438438
}, true);
439439

440440
$scope.sortBy = function (column) {
441-
var sorting, sortingParams;
442-
if (!column.sortable) {
441+
var parsedSortable = $scope.parse(column.sortable);
442+
if (!parsedSortable) {
443443
return;
444444
}
445-
sorting = $scope.params.sorting() && $scope.params.sorting()[column.sortable] && ($scope.params.sorting()[column.sortable] === "desc");
446-
sortingParams = {};
447-
sortingParams[column.sortable] = (sorting ? 'asc' : 'desc');
445+
var sorting = $scope.params.sorting() && $scope.params.sorting()[parsedSortable] && ($scope.params.sorting()[parsedSortable] === "desc");
446+
var sortingParams = {};
447+
sortingParams[parsedSortable] = (sorting ? 'asc' : 'desc');
448448
$scope.params.parameters({
449449
sorting: sortingParams
450450
});
@@ -496,27 +496,30 @@ app.directive('ngTable', ['$compile', '$q', '$parse',
496496
if (el.attr('ignore-cell') && 'true' === el.attr('ignore-cell')) {
497497
return;
498498
}
499-
var parsedTitle = function (scope) {
500-
return $parse(el.attr('x-data-title') || el.attr('data-title') || el.attr('title'))(scope, {
501-
$columns: columns
502-
}) || ' ';
503-
};
504-
el.attr('data-title-text', parsedTitle());
505-
var headerTemplateURL = function (scope) {
506-
return $parse(el.attr("x-data-header") || el.attr("data-header") || el.attr("header"))(scope, {
507-
$columns: columns
508-
}) || false;
499+
var parsedAttribute = function(attr, defaultValue) {
500+
return function(scope) {
501+
return $parse(el.attr('x-data-' + attr) || el.attr('data-' + attr) || el.attr(attr))(scope, {
502+
$columns: columns
503+
}) || defaultValue;
504+
};
509505
};
510-
var filter = el.attr("filter") ? $parse(el.attr("filter"))() : false;
511-
var filterTemplateURL = false;
506+
507+
var parsedTitle = parsedAttribute('title', ' '),
508+
headerTemplateURL = parsedAttribute('header', false)(),
509+
filter = parsedAttribute('filter', false)(),
510+
filterTemplateURL = false;
511+
512512
if (filter && filter.templateURL) {
513513
filterTemplateURL = filter.templateURL;
514514
delete filter.templateURL;
515515
}
516+
517+
// this used in responsive table
518+
el.attr('data-title-text', parsedTitle());
516519
columns.push({
517520
id: i++,
518521
title: parsedTitle,
519-
sortable: (el.attr("sortable") ? el.attr("sortable") : false),
522+
sortable: parsedAttribute('sortable', false),
520523
filter: filter,
521524
filterTemplateURL: filterTemplateURL,
522525
headerTemplateURL: headerTemplateURL,
@@ -594,7 +597,7 @@ app.directive('ngTable', ['$compile', '$q', '$parse',
594597
angular.module('ngTable').run(['$templateCache', function ($templateCache) {
595598
$templateCache.put('ng-table/filters/select.html', '<select ng-options="data.id as data.title for data in column.data" ng-model="params.filter()[name]" ng-show="filter==\'select\'" class="filter filter-select form-control"> </select>');
596599
$templateCache.put('ng-table/filters/text.html', '<input type="text" ng-model="params.filter()[name]" ng-if="filter==\'text\'" class="input-filter form-control"/>');
597-
$templateCache.put('ng-table/header.html', '<tr> <th ng-repeat="column in $columns" ng-class="{ \'sortable\': column.sortable, \'sort-asc\': params.sorting()[column.sortable]==\'asc\', \'sort-desc\': params.sorting()[column.sortable]==\'desc\', column.class: true }" ng-click="sortBy(column)" ng-show="column.show(this)" ng-init="template=column.headerTemplateURL(this)" class="header"> <div ng-if="!template" ng-bind="parse(column.title)"></div> <div ng-if="template"><div ng-include="template"></div></div> </th> </tr> <tr ng-show="show_filter" class="ng-table-filters"> <th ng-repeat="column in $columns" ng-show="column.show(this)" class="filter"> <div ng-repeat="(name, filter) in column.filter"> <div ng-if="column.filterTemplateURL"> <div ng-include="column.filterTemplateURL"></div> </div> <div ng-if="!column.filterTemplateURL"> <div ng-include="\'ng-table/filters/\' + filter + \'.html\'"></div> </div> </div> </th> </tr>');
600+
$templateCache.put('ng-table/header.html', '<tr> <th ng-repeat="column in $columns" ng-class="{ \'sortable\': parse(column.sortable), \'sort-asc\': params.sorting()[parse(column.sortable)]==\'asc\', \'sort-desc\': params.sorting()[parse(column.sortable)]==\'desc\', column.class: true }" ng-click="sortBy(column)" ng-show="column.show(this)" ng-init="template=column.headerTemplateURL(this)" class="header"> <div ng-if="!template" ng-bind="parse(column.title)"></div> <div ng-if="template"><div ng-include="template"></div></div> </th> </tr> <tr ng-show="show_filter" class="ng-table-filters"> <th ng-repeat="column in $columns" ng-show="column.show(this)" class="filter"> <div ng-repeat="(name, filter) in column.filter"> <div ng-if="column.filterTemplateURL"> <div ng-include="column.filterTemplateURL"></div> </div> <div ng-if="!column.filterTemplateURL"> <div ng-include="\'ng-table/filters/\' + filter + \'.html\'"></div> </div> </div> </th> </tr>');
598601
$templateCache.put('ng-table/pager.html', '<div class="ng-cloak"> <div ng-if="params.settings().counts.length" class="btn-group pull-right"> <button ng-repeat="count in params.settings().counts" type="button" ng-class="{\'active\':params.count()==count}" ng-click="params.count(count)" class="btn btn-default btn-xs"> <span ng-bind="count"></span> </button> </div> <ul class="pagination"> <li ng-class="{\'disabled\': !page.active}" ng-repeat="page in pages" ng-switch="page.type"> <a ng-switch-when="prev" ng-click="params.page(page.number)" href="">&laquo;</a> <a ng-switch-when="first" ng-click="params.page(page.number)" href=""><span ng-bind="page.number"></span></a> <a ng-switch-when="page" ng-click="params.page(page.number)" href=""><span ng-bind="page.number"></span></a> <a ng-switch-when="more" ng-click="params.page(page.number)" href="">&#8230;</a> <a ng-switch-when="last" ng-click="params.page(page.number)" href=""><span ng-bind="page.number"></span></a> <a ng-switch-when="next" ng-click="params.page(page.number)" href="">&raquo;</a> </li> </ul> </div>');
599602
}]);
600603
return app;

src/ng-table/header.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<tr>
22
<th ng-repeat="column in $columns"
33
ng-class="{
4-
'sortable': column.sortable,
5-
'sort-asc': params.sorting()[column.sortable]=='asc',
6-
'sort-desc': params.sorting()[column.sortable]=='desc',
4+
'sortable': parse(column.sortable),
5+
'sort-asc': params.sorting()[parse(column.sortable)]=='asc',
6+
'sort-desc': params.sorting()[parse(column.sortable)]=='desc',
77
column.class: true
88
}"
99
ng-click="sortBy(column)"

src/scripts/04-controller.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ var ngTableController = ['$scope', 'ngTableParams', '$q', function($scope, ngTab
2727
}, true);
2828

2929
$scope.sortBy = function (column) {
30-
var sorting, sortingParams;
31-
if (!column.sortable) {
30+
var parsedSortable = $scope.parse(column.sortable);
31+
if (!parsedSortable) {
3232
return;
3333
}
34-
sorting = $scope.params.sorting() && $scope.params.sorting()[column.sortable] && ($scope.params.sorting()[column.sortable] === "desc");
35-
sortingParams = {};
36-
sortingParams[column.sortable] = (sorting ? 'asc' : 'desc');
34+
var sorting = $scope.params.sorting() && $scope.params.sorting()[parsedSortable] && ($scope.params.sorting()[parsedSortable] === "desc");
35+
var sortingParams = {};
36+
sortingParams[parsedSortable] = (sorting ? 'asc' : 'desc');
3737
$scope.params.parameters({
3838
sorting: sortingParams
3939
});

src/scripts/05-directive.js

+16-13
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,30 @@ app.directive('ngTable', ['$compile', '$q', '$parse',
4444
if (el.attr('ignore-cell') && 'true' === el.attr('ignore-cell')) {
4545
return;
4646
}
47-
var parsedTitle = function (scope) {
48-
return $parse(el.attr('x-data-title') || el.attr('data-title') || el.attr('title'))(scope, {
49-
$columns: columns
50-
}) || ' ';
51-
};
52-
el.attr('data-title-text', parsedTitle());
53-
var headerTemplateURL = function (scope) {
54-
return $parse(el.attr("x-data-header") || el.attr("data-header") || el.attr("header"))(scope, {
55-
$columns: columns
56-
}) || false;
47+
var parsedAttribute = function(attr, defaultValue) {
48+
return function(scope) {
49+
return $parse(el.attr('x-data-' + attr) || el.attr('data-' + attr) || el.attr(attr))(scope, {
50+
$columns: columns
51+
}) || defaultValue;
52+
};
5753
};
58-
var filter = el.attr("filter") ? $parse(el.attr("filter"))() : false;
59-
var filterTemplateURL = false;
54+
55+
var parsedTitle = parsedAttribute('title', ' '),
56+
headerTemplateURL = parsedAttribute('header', false)(),
57+
filter = parsedAttribute('filter', false)(),
58+
filterTemplateURL = false;
59+
6060
if (filter && filter.templateURL) {
6161
filterTemplateURL = filter.templateURL;
6262
delete filter.templateURL;
6363
}
64+
65+
// this used in responsive table
66+
el.attr('data-title-text', parsedTitle());
6467
columns.push({
6568
id: i++,
6669
title: parsedTitle,
67-
sortable: (el.attr("sortable") ? el.attr("sortable") : false),
70+
sortable: parsedAttribute('sortable', false),
6871
filter: filter,
6972
filterTemplateURL: filterTemplateURL,
7073
headerTemplateURL: headerTemplateURL,

0 commit comments

Comments
 (0)