I am pretty new to Angularjs need some help with sorting date in milliseconds in descending order as well as a filter for the table columns. I created a plunker here but when I key in some filter param I do not see any filtered data and the data is lost from table.
Please help me in sorting date column and doing a case insensitive filter search, below I am providing my code.
<table ng-table="tableParams" show-filter="true" class="table" >
<tr ng-repeat="item in $data" height="10px">
<td data-title="'Date'" filter="{ 'item[0]': 'date' }" sortable="'item[0]'">{{translate(item[0])}}</td>
<td data-title="'Count'" filter="{ 'item[1]': 'text' }" sortable="'item[1]'">{{item[1]}}</td>
</tr>
</table>
$scope.translate = function(value) {
if (value == null || value == undefined)
return value;
var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
var myDate = new Date( value );
return myDate.getDate() + " " + monthNames[myDate.getMonth()] + " "+myDate.getFullYear();
}
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10 // count per page
}, {
total: $scope.tasksRunDataForTable.length, // length of data
getData: function($defer, params) {
// use build-in angular filter
var sortedData = params.sorting() ?
$filter('orderBy')($scope.tasksRunDataForTable, params.orderBy()) :
$scope.tasksRunDataForTable;
var orderedData = params.filter() ?
$filter('filter')(sortedData, params.filter()) :
sortedData;
params.total(orderedData.length); // set total for recalc pagination
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
Update
I am able to get filter work on count, but no luck with date and sorting on both columns. Updated plunker
<td data-title="'Count'" filter="{ '1': 'text' }" sortable="'1'">{{item[1]}}</td>
My solution:
Layout.html:
\apps\app.module.js:
Date Sorting
This is not an issue of the ngTable but how the underlying angular filter for 'OrderBy' works.
Just use
valueOf()[0]
,valueOf()[1]
respectively where 0 & 1 are the indexes for your inner array. Here is the html and there is no need to change your getData callback.Please note that you don't need a translate for presenting your dates from milliseconds as this is supported by an other angular filter 'date'.
See also this somehow related post https://stackoverflow.com/a/15858739/61577
Date Filtering (from string)
In order to achieve filtering from date you need to use a custom "comperator" function as a third argument when filtering on the controller. Something like this will do the trick
then on your controller getData callback:
UPDATE: updated the answer to tackle the filtering issue. UPDATE 2: Updated the answer to tackle when searching with both date and count.
here is the complete plunker http://plnkr.co/edit/D2n7MdAfugXpKeKOGosL?p=preview
Hope this helps.