UNPKG

buefy

Version:

Lightweight UI components for Vue.js based on Bulma

578 lines (484 loc) 18.4 kB
/*! Buefy v0.8.2 | MIT License | github.com/buefy/buefy */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = global || self, factory(global.Pagination = {})); }(this, function (exports) { 'use strict'; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var config = { defaultContainerElement: null, defaultIconPack: 'mdi', defaultIconComponent: null, defaultDialogConfirmText: null, defaultDialogCancelText: null, defaultSnackbarDuration: 3500, defaultSnackbarPosition: null, defaultToastDuration: 2000, defaultToastPosition: null, defaultNotificationDuration: 2000, defaultNotificationPosition: null, defaultTooltipType: 'is-primary', defaultTooltipAnimated: false, defaultTooltipDelay: 0, defaultInputAutocomplete: 'on', defaultDateFormatter: null, defaultDateParser: null, defaultDateCreator: null, defaultDayNames: null, defaultMonthNames: null, defaultFirstDayOfWeek: null, defaultUnselectableDaysOfWeek: null, defaultTimeFormatter: null, defaultTimeParser: null, defaultModalCanCancel: ['escape', 'x', 'outside', 'button'], defaultModalScroll: null, defaultDatepickerMobileNative: true, defaultTimepickerMobileNative: true, defaultNoticeQueue: true, defaultInputHasCounter: true, defaultTaginputHasCounter: true, defaultUseHtml5Validation: true, defaultDropdownMobileModal: true, defaultFieldLabelPosition: null, defaultDatepickerYearsRange: [-100, 3], defaultDatepickerNearbyMonthDays: true, defaultDatepickerNearbySelectableMonthDays: false, defaultDatepickerShowWeekNumber: false }; var config$1 = config; // var script = { name: 'BIcon', props: { type: [String, Object], pack: String, icon: String, size: String, customSize: String, customClass: String, both: Boolean // This is used internally to show both MDI and FA icon }, computed: { /** * Internal icon name based on the pack. * If pack is 'fa', gets the equivalent FA icon name of the MDI, * internal icons are always MDI. */ newIcon: function newIcon() { return this.newPack === 'mdi' ? "".concat(this.newPack, "-").concat(this.icon) : this.addFAPrefix(this.getEquivalentIconOf(this.icon)); }, newPack: function newPack() { return this.pack || config$1.defaultIconPack; }, newType: function newType() { if (!this.type) return; var splitType = []; if (typeof this.type === 'string') { splitType = this.type.split('-'); } else { for (var key in this.type) { if (this.type[key]) { splitType = key.split('-'); break; } } } if (splitType.length <= 1) return; return "has-text-".concat(splitType[1]); }, newCustomSize: function newCustomSize() { return this.customSize || this.customSizeByPack; }, customSizeByPack: function customSizeByPack() { var defaultSize = this.newPack === 'mdi' ? 'mdi-24px' : this.addFAPrefix('lg'); var mediumSize = this.newPack === 'mdi' ? 'mdi-36px' : this.addFAPrefix('2x'); var largeSize = this.newPack === 'mdi' ? 'mdi-48px' : this.addFAPrefix('3x'); switch (this.size) { case 'is-small': return; case 'is-medium': return mediumSize; case 'is-large': return largeSize; default: return defaultSize; } }, useIconComponent: function useIconComponent() { return config$1.defaultIconComponent; } }, methods: { addFAPrefix: function addFAPrefix(value) { if (this.useIconComponent) { return value; } return "fa-".concat(value); }, /** * Equivalent FA icon name of the MDI. */ getEquivalentIconOf: function getEquivalentIconOf(value) { // Only transform the class if the both prop is set to true if (!this.both) { return value; } switch (value) { case 'check': return 'check'; case 'information': return 'info-circle'; case 'check-circle': return 'check-circle'; case 'alert': return 'exclamation-triangle'; case 'alert-circle': return 'exclamation-circle'; case 'arrow-up': return 'arrow-up'; case 'chevron-right': return 'angle-right'; case 'chevron-left': return 'angle-left'; case 'chevron-down': return 'angle-down'; case 'eye': return 'eye'; case 'eye-off': return 'eye-slash'; case 'menu-down': return 'caret-down'; case 'menu-up': return 'caret-up'; default: return value; } } } }; function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */ , shadowMode, createInjector, createInjectorSSR, createInjectorShadow) { if (typeof shadowMode !== 'boolean') { createInjectorSSR = createInjector; createInjector = shadowMode; shadowMode = false; } // Vue.extend constructor export interop. var options = typeof script === 'function' ? script.options : script; // render functions if (template && template.render) { options.render = template.render; options.staticRenderFns = template.staticRenderFns; options._compiled = true; // functional template if (isFunctionalTemplate) { options.functional = true; } } // scopedId if (scopeId) { options._scopeId = scopeId; } var hook; if (moduleIdentifier) { // server build hook = function hook(context) { // 2.3 injection context = context || // cached call this.$vnode && this.$vnode.ssrContext || // stateful this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext; // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__; } // inject component styles if (style) { style.call(this, createInjectorSSR(context)); } // register component module identifier for async chunk inference if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier); } }; // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook; } else if (style) { hook = shadowMode ? function () { style.call(this, createInjectorShadow(this.$root.$options.shadowRoot)); } : function (context) { style.call(this, createInjector(context)); }; } if (hook) { if (options.functional) { // register for functional component in vue file var originalRender = options.render; options.render = function renderWithStyleInjection(h, context) { hook.call(context); return originalRender(h, context); }; } else { // inject component registration as beforeCreate hook var existing = options.beforeCreate; options.beforeCreate = existing ? [].concat(existing, hook) : [hook]; } } return script; } var normalizeComponent_1 = normalizeComponent; /* script */ const __vue_script__ = script; /* template */ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:"icon",class:[_vm.newType, _vm.size]},[(!_vm.useIconComponent)?_c('i',{class:[_vm.newPack, _vm.newIcon, _vm.newCustomSize, _vm.customClass]}):_c(_vm.useIconComponent,{tag:"component",class:[_vm.customClass],attrs:{"icon":[_vm.newPack, _vm.newIcon],"size":_vm.newCustomSize}})],1)}; var __vue_staticRenderFns__ = []; /* style */ const __vue_inject_styles__ = undefined; /* scoped */ const __vue_scope_id__ = undefined; /* module identifier */ const __vue_module_identifier__ = undefined; /* functional template */ const __vue_is_functional_template__ = false; /* style inject */ /* style inject SSR */ var Icon = normalizeComponent_1( { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ }, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, undefined, undefined ); var script$1 = { name: 'BPagination', components: _defineProperty({}, Icon.name, Icon), props: { total: [Number, String], perPage: { type: [Number, String], default: 20 }, current: { type: [Number, String], default: 1 }, rangeBefore: { type: [Number, String], default: 1 }, rangeAfter: { type: [Number, String], default: 1 }, size: String, simple: Boolean, rounded: Boolean, order: String, iconPack: String, ariaNextLabel: String, ariaPreviousLabel: String, ariaPageLabel: String, ariaCurrentLabel: String }, computed: { rootClasses: function rootClasses() { return [this.order, this.size, { 'is-simple': this.simple, 'is-rounded': this.rounded }]; }, beforeCurrent: function beforeCurrent() { return parseInt(this.rangeBefore); }, afterCurrent: function afterCurrent() { return parseInt(this.rangeAfter); }, /** * Total page size (count). */ pageCount: function pageCount() { return Math.ceil(this.total / this.perPage); }, /** * First item of the page (count). */ firstItem: function firstItem() { var firstItem = this.current * this.perPage - this.perPage + 1; return firstItem >= 0 ? firstItem : 0; }, /** * Check if previous button is available. */ hasPrev: function hasPrev() { return this.current > 1; }, /** * Check if first page button should be visible. */ hasFirst: function hasFirst() { return this.current >= 2 + this.beforeCurrent; }, /** * Check if first ellipsis should be visible. */ hasFirstEllipsis: function hasFirstEllipsis() { return this.current >= this.beforeCurrent + 4; }, /** * Check if last page button should be visible. */ hasLast: function hasLast() { return this.current <= this.pageCount - (1 + this.afterCurrent); }, /** * Check if last ellipsis should be visible. */ hasLastEllipsis: function hasLastEllipsis() { return this.current < this.pageCount - (2 + this.afterCurrent); }, /** * Check if next button is available. */ hasNext: function hasNext() { return this.current < this.pageCount; }, /** * Get near pages, 1 before and 1 after the current. * Also add the click event to the array. */ pagesInRange: function pagesInRange() { var _this = this; if (this.simple) return; var left = Math.max(1, this.current - this.beforeCurrent); if (left - 1 === 2) { left--; // Do not show the ellipsis if there is only one to hide } var right = Math.min(this.current + this.afterCurrent, this.pageCount); if (this.pageCount - right === 2) { right++; // Do not show the ellipsis if there is only one to hide } var pages = []; var _loop = function _loop(i) { pages.push({ number: i, isCurrent: _this.current === i, click: function click(event) { if (_this.current === i) return; _this.$emit('change', i); _this.$emit('update:current', i); // Set focus on element to keep tab order _this.$nextTick(function () { return event.target.focus(); }); } }); }; for (var i = left; i <= right; i++) { _loop(i); } return pages; } }, watch: { /** * If current page is trying to be greater than page count, set to last. */ pageCount: function pageCount(value) { if (this.current > value) this.last(); } }, methods: { /** * Previous button click listener. */ prev: function prev() { if (!this.hasPrev) return; this.$emit('change', this.current - 1); this.$emit('update:current', this.current - 1); }, /** * First button click listener. */ first: function first() { this.$emit('change', 1); this.$emit('update:current', 1); }, /** * Last button click listener. */ last: function last() { this.$emit('change', this.pageCount); this.$emit('update:current', this.pageCount); }, /** * Next button click listener. */ next: function next() { if (!this.hasNext) return; this.$emit('change', this.current + 1); this.$emit('update:current', this.current + 1); }, /** * Get text for aria-label according to page number. */ getAriaPageLabel: function getAriaPageLabel(pageNumber, isCurrent) { if (this.ariaPageLabel && (!isCurrent || !this.ariaCurrentLabel)) { return this.ariaPageLabel + ' ' + pageNumber + '.'; } else if (this.ariaPageLabel && isCurrent && this.ariaCurrentLabel) { return this.ariaCurrentLabel + ', ' + this.ariaPageLabel + ' ' + pageNumber + '.'; } return null; } } }; /* script */ const __vue_script__$1 = script$1; /* template */ var __vue_render__$1 = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('nav',{staticClass:"pagination",class:_vm.rootClasses},[_c('a',{staticClass:"pagination-previous",attrs:{"role":"button","href":"#","disabled":!_vm.hasPrev,"aria-label":_vm.ariaPreviousLabel},on:{"click":function($event){$event.preventDefault();_vm.prev($event);}}},[_c('b-icon',{attrs:{"icon":"chevron-left","pack":_vm.iconPack,"both":"","aria-hidden":"true"}})],1),_vm._v(" "),_c('a',{staticClass:"pagination-next",attrs:{"role":"button","href":"#","disabled":!_vm.hasNext,"aria-label":_vm.ariaNextLabel},on:{"click":function($event){$event.preventDefault();_vm.next($event);}}},[_c('b-icon',{attrs:{"icon":"chevron-right","pack":_vm.iconPack,"both":"","aria-hidden":"true"}})],1),_vm._v(" "),(!_vm.simple)?_c('ul',{staticClass:"pagination-list"},[(_vm.hasFirst)?_c('li',[_c('a',{staticClass:"pagination-link",attrs:{"role":"button","href":"#","aria-label":_vm.getAriaPageLabel(1, false)},on:{"click":function($event){$event.preventDefault();_vm.first($event);}}},[_vm._v("\n 1\n ")])]):_vm._e(),_vm._v(" "),(_vm.hasFirstEllipsis)?_c('li',[_c('span',{staticClass:"pagination-ellipsis"},[_vm._v("…")])]):_vm._e(),_vm._v(" "),_vm._l((_vm.pagesInRange),function(page){return _c('li',{key:page.number},[_c('a',{staticClass:"pagination-link",class:{ 'is-current': page.isCurrent },attrs:{"role":"button","href":"#","aria-label":_vm.getAriaPageLabel(page.number, page.isCurrent),"aria-current":page.isCurrent},on:{"click":function($event){$event.preventDefault();page.click($event);}}},[_vm._v("\n "+_vm._s(page.number)+"\n ")])])}),_vm._v(" "),(_vm.hasLastEllipsis)?_c('li',[_c('span',{staticClass:"pagination-ellipsis"},[_vm._v("…")])]):_vm._e(),_vm._v(" "),(_vm.hasLast)?_c('li',[_c('a',{staticClass:"pagination-link",attrs:{"role":"button","href":"#","aria-label":_vm.getAriaPageLabel(_vm.pageCount, false)},on:{"click":function($event){$event.preventDefault();_vm.last($event);}}},[_vm._v("\n "+_vm._s(_vm.pageCount)+"\n ")])]):_vm._e()],2):_vm._e(),_vm._v(" "),(_vm.simple)?_c('small',{staticClass:"info"},[(_vm.perPage == 1)?[_vm._v("\n "+_vm._s(_vm.firstItem)+" / "+_vm._s(_vm.total)+"\n ")]:[_vm._v("\n "+_vm._s(_vm.firstItem)+"-"+_vm._s(Math.min(_vm.current * _vm.perPage, _vm.total))+" / "+_vm._s(_vm.total)+"\n ")]],2):_vm._e()])}; var __vue_staticRenderFns__$1 = []; /* style */ const __vue_inject_styles__$1 = undefined; /* scoped */ const __vue_scope_id__$1 = undefined; /* module identifier */ const __vue_module_identifier__$1 = undefined; /* functional template */ const __vue_is_functional_template__$1 = false; /* style inject */ /* style inject SSR */ var Pagination = normalizeComponent_1( { render: __vue_render__$1, staticRenderFns: __vue_staticRenderFns__$1 }, __vue_inject_styles__$1, __vue_script__$1, __vue_scope_id__$1, __vue_is_functional_template__$1, __vue_module_identifier__$1, undefined, undefined ); var use = function use(plugin) { if (typeof window !== 'undefined' && window.Vue) { window.Vue.use(plugin); } }; var registerComponent = function registerComponent(Vue, component) { Vue.component(component.name, component); }; var Plugin = { install: function install(Vue) { registerComponent(Vue, Pagination); } }; use(Plugin); exports.Pagination = Pagination; exports.default = Plugin; Object.defineProperty(exports, '__esModule', { value: true }); }));