Configurable options for search, info when at max

includes the options for  maximum search results per page, and the
maximum number of pages available before help text is shown, and
the next page button is disabled
This commit is contained in:
Sam Chow 2018-04-24 16:25:12 -04:00
parent 8d5e8fc685
commit 1afedafcbb
7 changed files with 50 additions and 9 deletions

View file

@ -23,7 +23,8 @@ CLIENT_WHITELIST = ['SERVER_HOSTNAME', 'PREFERRED_URL_SCHEME', 'MIXPANEL_KEY',
'CONTACT_INFO', 'AVATAR_KIND', 'LOCAL_OAUTH_HANDLER', 'DOCUMENTATION_LOCATION',
'DOCUMENTATION_METADATA', 'SETUP_COMPLETE', 'DEBUG', 'MARKETO_MUNCHKIN_ID',
'STATIC_SITE_BUCKET', 'RECAPTCHA_SITE_KEY', 'CHANNEL_COLORS',
'TAG_EXPIRATION_OPTIONS', 'INTERNAL_OIDC_SERVICE_ID']
'TAG_EXPIRATION_OPTIONS', 'INTERNAL_OIDC_SERVICE_ID',
'SEARCH_RESULTS_PER_PAGE', 'SEARCH_MAX_RESULT_PAGE_COUNT']
def frontend_visible_config(config_dict):
@ -531,3 +532,9 @@ class DefaultConfig(ImmutableConfig):
# Defines the delay required (in seconds) before the last_accessed field of a user/robot or access
# token will be updated after the previous update.
LAST_ACCESSED_UPDATE_THRESHOLD_S = 60
# Defines the number of results per page used to show search results
SEARCH_RESULTS_PER_PAGE = 10
# Defines the maximum number of pages the user can paginate before they are limited
SEARCH_MAX_RESULT_PAGE_COUNT = 10

View file

@ -12,7 +12,7 @@ from auth.permissions import (OrganizationMemberPermission, ReadRepositoryPermis
ReadRepositoryPermission)
from auth.auth_context import get_authenticated_user
from auth import scopes
from app import avatar, authentication
from app import app, avatar, authentication
from flask import abort
from operator import itemgetter
from stringscore import liquidmetal
@ -335,7 +335,8 @@ class ConductSearch(ApiResource):
return {'results': sorted(results, key=itemgetter('score'), reverse=True)}
MAX_PER_PAGE = 10
MAX_PER_PAGE = app.config.get('SEARCH_RESULTS_PER_PAGE', 10)
MAX_RESULT_PAGE_COUNT = app.config.get('SEARCH_MAX_RESULT_PAGE_COUNT', 10)
@resource('/v1/find/repositories')
class ConductRepositorySearch(ApiResource):
@ -347,7 +348,7 @@ class ConductRepositorySearch(ApiResource):
def get(self, parsed_args):
""" Get a list of apps and repositories that match the specified query. """
query = parsed_args['query']
page = min(max(1, parsed_args['page']), 10)
page = min(max(1, parsed_args['page']), MAX_RESULT_PAGE_COUNT)
offset = (page - 1) * MAX_PER_PAGE
limit = offset + MAX_PER_PAGE + 1

View file

@ -85,6 +85,20 @@
padding: 6px;
}
.search .search-max-results-info {
padding-left: 5px;
}
.search .page-navigation-wrapper {
display: flex;
align-items: center;
}
.search .page-navigation-wrapper :first-child {
margin-right: 5px;
}
@media screen and (max-width: 767px) {
.search {
padding: 0px;

View file

@ -8,7 +8,7 @@
});
}]);
function SearchCtrl($scope, ApiService, $routeParams, $location) {
function SearchCtrl($scope, ApiService, $routeParams, $location, Config) {
var refreshResults = function() {
$scope.currentPage = ($routeParams['page'] || '1') * 1;
@ -17,10 +17,16 @@
'page': $scope.currentPage
};
var MAX_PAGE_RESULTS = Config['SEARCH_MAX_RESULT_PAGE_COUNT'];
var page = $routeParams['page'] || 1;
$scope.maxPopularity = 0;
$scope.resultsResource = ApiService.conductRepoSearchAsResource(params).get(function(resp) {
$scope.results = resp['results'];
$scope.hasAdditional = resp['has_additional'];
// Only show "Next Page" if we have more results, and we aren't on the max page
$scope.showNextButton = page < MAX_PAGE_RESULTS && resp['has_additional'];
// Show some help text if we're on the last page, making them specify the search more
$scope.showMaxResultsHelpText = page >= MAX_PAGE_RESULTS;
$scope.startIndex = resp['start_index'];
resp['results'].forEach(function(result) {
$scope.maxPopularity = Math.max($scope.maxPopularity, result['popularity']);
@ -45,5 +51,5 @@
});
}
SearchCtrl.$inject = ['$scope', 'ApiService', '$routeParams', '$location'];
SearchCtrl.$inject = ['$scope', 'ApiService', '$routeParams', '$location', 'Config'];
})();

View file

@ -40,8 +40,11 @@
</div>
</li>
</ol>
<a class="btn btn-default" ng-click="previousPage()" ng-if="currentPage > 1">Previous Page</a>
<a class="btn btn-default" ng-click="nextPage()" ng-if="hasAdditional">Next Page</a>
<div class="page-navigation-wrapper">
<a class="btn btn-default" ng-click="previousPage()" ng-if="currentPage > 1">Previous Page</a>
<a class="btn btn-default" ng-click="nextPage()" ng-if="showNextButton">Next Page</a>
<span class="search-max-results-info" ng-if="showMaxResultsHelpText">You've reached the maximum number of viewable results. Please refine your search.</span>
</div>
</div>
</div>
</div>

Binary file not shown.

View file

@ -166,6 +166,16 @@ CONFIG_SCHEMA = {
},
],
},
'SEARCH_RESULTS_PER_PAGE' : {
'type': 'number',
'description': 'Number of results returned per page by search page. Defaults to 10',
'x-example': 10,
},
'SEARCH_MAX_RESULT_PAGE_COUNT' : {
'type': 'number',
'description': 'Maximum number of pages the user can paginate in search before they are limited. Defaults to 10',
'x-example': 10,
},
# E-mail.
'FEATURE_MAILING': {