/** * @ngdoc orderByObjectFilter * @name fasit.filter.#orderByObjectFilter * @ orderByObjectFilter * * @description * orderByObjectFilter är en smartare orderBy. Kaxigt eller hur? * Inspirerad av http://justinklemm.com/angularjs-filter-ordering-objects-ngrepeat/ */ angular.module('fbMocks')//angular.mock.module('fasit') .filter('orderByObject', function () { return function (items, field, reverse, lowercase) { function getPropValue(propString: string, option: Object): any { var properties = propString.split('.'); var value: any = option; for (var i = 0; i < properties.length; ++i) { if (angular.isUndefined(value)) { return undefined; } var prop = properties[i]; var isFunc = prop.length > 2 && prop.substr(prop.length - 2, 2) === '()'; if (isFunc) { prop = prop.substr(0, prop.length - 2); } value = value[prop]; if (isFunc && angular.isDefined(value)) { value = value(); } } if (lowercase) { value = value.toLowerCase(); } return value; } if (!field) { return items; } var filtered = []; angular.forEach(items, function (item) { filtered.push(item); }); filtered.sort(function (a, b) { var aVal = getPropValue(field, a); var bVal = getPropValue(field, b); if (aVal === bVal) { return 0; } if (typeof aVal === 'string') { aVal = aVal.toLocaleLowerCase(); } if (typeof bVal === 'string') { bVal = bVal.toLocaleLowerCase(); } if (reverse) { return (aVal < bVal || _.isUndefined(bVal) || _.isNull(bVal)) ? 1 : -1; } else { return (aVal > bVal || _.isUndefined(aVal) || _.isNull(aVal)) ? 1 : -1; } }); return filtered; } });