summaryrefslogtreecommitdiffstats
path: root/js
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-04-20 22:31:58 +0200
committerThomas Müller <thomas.mueller@tmit.eu>2016-04-20 22:31:58 +0200
commit7005470a7f08f26464f7bff053a210b734de8622 (patch)
treebef8f012c0631c52de963f7b96c7ab63555581c3 /js
parenta4fe8a06a814a216a20e8c861ada446f45a7ffbc (diff)
Sort contact list with respect to the locale - fixes #376
Diffstat (limited to 'js')
-rw-r--r--js/filters/localeOrderBy_filter.js42
-rw-r--r--js/tests/filters/localeOrderBy_filter.js18
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);
+ });
+});