diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js index da4d887634..f5b876c37b 100644 --- a/core/js/sharedialogview.js +++ b/core/js/sharedialogview.js @@ -326,7 +326,23 @@ var suggestions = exactMatches.concat(users).concat(groups).concat(remotes).concat(remoteGroups).concat(emails).concat(circles).concat(rooms).concat(lookup); - deferred.resolve(suggestions, exactMatches); + var moreResultsAvailable = + ( + oc_config['sharing.maxAutocompleteResults'] > 0 + && Math.min(perPage, oc_config['sharing.maxAutocompleteResults']) + <= Math.max( + users.length + exactUsers.length, + groups.length + exactGroups.length, + remoteGroups.length + exactRemoteGroups.length, + remotes.length + exactRemotes.length, + emails.length + exactEmails.length, + circles.length + exactCircles.length, + rooms.length + exactRooms.length, + lookup.length + ) + ); + + deferred.resolve(suggestions, exactMatches, moreResultsAvailable); } else { deferred.reject(result.ocs.meta.message); } @@ -380,12 +396,12 @@ $shareWithField.removeClass('error') .tooltip('hide'); - var perPage = 200; + var perPage = parseInt(oc_config['sharing.maxAutocompleteResults'], 10) || 200; this._getSuggestions( search.term.trim(), perPage, view.model - ).done(function(suggestions) { + ).done(function(suggestions, exactMatches, moreResultsAvailable) { view._pendingOperationsCount--; if (view._pendingOperationsCount === 0) { $loading.addClass('hidden'); @@ -401,10 +417,7 @@ // show a notice that the list is truncated // this is the case if one of the search results is at least as long as the max result config option - if(oc_config['sharing.maxAutocompleteResults'] > 0 && - Math.min(perPage, oc_config['sharing.maxAutocompleteResults']) - <= Math.max(users.length, groups.length, remotes.length, emails.length, lookup.length)) { - + if(moreResultsAvailable) { var message = t('core', 'This list is maybe truncated - please refine your search term to see more results.'); $('.ui-autocomplete').append('
  • ' + message + '
  • '); } @@ -557,7 +570,7 @@ $shareWithField.focus(); }; - var perPage = 200; + var perPage = parseInt(oc_config['sharing.maxAutocompleteResults'], 10) || 200; var onlyExactMatches = true; this._getSuggestions( $shareWithField.val(), diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js index 20504c56b6..efe50c415c 100644 --- a/core/js/tests/specs/sharedialogviewSpec.js +++ b/core/js/tests/specs/sharedialogviewSpec.js @@ -22,6 +22,7 @@ /* global oc_appconfig, sinon */ describe('OC.Share.ShareDialogView', function() { var $container; + var oldConfig; var oldAppConfig; var autocompleteStub; var avatarStub; @@ -40,6 +41,9 @@ describe('OC.Share.ShareDialogView', function() { // horrible parameters $('#testArea').append(''); $container = $('#shareContainer'); + oldConfig = window.oc_config; + window.oc_config = window.oc_config || {}; + window.oc_config['sharing.maxAutocompleteResults'] = 0; /* jshint camelcase:false */ oldAppConfig = _.extend({}, oc_appconfig.core); oc_appconfig.core.enforcePasswordForPublicLink = false; @@ -108,6 +112,7 @@ describe('OC.Share.ShareDialogView', function() { }); afterEach(function() { OC.currentUser = oldCurrentUser; + window.oc_config = oldConfig; /* jshint camelcase:false */ oc_appconfig.core = oldAppConfig; @@ -357,9 +362,10 @@ describe('OC.Share.ShareDialogView', function() { ); expect(doneStub.calledOnce).toEqual(true); - expect(doneStub.calledWithExactly([], [])).toEqual(true); + expect(doneStub.calledWithExactly([], [], false)).toEqual(true); expect(failStub.called).toEqual(false); }); + it('single partial match', function() { var doneStub = sinon.stub(); var failStub = sinon.stub(); @@ -407,11 +413,14 @@ describe('OC.Share.ShareDialogView', function() { ); expect(doneStub.calledOnce).toEqual(true); - expect(doneStub.calledWithExactly([{ - 'label': 'bobby', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'imbob'} - }], [ - ])).toEqual(true); + expect(doneStub.calledWithExactly( + [{ + 'label': 'bobby', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'imbob'} + }], + [], + false + )).toEqual(true); expect(failStub.called).toEqual(false); }); it('single exact match', function() { @@ -461,13 +470,17 @@ describe('OC.Share.ShareDialogView', function() { ); expect(doneStub.calledOnce).toEqual(true); - expect(doneStub.calledWithExactly([{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }], [{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }])).toEqual(true); + expect(doneStub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + false + )).toEqual(true); expect(failStub.called).toEqual(false); }); it('mixed matches', function() { @@ -548,28 +561,140 @@ describe('OC.Share.ShareDialogView', function() { ); expect(doneStub.calledOnce).toEqual(true); - expect(doneStub.calledWithExactly([{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }, { - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group1'} - }, { - 'label': 'bobby', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'imbob'} - }, { - 'label': 'bob the second', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user2'} - }, { - 'label': 'bobfans', - 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'fans'} - }], [{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }, { - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group1'} - }])).toEqual(true); + expect(doneStub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }, { + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group1'} + }, { + 'label': 'bobby', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'imbob'} + }, { + 'label': 'bob the second', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user2'} + }, { + 'label': 'bobfans', + 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'fans'} + }], + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }, { + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group1'} + }], + false + )).toEqual(true); + expect(failStub.called).toEqual(false); + }); + + it('capped mixed matches', function() { + window.oc_config['sharing.maxAutocompleteResults'] = 3; + var doneStub = sinon.stub(); + var failStub = sinon.stub(); + + dialog._getSuggestions('bob', 42, shareModel).done(doneStub).fail(failStub); + + var jsonData = JSON.stringify({ + 'ocs': { + 'meta': { + 'status': 'success', + 'statuscode': 100, + 'message': null + }, + 'data': { + 'exact': { + 'users': [ + { + 'label': 'bob', + 'value': { + 'shareType': OC.Share.SHARE_TYPE_USER, + 'shareWith': 'user1' + } + } + ], + 'groups': [ + { + 'label': 'bob', + 'value': { + 'shareType': OC.Share.SHARE_TYPE_GROUP, + 'shareWith': 'group1' + } + } + ], + 'remotes': [], + 'remote_groups': [], + }, + 'users': [ + { + 'label': 'bobby', + 'value': { + 'shareType': OC.Share.SHARE_TYPE_USER, + 'shareWith': 'imbob' + } + }, + { + 'label': 'bob the second', + 'value': { + 'shareType': OC.Share.SHARE_TYPE_USER, + 'shareWith': 'user2' + } + } + ], + 'groups': [ + { + 'label': 'bobfans', + 'value': { + 'shareType': OC.Share.SHARE_TYPE_GROUP, + 'shareWith': 'fans' + } + } + ], + 'remotes': [], + 'remote_groups': [], + 'lookup': [] + } + } + }); + + expect(doneStub.called).toEqual(false); + expect(failStub.called).toEqual(false); + + fakeServer.requests[0].respond( + 200, + {'Content-Type': 'application/json'}, + jsonData + ); + + expect(doneStub.calledOnce).toEqual(true); + expect(doneStub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }, { + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group1'} + }, { + 'label': 'bobby', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'imbob'} + }, { + 'label': 'bob the second', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user2'} + }, { + 'label': 'bobfans', + 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'fans'} + }], + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }, { + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_GROUP, 'shareWith': 'group1'} + }], + true + )).toEqual(true); expect(failStub.called).toEqual(false); }); @@ -620,13 +745,16 @@ describe('OC.Share.ShareDialogView', function() { ); expect(doneStub.calledOnce).toEqual(true); - expect(doneStub.calledWithExactly([{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }], [{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }])).toEqual(true); + expect(doneStub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + false + )).toEqual(true); expect(failStub.called).toEqual(false); var done2Stub = sinon.stub(); @@ -638,13 +766,17 @@ describe('OC.Share.ShareDialogView', function() { expect(failStub.called).toEqual(false); expect(done2Stub.calledOnce).toEqual(true); - expect(done2Stub.calledWithExactly([{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }], [{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }])).toEqual(true); + expect(done2Stub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + false + )).toEqual(true); expect(fail2Stub.called).toEqual(false); }); @@ -695,13 +827,17 @@ describe('OC.Share.ShareDialogView', function() { ); expect(doneStub.calledOnce).toEqual(true); - expect(doneStub.calledWithExactly([{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }], [{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }])).toEqual(true); + expect(doneStub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + false + )).toEqual(true); expect(failStub.called).toEqual(false); var done2Stub = sinon.stub(); @@ -741,13 +877,17 @@ describe('OC.Share.ShareDialogView', function() { expect(fail2Stub.called).toEqual(false); expect(done3Stub.calledOnce).toEqual(true); - expect(done3Stub.calledWithExactly([{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }], [{ - 'label': 'bob', - 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} - }])).toEqual(true); + expect(done3Stub.calledWithExactly( + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + [{ + 'label': 'bob', + 'value': {'shareType': OC.Share.SHARE_TYPE_USER, 'shareWith': 'user1'} + }], + false + )).toEqual(true); expect(fail3Stub.called).toEqual(false); }); });