diff --git a/dist/vue-paginate.js b/dist/vue-paginate.js index 49e5952..0605b81 100644 --- a/dist/vue-paginate.js +++ b/dist/vue-paginate.js @@ -253,7 +253,7 @@ exports.default = { var vm = this.vm; this.listName = this.expression; - var perPage = +this.arg; + var perPage = this.getPerPage(); var limit = +this.params.limit; if (!vm[this.listName]) { @@ -271,6 +271,13 @@ exports.default = { vm['refresh' + _utils2.default.capitalize(_this.listName) + 'Page'](); }); + if (this.isPerPageDynamic()) { + vm.$watch(this.arg, function (newVal) { + _this.list.perPage = +newVal <= 0 ? 1 : +newVal; + vm['refresh' + _utils2.default.capitalize(_this.listName) + 'Page'](); + }); + } + this.list = { currentPage: 0, initial: 0, perPage: perPage }; // Set links array. @@ -307,7 +314,7 @@ exports.default = { }; vm['refresh' + _utils2.default.capitalize(this.listName) + 'Page'] = function () { - vm['change' + _utils2.default.capitalize(_this.listName) + 'Page'](0); + vm['change' + _utils2.default.capitalize(_this.listName) + 'Page'](1); }; // Turn on warnings back @@ -344,6 +351,34 @@ exports.default = { var links = new _LimitedLinksGenerator2.default(this.vm, this.list, this.listName).generate(limit); this.vm.$set('limited' + _utils2.default.capitalize(this.listName) + 'Links', links); + }, + getPerPage: function getPerPage() { + var vm = this.vm; + var arg = this.arg; + var regex = new RegExp(arg, 'i'); + + if (!this.isPerPageDynamic()) { + return +arg; + } + + if (isDynamicPerPageValid()) { + this.arg = getDynamicArg(); + return +vm[this.arg]; + } + + return 1; + + function getDynamicArg() { + return Object.keys(vm.$data).find(function (a) { + return a.match(regex); + }); + } + function isDynamicPerPageValid() { + return +vm[getDynamicArg()] > 0; + } + }, + isPerPageDynamic: function isPerPageDynamic() { + return !Number.isInteger(Number.parseInt(this.arg)); } }; diff --git a/dist/vue-paginate.min.js b/dist/vue-paginate.min.js index 82163b5..0ee83fa 100644 --- a/dist/vue-paginate.min.js +++ b/dist/vue-paginate.min.js @@ -1 +1 @@ -!function t(i,e,s){function a(l,r){if(!e[l]){if(!i[l]){var u="function"==typeof require&&require;if(!r&&u)return u(l,!0);if(n)return n(l,!0);var h=new Error("Cannot find module '"+l+"'");throw h.code="MODULE_NOT_FOUND",h}var f=e[l]={exports:{}};i[l][0].call(f.exports,function(t){var e=i[l][1][t];return a(e?e:t)},f,f.exports,t,i,e,s)}return e[l].exports}for(var n="function"==typeof require&&require,l=0;lthis.list.numberOfPages?this.list.numberOfPages:this.limit,i=i.concat(u["default"].generateLinksArray(this.list.initial+2,this.list.numberOfPages,this.limit-1)),this.shouldShowElipses()&&i.push(o),i.push(this.list.numberOfPages),this.notLastNavSet()&&i.push(h),[].concat(a(new Set(i)))}},{key:"shouldShowLeftArrow",value:function(){return this.list.numberOfPages>this.limit+1&&this.list.initial>=this.limit}},{key:"rightArrowOrElipsesIsClicked",value:function(){return this.list.currentPage===o||this.list.currentPage===h}},{key:"showNextNavSet",value:function(){return this.list.numberOfPages-this.list.initial>this.limit+1?(this.list.initial+=this.limit,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.initial+1)):(this.list.currentPage=this.list.numberOfPages,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.currentPage))}},{key:"leftArrowIsClicked",value:function(){return this.list.currentPage===f}},{key:"showPreviousNavSet",value:function(){return this.list.initial>this.limit-1?(this.list.initial-=this.limit,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.initial+this.limit)):(this.list.currentPage=this.list.initial,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.currentPage+1))}},{key:"lastPageIsClicked",value:function(){return this.list.currentPage==this.list.numberOfPages-1}},{key:"showLastNavSet",value:function(){this.list.numberOfPages-this.list.initial>this.limit+1&&(this.list.initial=this.initialOfLastNav(this.limit),this.list.currentPage=this.list.initial+this.limit,this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.currentPage+1))}},{key:"shouldShowElipses",value:function(){return this.list.numberOfPages-this.list.initial>this.limit+1}},{key:"initialOfLastNav",value:function(){var t=~~(this.list.numberOfPages/this.limit),i=this.list.numberOfPages-this.limit*t;return i=1>=i?i+this.limit:i,this.list.numberOfPages-i}},{key:"notLastNavSet",value:function(){return this.list.initial1),i["change"+l["default"].capitalize(this.listName)+"Page"]=function(e){i[t.listName]=t.originalList,t.list.currentPage="number"==typeof e?e-1:e,t.setLimitedPages(s)},i["next"+l["default"].capitalize(this.listName)+"Page"]=function(){i[t.listName]=t.originalList,t.list.currentPage=t.list.currentPage+10?t.list.currentPage-1:0},i["refresh"+l["default"].capitalize(this.listName)+"Page"]=function(){i["change"+l["default"].capitalize(t.listName)+"Page"](0)},a.Vue.config.silent=!1},update:function(t){this.setNumberOfPages(t.length),this.list.currentPage=this.list.currentPage>=this.list.numberOfPages?this.list.numberOfPages-1:this.list.currentPage,this.setCurrentPage();var i=this.list.currentPage*this.list.perPage;this.set(t.slice(i,i+this.list.perPage))},setNumberOfPages:function(t){var i=t;this.list.numberOfPages=Math.ceil(i/this.list.perPage);var e=l["default"].generateLinksArray(1,this.list.numberOfPages);this.vm.$set(this.listName+"Links",e)},setCurrentPage:function(){a.Vue.config.silent=!0,this.vm.$set("current"+l["default"].capitalize(this.listName)+"Page",this.list.currentPage+1),this.vm.$set("has"+l["default"].capitalize(this.listName)+"Links",this.list.numberOfPages>1),a.Vue.config.silent=!1},setLimitedPages:function(t){var i=new u["default"](this.vm,this.list,this.listName).generate(t);this.vm.$set("limited"+l["default"].capitalize(this.listName)+"Links",i)}}},{"./LimitedLinksGenerator":1,"./index":2,"./utils":4}],4:[function(t,i,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},generateLinksArray:function(t,i){for(var e=arguments.length<=2||void 0===arguments[2]?0:arguments[2],s=[],a=t;i>=a&&(s.push(a),!(e&&s.length>=e));a++);return s}}},{}]},{},[2]); \ No newline at end of file +!function t(i,e,s){function a(r,l){if(!e[r]){if(!i[r]){var u="function"==typeof require&&require;if(!l&&u)return u(r,!0);if(n)return n(r,!0);var h=new Error("Cannot find module '"+r+"'");throw h.code="MODULE_NOT_FOUND",h}var f=e[r]={exports:{}};i[r][0].call(f.exports,function(t){var e=i[r][1][t];return a(e?e:t)},f,f.exports,t,i,e,s)}return e[r].exports}for(var n="function"==typeof require&&require,r=0;rthis.list.numberOfPages?this.list.numberOfPages:this.limit,i=i.concat(u["default"].generateLinksArray(this.list.initial+2,this.list.numberOfPages,this.limit-1)),this.shouldShowElipses()&&i.push(c),i.push(this.list.numberOfPages),this.notLastNavSet()&&i.push(h),[].concat(a(new Set(i)))}},{key:"shouldShowLeftArrow",value:function(){return this.list.numberOfPages>this.limit+1&&this.list.initial>=this.limit}},{key:"rightArrowOrElipsesIsClicked",value:function(){return this.list.currentPage===c||this.list.currentPage===h}},{key:"showNextNavSet",value:function(){return this.list.numberOfPages-this.list.initial>this.limit+1?(this.list.initial+=this.limit,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.initial+1)):(this.list.currentPage=this.list.numberOfPages,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.currentPage))}},{key:"leftArrowIsClicked",value:function(){return this.list.currentPage===f}},{key:"showPreviousNavSet",value:function(){return this.list.initial>this.limit-1?(this.list.initial-=this.limit,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.initial+this.limit)):(this.list.currentPage=this.list.initial,void this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.currentPage+1))}},{key:"lastPageIsClicked",value:function(){return this.list.currentPage==this.list.numberOfPages-1}},{key:"showLastNavSet",value:function(){this.list.numberOfPages-this.list.initial>this.limit+1&&(this.list.initial=this.initialOfLastNav(this.limit),this.list.currentPage=this.list.initial+this.limit,this.vm["change"+u["default"].capitalize(this.listName)+"Page"](this.list.currentPage+1))}},{key:"shouldShowElipses",value:function(){return this.list.numberOfPages-this.list.initial>this.limit+1}},{key:"initialOfLastNav",value:function(){var t=~~(this.list.numberOfPages/this.limit),i=this.list.numberOfPages-this.limit*t;return i=1>=i?i+this.limit:i,this.list.numberOfPages-i}},{key:"notLastNavSet",value:function(){return this.list.initial=+e?1:+e,i["refresh"+r["default"].capitalize(t.listName)+"Page"]()}),this.list={currentPage:0,initial:0,perPage:e},this.setNumberOfPages(this.originalList.length),this.setLimitedPages(s),i.$set("has"+r["default"].capitalize(this.listName)+"Links",this.list.numberOfPages>1),i["change"+r["default"].capitalize(this.listName)+"Page"]=function(e){i[t.listName]=t.originalList,t.list.currentPage="number"==typeof e?e-1:e,t.setLimitedPages(s)},i["next"+r["default"].capitalize(this.listName)+"Page"]=function(){i[t.listName]=t.originalList,t.list.currentPage=t.list.currentPage+10?t.list.currentPage-1:0},i["refresh"+r["default"].capitalize(this.listName)+"Page"]=function(){i["change"+r["default"].capitalize(t.listName)+"Page"](1)},a.Vue.config.silent=!1},update:function(t){this.setNumberOfPages(t.length),this.list.currentPage=this.list.currentPage>=this.list.numberOfPages?this.list.numberOfPages-1:this.list.currentPage,this.setCurrentPage();var i=this.list.currentPage*this.list.perPage;this.set(t.slice(i,i+this.list.perPage))},setNumberOfPages:function(t){var i=t;this.list.numberOfPages=Math.ceil(i/this.list.perPage);var e=r["default"].generateLinksArray(1,this.list.numberOfPages);this.vm.$set(this.listName+"Links",e)},setCurrentPage:function(){a.Vue.config.silent=!0,this.vm.$set("current"+r["default"].capitalize(this.listName)+"Page",this.list.currentPage+1),this.vm.$set("has"+r["default"].capitalize(this.listName)+"Links",this.list.numberOfPages>1),a.Vue.config.silent=!1},setLimitedPages:function(t){var i=new u["default"](this.vm,this.list,this.listName).generate(t);this.vm.$set("limited"+r["default"].capitalize(this.listName)+"Links",i)},getPerPage:function(){function t(){return Object.keys(e.$data).find(function(t){return t.match(a)})}function i(){return+e[t()]>0}var e=this.vm,s=this.arg,a=new RegExp(s,"i");return this.isPerPageDynamic()?i()?(this.arg=t(),+e[this.arg]):1:+s},isPerPageDynamic:function(){return!Number.isInteger(Number.parseInt(this.arg))}}},{"./LimitedLinksGenerator":1,"./index":2,"./utils":4}],4:[function(t,i,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e["default"]={capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},generateLinksArray:function(t,i){for(var e=arguments.length<=2||void 0===arguments[2]?0:arguments[2],s=[],a=t;i>=a&&(s.push(a),!(e&&s.length>=e));a++);return s}}},{}]},{},[2]); \ No newline at end of file diff --git a/package.json b/package.json index ade8332..14fe30d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vue-paginate", - "version": "2.0.0", + "version": "2.1.0", "description": "A simple vue.js plugin to paginate data", "main": "src/index.js", "scripts": { diff --git a/src/paginate.js b/src/paginate.js index de0164f..1933ca0 100644 --- a/src/paginate.js +++ b/src/paginate.js @@ -28,7 +28,7 @@ export default { var vm = this.vm; this.listName = this.expression; - var perPage = +this.arg; + var perPage = this.getPerPage(); var limit = +this.params.limit; if (!vm[this.listName]) { @@ -46,6 +46,13 @@ export default { vm['refresh' + utils.capitalize(this.listName) + 'Page'](); }); + if (this.isPerPageDynamic()) { + vm.$watch(this.arg, (newVal) => { + this.list.perPage = +newVal <= 0 ? 1 : +newVal; + vm['refresh' + utils.capitalize(this.listName) + 'Page'](); + }); + } + this.list = { currentPage: 0, initial: 0, perPage }; // Set links array. @@ -86,7 +93,7 @@ export default { }; vm['refresh' + utils.capitalize(this.listName) + 'Page'] = () => { - vm['change' + utils.capitalize(this.listName) + 'Page'](0); + vm['change' + utils.capitalize(this.listName) + 'Page'](1); }; // Turn on warnings back @@ -134,5 +141,30 @@ export default { ).generate(limit); this.vm.$set('limited' + utils.capitalize(this.listName) + 'Links', links); + }, + + getPerPage () { + let vm = this.vm; + let arg = this.arg; + let regex = new RegExp(arg, 'i') + + if (! this.isPerPageDynamic()) { + return +arg + } + + if (isDynamicPerPageValid()) { + this.arg = getDynamicArg(); + return +vm[this.arg]; + } + + return 1; + + function getDynamicArg() { return Object.keys(vm.$data).find(a => a.match(regex)) } + function isDynamicPerPageValid () { return +vm[getDynamicArg()] > 0; } + }, + + isPerPageDynamic () { + return ! Number.isInteger(Number.parseInt(this.arg)); } + } diff --git a/test/functional/test.js b/test/functional/test.js index 3094a72..4d5d8d9 100644 --- a/test/functional/test.js +++ b/test/functional/test.js @@ -134,6 +134,33 @@ describe('Vue-Paginate', () => { vm.$data.limitedLangsLinks.should.eql([1, 2, 3, 4, 5, 6, 7]); }); }); + + describe('Dynamic perPage', () => { + it('supports dynamic perPage', () => { + vm = new Vue({ + template: '
Hello
', + data: { + langs: ['PHP', 'JS', 'Ruby', 'Python'], + perPage: 2 + } + }).$mount(); + + vm.$data.langs.should.have.length(2); + }); + + it('guards agains non-positive perPage', () => { + vm = new Vue({ + template: '
Hello
', + data: { + langs: ['PHP', 'JS', 'Ruby', 'Python'], + perPage: -3 + } + }).$mount(); + + vm.$data.langs.should.have.length(1); + }); + + }); }); var triggerUpdate = () => vm._directives[0].update(vm.$data.fullLangs);