From 31fa2f73d4089630b158d23f765db3a675b77683 Mon Sep 17 00:00:00 2001 From: Ilja Neumann Date: Tue, 17 Jan 2017 14:35:22 +0100 Subject: [PATCH 1/2] Sharing dialog: Names sorting is case sensitive #25971 Sharing dialog: Names sorting is case sensitive: adding tests #25971 Signed-off-by: Morris Jobke --- core/js/sharedialogview.js | 3 + core/js/tests/specs/sharedialogviewSpec.js | 74 ++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js index a63960da2b8bd..78168336bb73c 100644 --- a/core/js/sharedialogview.js +++ b/core/js/sharedialogview.js @@ -260,6 +260,9 @@ var suggestions = users.concat(groups).concat(remotes).concat(emails).concat(lookup); if (suggestions.length > 0) { + suggestions.sort(function (a, b) { + return OC.Util.naturalSortCompare(a.label, b.label); + }); $shareWithField .autocomplete("option", "autoFocus", true); diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js index 307adea85ffd5..7e3232f86e17f 100644 --- a/core/js/tests/specs/sharedialogviewSpec.js +++ b/core/js/tests/specs/sharedialogviewSpec.js @@ -490,6 +490,80 @@ describe('OC.Share.ShareDialogView', function() { }); }); describe('autocompletion of users', function() { + it('is sorted naturally', function () { + dialog.render(); + var response = sinon.stub(); + dialog.autocompleteHandler({term: 'p'}, response); + var jsonData = JSON.stringify({ + 'ocs' : { + 'meta' : { + 'status' : 'success', + 'statuscode' : 100, + 'message' : null + }, + 'data' : { + 'exact' : { + 'users' : [], + 'groups' : [], + 'remotes': [] + }, + 'users' : [{ + "label": "Peter A.", + "value": { + "shareType": 0, + "shareWith": "Peter A." + } + }, + { + "label": "Petra", + "value": { + "shareType": 0, + "shareWith": "Petra" + } + }, + { + "label": "peter B.", + "value": { + "shareType": 0, + "shareWith": "peter B." + } + }], + 'groups' : [], + 'remotes': [] + } + } + }); + + fakeServer.requests[0].respond( + 200, + {'Content-Type': 'application/json'}, + jsonData + ); + + expect(response.calledWithExactly([ + { + "label": "Peter A.", + "value": { + "shareType": 0, + "shareWith": "Peter A." + } + }, + { + "label": "peter B.", + "value": { + "shareType": 0, + "shareWith": "peter B." + } + }, + { + "label": "Petra", + "value": { + "shareType": 0, + "shareWith": "Petra" + } + } + ])).toEqual(true); + }); it('triggers autocomplete display and focus with data when ajax search succeeds', function () { dialog.render(); var response = sinon.stub(); From dbaebc53b0267f526dc0d59275292f8d129b27c4 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Wed, 22 Mar 2017 17:11:09 -0600 Subject: [PATCH 2/2] fix sorting in the backend Signed-off-by: Morris Jobke --- core/js/sharedialogview.js | 3 - core/js/tests/specs/sharedialogviewSpec.js | 74 ---------------------- lib/private/User/Database.php | 4 +- lib/private/User/Manager.php | 2 +- 4 files changed, 3 insertions(+), 80 deletions(-) diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js index 78168336bb73c..a63960da2b8bd 100644 --- a/core/js/sharedialogview.js +++ b/core/js/sharedialogview.js @@ -260,9 +260,6 @@ var suggestions = users.concat(groups).concat(remotes).concat(emails).concat(lookup); if (suggestions.length > 0) { - suggestions.sort(function (a, b) { - return OC.Util.naturalSortCompare(a.label, b.label); - }); $shareWithField .autocomplete("option", "autoFocus", true); diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js index 7e3232f86e17f..307adea85ffd5 100644 --- a/core/js/tests/specs/sharedialogviewSpec.js +++ b/core/js/tests/specs/sharedialogviewSpec.js @@ -490,80 +490,6 @@ describe('OC.Share.ShareDialogView', function() { }); }); describe('autocompletion of users', function() { - it('is sorted naturally', function () { - dialog.render(); - var response = sinon.stub(); - dialog.autocompleteHandler({term: 'p'}, response); - var jsonData = JSON.stringify({ - 'ocs' : { - 'meta' : { - 'status' : 'success', - 'statuscode' : 100, - 'message' : null - }, - 'data' : { - 'exact' : { - 'users' : [], - 'groups' : [], - 'remotes': [] - }, - 'users' : [{ - "label": "Peter A.", - "value": { - "shareType": 0, - "shareWith": "Peter A." - } - }, - { - "label": "Petra", - "value": { - "shareType": 0, - "shareWith": "Petra" - } - }, - { - "label": "peter B.", - "value": { - "shareType": 0, - "shareWith": "peter B." - } - }], - 'groups' : [], - 'remotes': [] - } - } - }); - - fakeServer.requests[0].respond( - 200, - {'Content-Type': 'application/json'}, - jsonData - ); - - expect(response.calledWithExactly([ - { - "label": "Peter A.", - "value": { - "shareType": 0, - "shareWith": "Peter A." - } - }, - { - "label": "peter B.", - "value": { - "shareType": 0, - "shareWith": "peter B." - } - }, - { - "label": "Petra", - "value": { - "shareType": 0, - "shareWith": "Petra" - } - } - ])).toEqual(true); - }); it('triggers autocomplete display and focus with data when ajax search succeeds', function () { dialog.render(); var response = sinon.stub(); diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php index a281572ad5584..dfbd995fb2ef2 100644 --- a/lib/private/User/Database.php +++ b/lib/private/User/Database.php @@ -193,7 +193,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { $displayNames = array(); $query = \OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users`' - . $searchLike .' ORDER BY `uid` ASC', $limit, $offset); + . $searchLike .' ORDER BY LOWER(`displayname`), LOWER(`uid`) ASC', $limit, $offset); $result = $query->execute($parameters); while ($row = $result->fetchRow()) { $displayNames[$row['uid']] = $row['displayname']; @@ -279,7 +279,7 @@ public function getUsers($search = '', $limit = null, $offset = null) { $searchLike = ' WHERE LOWER(`uid`) LIKE LOWER(?)'; } - $query = \OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users`' . $searchLike . ' ORDER BY `uid` ASC', $limit, $offset); + $query = \OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users`' . $searchLike . ' ORDER BY LOWER(`uid`) ASC', $limit, $offset); $result = $query->execute($parameters); $users = array(); while ($row = $result->fetchRow()) { diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index 3d016700ee333..77741efcc759f 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -254,7 +254,7 @@ public function searchDisplayName($pattern, $limit = null, $offset = null) { * @var \OC\User\User $a * @var \OC\User\User $b */ - return strcmp($a->getDisplayName(), $b->getDisplayName()); + return strcmp(strtolower($a->getDisplayName()), strtolower($b->getDisplayName())); }); return $users; }