diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-04-20 22:31:58 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-04-20 22:31:58 +0200 |
commit | 7005470a7f08f26464f7bff053a210b734de8622 (patch) | |
tree | bef8f012c0631c52de963f7b96c7ab63555581c3 /js | |
parent | a4fe8a06a814a216a20e8c861ada446f45a7ffbc (diff) |
Sort contact list with respect to the locale - fixes #376
Diffstat (limited to 'js')
-rw-r--r-- | js/filters/localeOrderBy_filter.js | 42 | ||||
-rw-r--r-- | js/tests/filters/localeOrderBy_filter.js | 18 |
2 files changed, 60 insertions, 0 deletions
diff --git a/js/filters/localeOrderBy_filter.js b/js/filters/localeOrderBy_filter.js new file mode 100644 index 00000000..ecb2ad73 --- /dev/null +++ b/js/filters/localeOrderBy_filter.js @@ -0,0 +1,42 @@ +angular.module('contactsApp') +.filter('localeOrderBy', [function () { + return function (array, sortPredicate, reverseOrder) { + if (!Array.isArray(array)) return array; + if (!sortPredicate) return array; + + var isString = function (value) { + return (typeof value === 'string'); + }; + + var isNumber = function (value) { + return (typeof value === 'number'); + }; + + var isBoolean = function (value) { + return (typeof value === 'boolean'); + }; + + var arrayCopy = []; + angular.forEach(array, function (item) { + arrayCopy.push(item); + }); + + arrayCopy.sort(function (a, b) { + var valueA = a[sortPredicate]; + var valueB = b[sortPredicate]; + + if (isString(valueA)) { + return !reverseOrder ? valueA.localeCompare(valueB) : valueB.localeCompare(valueA); + } + + if (isNumber(valueA) || isBoolean(valueA)) { + return !reverseOrder ? valueA - valueB : valueB - valueA; + } + + return 0; + }); + + return arrayCopy; + }; +}]); + diff --git a/js/tests/filters/localeOrderBy_filter.js b/js/tests/filters/localeOrderBy_filter.js new file mode 100644 index 00000000..697db5a9 --- /dev/null +++ b/js/tests/filters/localeOrderBy_filter.js @@ -0,0 +1,18 @@ +describe('localeOrderBy filter', function() { + + var $filter; + + beforeEach(module('contactsApp')); + + beforeEach(inject(function(_$filter_){ + $filter = _$filter_; + })); + + it('should return the array properly sorted', function() { + var localeOrderBy = $filter('localeOrderBy'); + var sorted = $filter('localeOrderBy')([{name:'Mb'}, {name:'Mab'}, {name:'Máa'}], 'name', false); + var expected = [{name:'Máa'}, {name:'Mab'}, {name:'Mb'}]; + + expect(sorted).to.deep.equal(expected); + }); +}); |