Jonas Kress (WMDE) has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/277221

Change subject: Show pagination and search for huge results
......................................................................

Show pagination and search for huge results

Change-Id: I7417dd6ceac4092601f9dd4e6ed65cf079f5dfde
---
M index.html
A vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.js
A vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.min.js
A vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.js
A vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.min.js
M wikibase/queryService/ui/resultBrowser/TableResultBrowser.js
6 files changed, 448 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/gui 
refs/changes/21/277221/1

diff --git a/index.html b/index.html
index 62ea053..8d24047 100644
--- a/index.html
+++ b/index.html
@@ -190,6 +190,8 @@
        <script src="vendor/bootstrap-tags/js/bootstrap-tags.min.js"></script>
        <script src="vendor/bootstrap-table/bootstrap-table.min.js"></script>
        <script 
src="vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
+       <script 
src="vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.min.js"></script>
+       <script 
src="vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.js"></script>
        <script src="vendor/danml/download.min.js"></script>
        <script src="vendor/wdqs-explorer/vis.js"></script>
        <script src="vendor/wdqs-explorer/wdqs.js"></script>
diff --git a/vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.js 
b/vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.js
new file mode 100644
index 0000000..333165a
--- /dev/null
+++ b/vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.js
@@ -0,0 +1,335 @@
+/**
+ * @author: Dennis Hernández
+ * @webSite: http://djhvscf.github.io/Blog
+ * @version: v1.2.0
+ *
+ * @update zhixin wen <[email protected]>
+ */
+
+(function ($) {
+    'use strict';
+
+    var cookieIds = {
+        sortOrder: 'bs.table.sortOrder',
+        sortName: 'bs.table.sortName',
+        pageNumber: 'bs.table.pageNumber',
+        pageList: 'bs.table.pageList',
+        columns: 'bs.table.columns',
+        searchText: 'bs.table.searchText',
+        filterControl: 'bs.table.filterControl'
+    };
+
+    var getCurrentHeader = function (that) {
+        var header = that.$header;
+        if (that.options.height) {
+            header = that.$tableHeader;
+        }
+
+        return header;
+    };
+
+    var getCurrentSearchControls = function (that) {
+        var searchControls = 'select, input';
+        if (that.options.height) {
+            searchControls = 'table select, table input';
+        }
+
+        return searchControls;
+    };
+
+    var cookieEnabled = function () {
+        return !!(navigator.cookieEnabled);
+    };
+
+    var inArrayCookiesEnabled = function (cookieName, cookiesEnabled) {
+        var index = -1;
+
+        for (var i = 0; i < cookiesEnabled.length; i++) {
+            if (cookieName.toLowerCase() === cookiesEnabled[i].toLowerCase()) {
+                index = i;
+                break;
+            }
+        }
+
+        return index;
+    };
+
+    var setCookie = function (that, cookieName, cookieValue) {
+        if ((!that.options.cookie) || (!cookieEnabled()) || 
(that.options.cookieIdTable === '')) {
+            return;
+        }
+
+        if (inArrayCookiesEnabled(cookieName, that.options.cookiesEnabled) === 
-1) {
+            return;
+        }
+
+        cookieName = that.options.cookieIdTable + '.' + cookieName;
+        if (!cookieName || 
/^(?:expires|max\-age|path|domain|secure)$/i.test(cookieName)) {
+            return false;
+        }
+
+        document.cookie = encodeURIComponent(cookieName) + '=' + 
encodeURIComponent(cookieValue) + 
calculateExpiration(that.options.cookieExpire) + (that.options.cookieDomain ? 
'; domain=' + that.options.cookieDomain : '') + (that.options.cookiePath ? '; 
path=' + that.options.cookiePath : '') + (that.cookieSecure ? '; secure' : '');
+        return true;
+    };
+
+    var getCookie = function (that, tableName, cookieName) {
+        if (!cookieName) {
+            return null;
+        }
+
+        if (inArrayCookiesEnabled(cookieName, that.options.cookiesEnabled) === 
-1) {
+            return null;
+        }
+
+        cookieName = tableName + '.' + cookieName;
+
+        return decodeURIComponent(document.cookie.replace(new 
RegExp('(?:(?:^|.*;)\\s*' + 
encodeURIComponent(cookieName).replace(/[\-\.\+\*]/g, '\\$&') + 
'\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1')) || null;
+    };
+
+    var hasCookie = function (cookieName) {
+        if (!cookieName) {
+            return false;
+        }
+        return (new RegExp('(?:^|;\\s*)' + 
encodeURIComponent(cookieName).replace(/[\-\.\+\*]/g, '\\$&') + 
'\\s*\\=')).test(document.cookie);
+    };
+
+    var deleteCookie = function (tableName, cookieName, sPath, sDomain) {
+        cookieName = tableName + '.' + cookieName;
+        if (!hasCookie(cookieName)) {
+            return false;
+        }
+        document.cookie = encodeURIComponent(cookieName) + '=; expires=Thu, 01 
Jan 1970 00:00:00 GMT' + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; 
path=' + sPath : '');
+        return true;
+    };
+
+    var calculateExpiration = function(cookieExpire) {
+        var time = cookieExpire.replace(/[0-9]*/, ''); //s,mi,h,d,m,y
+        cookieExpire = cookieExpire.replace(/[A-Za-z]/, ''); //number
+
+        switch (time.toLowerCase()) {
+            case 's':
+                cookieExpire = +cookieExpire;
+                break;
+            case 'mi':
+                cookieExpire = cookieExpire * 60;
+                break;
+            case 'h':
+                cookieExpire = cookieExpire * 60 * 60;
+                break;
+            case 'd':
+                cookieExpire = cookieExpire * 24 * 60 * 60;
+                break;
+            case 'm':
+                cookieExpire = cookieExpire * 30 * 24 * 60 * 60;
+                break;
+            case 'y':
+                cookieExpire = cookieExpire * 365 * 24 * 60 * 60;
+                break;
+            default:
+                cookieExpire = undefined;
+                break;
+        }
+
+        return cookieExpire === undefined ? '' : '; max-age=' + cookieExpire;
+    };
+
+    $.extend($.fn.bootstrapTable.defaults, {
+        cookie: false,
+        cookieExpire: '2h',
+        cookiePath: null,
+        cookieDomain: null,
+        cookieSecure: null,
+        cookieIdTable: '',
+        cookiesEnabled: ['bs.table.sortOrder', 'bs.table.sortName', 
'bs.table.pageNumber', 'bs.table.pageList', 'bs.table.columns', 
'bs.table.searchText', 'bs.table.filterControl'],
+        //internal variable
+        filterControls: [],
+        filterControlValuesLoaded: false
+    });
+
+    $.fn.bootstrapTable.methods.push('deleteCookie');
+
+    var BootstrapTable = $.fn.bootstrapTable.Constructor,
+        _init = BootstrapTable.prototype.init,
+        _initTable = BootstrapTable.prototype.initTable,
+        _onSort = BootstrapTable.prototype.onSort,
+        _onPageNumber = BootstrapTable.prototype.onPageNumber,
+        _onPageListChange = BootstrapTable.prototype.onPageListChange,
+        _onPageFirst = BootstrapTable.prototype.onPageFirst,
+        _onPagePre = BootstrapTable.prototype.onPagePre,
+        _onPageNext = BootstrapTable.prototype.onPageNext,
+        _onPageLast = BootstrapTable.prototype.onPageLast,
+        _toggleColumn = BootstrapTable.prototype.toggleColumn,
+        _selectPage = BootstrapTable.prototype.selectPage,
+        _onSearch = BootstrapTable.prototype.onSearch;
+
+    BootstrapTable.prototype.init = function () {
+        var timeoutId = 0;
+        this.options.filterControls = [];
+        this.options.filterControlValuesLoaded = false;
+
+
+        this.options.cookiesEnabled = typeof this.options.cookiesEnabled === 
'string' ?
+            this.options.cookiesEnabled.replace('[', '').replace(']', 
'').replace(/ /g, '').toLowerCase().split(',') : this.options.cookiesEnabled;
+
+        if (this.options.filterControl) {
+            var that = this;
+            this.$el.on('column-search.bs.table', function (e, field, text) {
+                var isNewField = true;
+
+                for (var i = 0; i < that.options.filterControls.length; i++) {
+                    if (that.options.filterControls[i].field === field) {
+                        that.options.filterControls[i].text = text;
+                        isNewField = false;
+                        break;
+                    }
+                }
+                if (isNewField) {
+                    that.options.filterControls.push({
+                        field: field,
+                        text: text
+                    });
+                }
+
+                setCookie(that, cookieIds.filterControl, 
JSON.stringify(that.options.filterControls));
+            }).on('post-body.bs.table', function () {
+                setTimeout(function () {
+                    if (!that.options.filterControlValuesLoaded) {
+                        that.options.filterControlValuesLoaded = true;
+                        var filterControl = JSON.parse(getCookie(that, 
that.options.cookieIdTable, cookieIds.filterControl));
+                        if (filterControl) {
+                            var field = null,
+                                result = [],
+                                header = getCurrentHeader(that),
+                                searchControls = 
getCurrentSearchControls(that);
+
+                            header.find(searchControls).each(function (index, 
ele) {
+                                field = 
$(this).closest('[data-field]').data('field');
+                                result = $.grep(filterControl, function 
(valueObj) {
+                                    return valueObj.field === field;
+                                });
+
+                                if (result.length > 0) {
+                                    $(this).val(result[0].text);
+                                    that.onColumnSearch({currentTarget: 
$(this)});
+                                }
+                            });
+                        }
+                    }
+                }, 250);
+            });
+        }
+        _init.apply(this, Array.prototype.slice.apply(arguments));
+    };
+
+    BootstrapTable.prototype.initTable = function () {
+        _initTable.apply(this, Array.prototype.slice.apply(arguments));
+        this.initCookie();
+    };
+
+    BootstrapTable.prototype.initCookie = function () {
+        if (!this.options.cookie) {
+            return;
+        }
+
+        if ((this.options.cookieIdTable === '') || (this.options.cookieExpire 
=== '') || (!cookieEnabled())) {
+            throw new Error("Configuration error. Please review the 
cookieIdTable, cookieExpire properties, if those properties are ok, then this 
browser does not support the cookies");
+            return;
+        }
+
+        var sortOrderCookie = getCookie(this, this.options.cookieIdTable, 
cookieIds.sortOrder),
+            sortOrderNameCookie = getCookie(this, this.options.cookieIdTable, 
cookieIds.sortName),
+            pageNumberCookie = getCookie(this, this.options.cookieIdTable, 
cookieIds.pageNumber),
+            pageListCookie = getCookie(this, this.options.cookieIdTable, 
cookieIds.pageList),
+            columnsCookie = JSON.parse(getCookie(this, 
this.options.cookieIdTable, cookieIds.columns)),
+            searchTextCookie = getCookie(this, this.options.cookieIdTable, 
cookieIds.searchText);
+
+        //sortOrder
+        this.options.sortOrder = sortOrderCookie ? sortOrderCookie : 
this.options.sortOrder;
+        //sortName
+        this.options.sortName = sortOrderNameCookie ? sortOrderNameCookie : 
this.options.sortName;
+        //pageNumber
+        this.options.pageNumber = pageNumberCookie ? +pageNumberCookie : 
this.options.pageNumber;
+        //pageSize
+        this.options.pageSize = pageListCookie ? pageListCookie === 
this.options.formatAllRows() ? pageListCookie : +pageListCookie : 
this.options.pageSize;
+        //searchText
+        this.options.searchText = searchTextCookie ? searchTextCookie : '';
+
+        if (columnsCookie) {
+            $.each(this.columns, function (i, column) {
+                column.visible = $.inArray(column.field, columnsCookie) !== -1;
+            });
+        }
+    };
+
+    BootstrapTable.prototype.onSort = function () {
+        _onSort.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.sortOrder, this.options.sortOrder);
+        setCookie(this, cookieIds.sortName, this.options.sortName);
+    };
+
+    BootstrapTable.prototype.onPageNumber = function () {
+        _onPageNumber.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
+    };
+
+    BootstrapTable.prototype.onPageListChange = function () {
+        _onPageListChange.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageList, this.options.pageSize);
+    };
+
+    BootstrapTable.prototype.onPageFirst = function () {
+        _onPageFirst.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
+    };
+
+    BootstrapTable.prototype.onPagePre = function () {
+        _onPagePre.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
+    };
+
+    BootstrapTable.prototype.onPageNext = function () {
+        _onPageNext.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
+    };
+
+    BootstrapTable.prototype.onPageLast = function () {
+        _onPageLast.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageNumber, this.options.pageNumber);
+    };
+
+    BootstrapTable.prototype.toggleColumn = function () {
+        _toggleColumn.apply(this, Array.prototype.slice.apply(arguments));
+
+        var visibleColumns = [];
+
+        $.each(this.columns, function (i, column) {
+            if (column.visible) {
+                visibleColumns.push(column.field);
+            }
+        });
+
+        setCookie(this, cookieIds.columns, JSON.stringify(visibleColumns));
+    };
+    
+    BootstrapTable.prototype.selectPage = function (page) {
+        _selectPage.apply(this, Array.prototype.slice.apply(arguments));
+        setCookie(this, cookieIds.pageNumber, page);
+    };
+
+    BootstrapTable.prototype.onSearch = function () {
+        var target = Array.prototype.slice.apply(arguments);
+        _onSearch.apply(this, target);
+
+        if ($(target[0].currentTarget).parent().hasClass('search')) {
+          setCookie(this, cookieIds.searchText, this.searchText);
+        }
+    };
+
+    BootstrapTable.prototype.deleteCookie = function (cookieName) {
+        if ((cookieName === '') || (!cookieEnabled())) {
+            return;
+        }
+
+        deleteCookie(this.options.cookieIdTable, cookieIds[cookieName], 
this.options.cookiePath, this.options.cookieDomain);
+    };
+})(jQuery);
diff --git 
a/vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.min.js 
b/vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.min.js
new file mode 100644
index 0000000..5a3beb7
--- /dev/null
+++ b/vendor/bootstrap-table/extensions/cookie/bootstrap-table-cookie.min.js
@@ -0,0 +1,7 @@
+/*
+* bootstrap-table - v1.10.1 - 2016-02-17
+* https://github.com/wenzhixin/bootstrap-table
+* Copyright (c) 2016 zhixin wen
+* Licensed MIT License
+*/
+!function(a){"use strict";var 
b={sortOrder:"bs.table.sortOrder",sortName:"bs.table.sortName",pageNumber:"bs.table.pageNumber",pageList:"bs.table.pageList",columns:"bs.table.columns",searchText:"bs.table.searchText",filterControl:"bs.table.filterControl"},c=function(a){var
 b=a.$header;return a.options.height&&(b=a.$tableHeader),b},d=function(a){var 
b="select, input";return a.options.height&&(b="table select, table 
input"),b},e=function(){return!!navigator.cookieEnabled},f=function(a,b){for(var
 
c=-1,d=0;d<b.length;d++)if(a.toLowerCase()===b[d].toLowerCase()){c=d;break}return
 c},g=function(a,b,c){return 
a.options.cookie&&e()&&""!==a.options.cookieIdTable&&-1!==f(b,a.options.cookiesEnabled)?(b=a.options.cookieIdTable+"."+b,!b||/^(?:expires|max\-age|path|domain|secure)$/i.test(b)?!1:(document.cookie=encodeURIComponent(b)+"="+encodeURIComponent(c)+k(a.options.cookieExpire)+(a.options.cookieDomain?";
 domain="+a.options.cookieDomain:"")+(a.options.cookiePath?"; 
path="+a.options.cookiePath:"")+(a.cookieSecure?"; secure":""),!0)):void 
0},h=function(a,b,c){return 
c?-1===f(c,a.options.cookiesEnabled)?null:(c=b+"."+c,decodeURIComponent(document.cookie.replace(new
 
RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(c).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null):null},i=function(a){return
 a?new 
RegExp("(?:^|;\\s*)"+encodeURIComponent(a).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=").test(document.cookie):!1},j=function(a,b,c,d){return
 b=a+"."+b,i(b)?(document.cookie=encodeURIComponent(b)+"=; expires=Thu, 01 Jan 
1970 00:00:00 GMT"+(d?"; domain="+d:"")+(c?"; 
path="+c:""),!0):!1},k=function(a){var 
b=a.replace(/[0-9]*/,"");switch(a=a.replace(/[A-Za-z]/,""),b.toLowerCase()){case"s":a=+a;break;case"mi":a=60*a;break;case"h":a=60*a*60;break;case"d":a=24*a*60*60;break;case"m":a=30*a*24*60*60;break;case"y":a=365*a*24*60*60;break;default:a=void
 0}return void 0===a?"":"; 
max-age="+a};a.extend(a.fn.bootstrapTable.defaults,{cookie:!1,cookieExpire:"2h",cookiePath:null,cookieDomain:null,cookieSecure:null,cookieIdTable:"",cookiesEnabled:["bs.table.sortOrder","bs.table.sortName","bs.table.pageNumber","bs.table.pageList","bs.table.columns","bs.table.searchText","bs.table.filterControl"],filterControls:[],filterControlValuesLoaded:!1}),a.fn.bootstrapTable.methods.push("deleteCookie");var
 
l=a.fn.bootstrapTable.Constructor,m=l.prototype.init,n=l.prototype.initTable,o=l.prototype.onSort,p=l.prototype.onPageNumber,q=l.prototype.onPageListChange,r=l.prototype.onPageFirst,s=l.prototype.onPagePre,t=l.prototype.onPageNext,u=l.prototype.onPageLast,v=l.prototype.toggleColumn,w=l.prototype.selectPage,x=l.prototype.onSearch;l.prototype.init=function(){if(this.options.filterControls=[],this.options.filterControlValuesLoaded=!1,this.options.cookiesEnabled="string"==typeof
 
this.options.cookiesEnabled?this.options.cookiesEnabled.replace("[","").replace("]","").replace(/
 
/g,"").toLowerCase().split(","):this.options.cookiesEnabled,this.options.filterControl){var
 e=this;this.$el.on("column-search.bs.table",function(a,c,d){for(var 
f=!0,h=0;h<e.options.filterControls.length;h++)if(e.options.filterControls[h].field===c){e.options.filterControls[h].text=d,f=!1;break}f&&e.options.filterControls.push({field:c,text:d}),g(e,b.filterControl,JSON.stringify(e.options.filterControls))}).on("post-body.bs.table",function(){setTimeout(function(){if(!e.options.filterControlValuesLoaded){e.options.filterControlValuesLoaded=!0;var
 f=JSON.parse(h(e,e.options.cookieIdTable,b.filterControl));if(f){var 
g=null,i=[],j=c(e),k=d(e);j.find(k).each(function(){g=a(this).closest("[data-field]").data("field"),i=a.grep(f,function(a){return
 
a.field===g}),i.length>0&&(a(this).val(i[0].text),e.onColumnSearch({currentTarget:a(this)}))})}}},250)})}m.apply(this,Array.prototype.slice.apply(arguments))},l.prototype.initTable=function(){n.apply(this,Array.prototype.slice.apply(arguments)),this.initCookie()},l.prototype.initCookie=function(){if(this.options.cookie){if(""===this.options.cookieIdTable||""===this.options.cookieExpire||!e())throw
 new Error("Configuration error. Please review the cookieIdTable, cookieExpire 
properties, if those properties are ok, then this browser does not support the 
cookies");var 
c=h(this,this.options.cookieIdTable,b.sortOrder),d=h(this,this.options.cookieIdTable,b.sortName),f=h(this,this.options.cookieIdTable,b.pageNumber),g=h(this,this.options.cookieIdTable,b.pageList),i=JSON.parse(h(this,this.options.cookieIdTable,b.columns)),j=h(this,this.options.cookieIdTable,b.searchText);this.options.sortOrder=c?c:this.options.sortOrder,this.options.sortName=d?d:this.options.sortName,this.options.pageNumber=f?+f:this.options.pageNumber,this.options.pageSize=g?g===this.options.formatAllRows()?g:+g:this.options.pageSize,this.options.searchText=j?j:"",i&&a.each(this.columns,function(b,c){c.visible=-1!==a.inArray(c.field,i)})}},l.prototype.onSort=function(){o.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.sortOrder,this.options.sortOrder),g(this,b.sortName,this.options.sortName)},l.prototype.onPageNumber=function(){p.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageNumber,this.options.pageNumber)},l.prototype.onPageListChange=function(){q.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageList,this.options.pageSize)},l.prototype.onPageFirst=function(){r.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageNumber,this.options.pageNumber)},l.prototype.onPagePre=function(){s.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageNumber,this.options.pageNumber)},l.prototype.onPageNext=function(){t.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageNumber,this.options.pageNumber)},l.prototype.onPageLast=function(){u.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageNumber,this.options.pageNumber)},l.prototype.toggleColumn=function(){v.apply(this,Array.prototype.slice.apply(arguments));var
 
c=[];a.each(this.columns,function(a,b){b.visible&&c.push(b.field)}),g(this,b.columns,JSON.stringify(c))},l.prototype.selectPage=function(a){w.apply(this,Array.prototype.slice.apply(arguments)),g(this,b.pageNumber,a)},l.prototype.onSearch=function(){var
 
c=Array.prototype.slice.apply(arguments);x.apply(this,c),a(c[0].currentTarget).parent().hasClass("search")&&g(this,b.searchText,this.searchText)},l.prototype.deleteCookie=function(a){""!==a&&e()&&j(this.options.cookieIdTable,b[a],this.options.cookiePath,this.options.cookieDomain)}}(jQuery);
\ No newline at end of file
diff --git 
a/vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.js 
b/vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.js
new file mode 100644
index 0000000..87ddad1
--- /dev/null
+++ b/vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.js
@@ -0,0 +1,80 @@
+/**
+ * @author: Dennis Hernández
+ * @webSite: http://djhvscf.github.io/Blog
+ * @version: v1.0.0
+ *
+ * @update zhixin wen <[email protected]>
+ */
+
+!function ($) {
+
+    'use strict';
+
+    $.extend($.fn.bootstrapTable.defaults, {
+        keyEvents: false
+    });
+
+    var BootstrapTable = $.fn.bootstrapTable.Constructor,
+        _init = BootstrapTable.prototype.init;
+
+    BootstrapTable.prototype.init = function () {
+        _init.apply(this, Array.prototype.slice.apply(arguments));
+        this.initKeyEvents();
+    };
+
+    BootstrapTable.prototype.initKeyEvents = function () {
+        if (this.options.keyEvents) {
+            var that = this;
+
+            $(document).off('keydown').on('keydown', function (e) {
+                var $search = that.$toolbar.find('.search input'),
+                    $refresh = that.$toolbar.find('button[name="refresh"]'),
+                    $toggle = that.$toolbar.find('button[name="toggle"]'),
+                    $paginationSwitch = 
that.$toolbar.find('button[name="paginationSwitch"]');
+
+                if (document.activeElement === $search.get(0) || 
!$.contains(document.activeElement ,that.$toolbar.get(0))) {
+                    return true;
+                }
+
+                switch (e.keyCode) {
+                    case 83: //s
+                        if (!that.options.search) {
+                            return;
+                        }
+                        $search.focus();
+                        return false;
+                    case 82: //r
+                        if (!that.options.showRefresh) {
+                            return;
+                        }
+                        $refresh.click();
+                        return false;
+                    case 84: //t
+                        if (!that.options.showToggle) {
+                            return;
+                        }
+                        $toggle.click();
+                        return false;
+                    case 80: //p
+                        if (!that.options.showPaginationSwitch) {
+                            return;
+                        }
+                        $paginationSwitch.click();
+                        return false;
+                    case 37: // left
+                        if (!that.options.pagination) {
+                            return;
+                        }
+                        that.prevPage();
+                        return false;
+                    case 39: // right
+                        if (!that.options.pagination) {
+                            return;
+                        }
+                        that.nextPage();
+                        return;
+                }
+            });
+        }
+    };
+}(jQuery);
diff --git 
a/vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.min.js
 
b/vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.min.js
new file mode 100644
index 0000000..49401d0
--- /dev/null
+++ 
b/vendor/bootstrap-table/extensions/key-events/bootstrap-table-key-events.min.js
@@ -0,0 +1,7 @@
+/*
+* bootstrap-table - v1.10.1 - 2016-02-17
+* https://github.com/wenzhixin/bootstrap-table
+* Copyright (c) 2016 zhixin wen
+* Licensed MIT License
+*/
+!function(a){"use 
strict";a.extend(a.fn.bootstrapTable.defaults,{keyEvents:!1});var 
b=a.fn.bootstrapTable.Constructor,c=b.prototype.init;b.prototype.init=function(){c.apply(this,Array.prototype.slice.apply(arguments)),this.initKeyEvents()},b.prototype.initKeyEvents=function(){if(this.options.keyEvents){var
 b=this;a(document).off("keydown").on("keydown",function(c){var 
d=b.$toolbar.find(".search 
input"),e=b.$toolbar.find('button[name="refresh"]'),f=b.$toolbar.find('button[name="toggle"]'),g=b.$toolbar.find('button[name="paginationSwitch"]');if(document.activeElement===d.get(0)||!a.contains(document.activeElement,b.$toolbar.get(0)))return!0;switch(c.keyCode){case
 83:if(!b.options.search)return;return d.focus(),!1;case 
82:if(!b.options.showRefresh)return;return e.click(),!1;case 
84:if(!b.options.showToggle)return;return f.click(),!1;case 
80:if(!b.options.showPaginationSwitch)return;return g.click(),!1;case 
37:if(!b.options.pagination)return;return b.prevPage(),!1;case 
39:if(!b.options.pagination)return;return void b.nextPage()}})}}}(jQuery);
\ No newline at end of file
diff --git a/wikibase/queryService/ui/resultBrowser/TableResultBrowser.js 
b/wikibase/queryService/ui/resultBrowser/TableResultBrowser.js
index bb072d7..4c4aba6 100644
--- a/wikibase/queryService/ui/resultBrowser/TableResultBrowser.js
+++ b/wikibase/queryService/ui/resultBrowser/TableResultBrowser.js
@@ -21,6 +21,10 @@
        function SELF() {
        }
 
+       var TABLE_PAGE_SIZE = 200;
+       var TABLE_PAGE_SIZE_LIST = [10, 50, 100, 200, 500, 1000];
+
+
        SELF.prototype = new 
wikibase.queryService.ui.resultBrowser.AbstractResultBrowser();
 
        /**
@@ -65,7 +69,8 @@
         * @param {jQuery} $element to draw at
         **/
        SELF.prototype.drawBootstrapTable = function ( $element ) {
-               var self = this;
+               var self = this,
+                       showPagination = (this.rows.length > TABLE_PAGE_SIZE);
 
                jQuery.fn.bootstrapTable.columnDefaults.formatter = function( 
data ){
                        if( !data ){
@@ -90,12 +95,21 @@
                                        title: column,
                                        field: column,
                                        events: events,
-                                       sortable: true
+                                       sortable: true,
                                };
                        } ),
                        data: this.rows,
                        mobileResponsive: true,
-                       pagination: true
+                       search: showPagination,
+                       pagination: showPagination,
+                       showPaginationSwitch: showPagination,
+                       pageSize: TABLE_PAGE_SIZE,
+                       pageList: TABLE_PAGE_SIZE_LIST,
+                       keyEvents: true,
+                       cookie: true,
+                       cookieIdTable: '1',
+                       cookieExpire: '1y',
+                       cookiesEnabled: ['bs.table.pageList']
                } );
 
        };

-- 
To view, visit https://gerrit.wikimedia.org/r/277221
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7417dd6ceac4092601f9dd4e6ed65cf079f5dfde
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/gui
Gerrit-Branch: master
Gerrit-Owner: Jonas Kress (WMDE) <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to