I've created a custom filter in angularjs, which groups my elements by date.
This is the HTML part:
<table ng-repeat="(index, groupData) in something = (recentTasks | groupBy:dataGroupBy) track by $index">
The filter looks like this:
module.filter('groupBy', function () {
return function(items, field) {
var groups = [];
switch (field) {
case 'week':
angular.forEach(items, function(item) {
var parsed = parseDateTime(item.date);
var date = new Date(parsed.year, parsed.month - 1, parsed.day);
var back = calculateWeeksBack(date);
if (groups[back] == undefined)
{
groups[back] = {
time_back: calculateWeeksBack(date),
tasks: []
};
}
groups[back].tasks.push(item);
groups[back].total_time += item.time;
});
break;
case 'month':
angular.forEach(items, function(item) {
var parsed = parseDateTime(item.date);
var date = new Date(parsed.year, parsed.month - 1, parsed.day);
var back = calculateMonthsBack(date);
if (groups[back] == undefined)
{
groups[back] = {
time_back: calculateMonthsBack(date),
tasks: []
};
}
groups[back].tasks.push(item);
groups[back].total_time += item.time;
});
break;
default:
angular.forEach(items, function(item) {
var parsed = parseDateTime(item.date);
var date = new Date(parsed.year, parsed.month - 1, parsed.day);
var back = calculateDaysBack(date);
if (groups[back] == undefined)
{
groups[back] = {
time_back: calculateDaysBack(date),
tasks: []
};
}
groups[back].tasks.push(item);
groups[back].total_time += item.time;
});
}
return groups;
}
});
What it does - the input (recentTasks) is an array of tasks. Every task has a 'date' parameter defined. I need to separate these tasks by date - every day will be in separate table. It works, but I get infinite digest loop.
Could you help me how to solve my problem? Or is there a better solution?
EDIT: Examples of input and output:
$scope.items = [
{name: 'Abc', date: '2014-03-12'},
{name: 'Def', date: '2014-03-13'},
{name: 'Ghi', date: '2014-03-11'},
{name: 'Jkl', date: '2014-03-12'}
]
The output has to be grouped like this:
[
'2013-03-11': [
{name: 'Ghi'}
],
'2013-03-12': [
{name: 'Abc'},
{name: 'Jkl'}
],
'2013-03-13': [
{name: 'Def'}
]
]
Because items for every single day are in separated table in HTML structure.
<table ng-repeat="dayData in groupBy(items, 'day')">
<thead>
<tr><td>{{ dayData.date }}</td> </tr>
</thead>
<tbody>
<tr ng-repeat="item in dayData.items">
<td>{{ item.name }}</td>
</tr>
</tbody>
</table>