UNPKG

buefy

Version:

Lightweight UI components for Vue.js (v3) based on Bulma

548 lines (540 loc) 16 kB
'use strict'; var vue = require('vue'); var config = require('./config-DR826Ki2.js'); var _pluginVue_exportHelper = require('./_plugin-vue_export-helper-Die8u8yB.js'); var Icon = require('./Icon-lsDKE2wQ.js'); var _sfc_main$1 = vue.defineComponent({ name: "BPaginationButton", props: { page: { type: Object, required: true }, tag: { type: [String, Object], default: "a", validator: (value) => { return typeof value === "object" || config.config.defaultLinkTags.indexOf(value) >= 0; } }, disabled: { type: Boolean, default: false } }, computed: { href() { if (this.tag === "a") { return "#"; } else { return void 0; } }, isDisabled() { return this.disabled || this.page.disabled; }, disabledOrUndefined() { return this.isDisabled || void 0; } } }); function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) { return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.tag), vue.mergeProps({ role: "button", href: _ctx.href, disabled: _ctx.disabledOrUndefined, class: ["pagination-link", { "is-current": _ctx.page.isCurrent, [_ctx.page.class]: true }] }, _ctx.$attrs, { onClick: vue.withModifiers(_ctx.page.click, ["prevent"]), "aria-label": _ctx.page["aria-label"], "aria-current": _ctx.page.isCurrent || void 0 }), { default: vue.withCtx(() => [ vue.renderSlot(_ctx.$slots, "default", {}, () => [ vue.createTextVNode( vue.toDisplayString(_ctx.page.number), 1 /* TEXT */ ) ]) ]), _: 3 /* FORWARDED */ }, 16, ["href", "disabled", "class", "onClick", "aria-label", "aria-current"]); } var PaginationButton = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main$1, [["render", _sfc_render$1]]); function debounce(func, wait, immediate) { let timeout; return function(...args) { const context = this; const later = function() { timeout = void 0; func.apply(context, args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } var _sfc_main = vue.defineComponent({ name: "BPagination", components: { BIcon: Icon.BIcon, BPaginationButton: PaginationButton }, props: { total: [Number, String], perPage: { type: [Number, String], default: 20 }, modelValue: { 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, iconPrev: { type: String, default: () => { return config.config.defaultIconPrev; } }, iconNext: { type: String, default: () => { return config.config.defaultIconNext; } }, ariaNextLabel: String, ariaPreviousLabel: String, ariaPageLabel: String, ariaCurrentLabel: String, pageInput: { type: Boolean, default: false }, pageInputPosition: String, debouncePageInput: [Number, String] }, data() { return { inputValue: this.modelValue, debounceHandlePageInput: void 0 }; }, emits: { /* eslint-disable @typescript-eslint/no-unused-vars */ change: (_num) => true, "update:modelValue": (_num) => true /* eslint-enable @typescript-eslint/no-unused-vars */ }, computed: { rootClasses() { return [ this.order, this.size, this.pageInputPosition, { "is-simple": this.simple, "is-rounded": this.rounded, "has-input": this.pageInput } ]; }, beforeCurrent() { return parseInt(this.rangeBefore + ""); }, afterCurrent() { return parseInt(this.rangeAfter + ""); }, /* * Total page size (count). */ pageCount() { return Math.ceil(+this.total / +this.perPage); }, /* * First item of the page (count). */ firstItem() { const firstItem = +this.modelValue * +this.perPage - +this.perPage + 1; return firstItem >= 0 ? firstItem : 0; }, /* * Check if previous button is available. */ hasPrev() { return +this.modelValue > 1; }, /* * Check if first page button should be visible. */ hasFirst() { return +this.modelValue >= 2 + this.beforeCurrent; }, /* * Check if first ellipsis should be visible. */ hasFirstEllipsis() { return +this.modelValue >= this.beforeCurrent + 4; }, /* * Check if last page button should be visible. */ hasLast() { return +this.modelValue <= this.pageCount - (1 + this.afterCurrent); }, /* * Check if last ellipsis should be visible. */ hasLastEllipsis() { return +this.modelValue < this.pageCount - (2 + this.afterCurrent); }, /* * Check if next button is available. */ hasNext() { return +this.modelValue < this.pageCount; }, /* * Get near pages, 1 before and 1 after the current. * Also add the click event to the array. */ pagesInRange() { if (this.simple) return; let left = Math.max(1, +this.modelValue - this.beforeCurrent); if (left - 1 === 2) { left--; } let right = Math.min(+this.modelValue + this.afterCurrent, this.pageCount); if (this.pageCount - right === 2) { right++; } const pages = []; for (let i = left; i <= right; i++) { pages.push(this.getPage(i)); } return pages; } }, watch: { /* * If current page is trying to be greater than page count, set to last. */ pageCount(value) { if (this.modelValue > value) this.last(); }, modelValue(value) { this.inputValue = value; }, debouncePageInput: { handler(value) { this.debounceHandlePageInput = debounce( this.handleOnInputPageChange, value ); }, immediate: true } }, methods: { /* * Previous button click listener. */ prev(event) { this.changePage(+this.modelValue - 1, event); }, /* * Next button click listener. */ next(event) { this.changePage(+this.modelValue + 1, event); }, /* * First button click listener. */ first(event) { this.changePage(1, event); }, /* * Last button click listener. */ last(event) { this.changePage(this.pageCount, event); }, changePage(num, event) { if (this.modelValue === num || num < 1 || num > this.pageCount) return; this.$emit("update:modelValue", num); this.$emit("change", num); if (event && event.target) { this.$nextTick(() => event.target.focus()); } }, getPage(num, options = {}) { return { number: num, isCurrent: this.modelValue === num, click: (event) => this.changePage(num, event), input: (event, inputNum) => this.changePage(+inputNum, event), disabled: options.disabled || false, class: options.class || "", "aria-label": options["aria-label"] || this.getAriaPageLabel(num, this.modelValue === num) }; }, /* * Get text for aria-label according to page number. */ 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; }, handleOnInputPageChange(event) { this.getPage(+this.inputValue).input(event, this.inputValue); }, handleOnInputDebounce(event) { if (this.debouncePageInput) { this.debounceHandlePageInput(event); } else { this.handleOnInputPageChange(event); } }, handleOnKeyPress(event) { const ASCIICode = event.which || event.keyCode; if (ASCIICode >= 48 && ASCIICode <= 57) { return true; } else { return event.preventDefault(); } }, handleAllowableInputPageRange(event) { const target = event.target; if (+target.value > 0 && +target.value <= this.pageCount) { this.handleOnInputValue(event); } else { this.inputValue = 1; this.inputValue = ""; } }, handleOnInputValue(event) { const inputValue = +event.target.value; this.inputValue = inputValue; if (Number.isInteger(this.inputValue)) { this.handleOnInputDebounce(event); } else { this.inputValue = this.modelValue; } } } }); const _hoisted_1 = { class: "control pagination-input" }; const _hoisted_2 = ["value", "size", "maxlength"]; const _hoisted_3 = { key: 4, class: "info" }; const _hoisted_4 = { key: 5, class: "pagination-list" }; const _hoisted_5 = { key: 0 }; const _hoisted_6 = { key: 1 }; const _hoisted_7 = /* @__PURE__ */ vue.createElementVNode( "span", { class: "pagination-ellipsis" }, "…", -1 /* HOISTED */ ); const _hoisted_8 = [ _hoisted_7 ]; const _hoisted_9 = { key: 2 }; const _hoisted_10 = /* @__PURE__ */ vue.createElementVNode( "span", { class: "pagination-ellipsis" }, "…", -1 /* HOISTED */ ); const _hoisted_11 = [ _hoisted_10 ]; const _hoisted_12 = { key: 3 }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_b_icon = vue.resolveComponent("b-icon"); const _component_BPaginationButton = vue.resolveComponent("BPaginationButton"); return vue.openBlock(), vue.createElementBlock( "nav", { class: vue.normalizeClass(["pagination", _ctx.rootClasses]) }, [ _ctx.$slots.previous ? vue.renderSlot(_ctx.$slots, "previous", { key: 0, page: _ctx.getPage(+_ctx.modelValue - 1, { disabled: !_ctx.hasPrev, class: "pagination-previous", "aria-label": _ctx.ariaPreviousLabel }) }, () => [ vue.createVNode(_component_b_icon, { icon: _ctx.iconPrev, pack: _ctx.iconPack, both: "", "aria-hidden": "true" }, null, 8, ["icon", "pack"]) ]) : (vue.openBlock(), vue.createBlock(_component_BPaginationButton, { key: 1, class: "pagination-previous", disabled: !_ctx.hasPrev, page: _ctx.getPage(+_ctx.modelValue - 1), "aria-label": _ctx.ariaPreviousLabel }, { default: vue.withCtx(() => [ vue.createVNode(_component_b_icon, { icon: _ctx.iconPrev, pack: _ctx.iconPack, both: "", "aria-hidden": "true" }, null, 8, ["icon", "pack"]) ]), _: 1 /* STABLE */ }, 8, ["disabled", "page", "aria-label"])), _ctx.$slots.next ? vue.renderSlot(_ctx.$slots, "next", { key: 2, page: _ctx.getPage(+_ctx.modelValue + 1, { disabled: !_ctx.hasNext, class: "pagination-next", "aria-label": _ctx.ariaNextLabel }) }, () => [ vue.createVNode(_component_b_icon, { icon: _ctx.iconNext, pack: _ctx.iconPack, both: "", "aria-hidden": "true" }, null, 8, ["icon", "pack"]) ]) : (vue.openBlock(), vue.createBlock(_component_BPaginationButton, { key: 3, class: "pagination-next", disabled: !_ctx.hasNext, page: _ctx.getPage(+_ctx.modelValue + 1), "aria-label": _ctx.ariaNextLabel }, { default: vue.withCtx(() => [ vue.createVNode(_component_b_icon, { icon: _ctx.iconNext, pack: _ctx.iconPack, both: "", "aria-hidden": "true" }, null, 8, ["icon", "pack"]) ]), _: 1 /* STABLE */ }, 8, ["disabled", "page", "aria-label"])), vue.createElementVNode("div", _hoisted_1, [ _ctx.pageInput ? (vue.openBlock(), vue.createElementBlock("input", { key: 0, class: "input", value: _ctx.inputValue, onInput: _cache[0] || (_cache[0] = (...args) => _ctx.handleAllowableInputPageRange && _ctx.handleAllowableInputPageRange(...args)), onKeypress: _cache[1] || (_cache[1] = (...args) => _ctx.handleOnKeyPress && _ctx.handleOnKeyPress(...args)), size: _ctx.pageCount.toString().length, maxlength: _ctx.pageCount.toString().length }, null, 40, _hoisted_2)) : vue.createCommentVNode("v-if", true) ]), _ctx.simple ? (vue.openBlock(), vue.createElementBlock("small", _hoisted_3, [ _ctx.perPage == 1 ? (vue.openBlock(), vue.createElementBlock( vue.Fragment, { key: 0 }, [ vue.createTextVNode( vue.toDisplayString(_ctx.firstItem) + " / " + vue.toDisplayString(_ctx.total), 1 /* TEXT */ ) ], 64 /* STABLE_FRAGMENT */ )) : (vue.openBlock(), vue.createElementBlock( vue.Fragment, { key: 1 }, [ vue.createTextVNode( vue.toDisplayString(_ctx.firstItem) + "-" + vue.toDisplayString(Math.min(+_ctx.modelValue * +_ctx.perPage, +_ctx.total)) + " / " + vue.toDisplayString(_ctx.total), 1 /* TEXT */ ) ], 64 /* STABLE_FRAGMENT */ )) ])) : (vue.openBlock(), vue.createElementBlock("ul", _hoisted_4, [ vue.createCommentVNode("First"), _ctx.hasFirst ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_5, [ _ctx.$slots.default ? vue.renderSlot(_ctx.$slots, "default", { key: 0, page: _ctx.getPage(1) }) : (vue.openBlock(), vue.createBlock(_component_BPaginationButton, { key: 1, page: _ctx.getPage(1) }, null, 8, ["page"])) ])) : vue.createCommentVNode("v-if", true), _ctx.hasFirstEllipsis ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_6, [..._hoisted_8])) : vue.createCommentVNode("v-if", true), vue.createCommentVNode("Pages"), (vue.openBlock(true), vue.createElementBlock( vue.Fragment, null, vue.renderList(_ctx.pagesInRange, (page) => { return vue.openBlock(), vue.createElementBlock("li", { key: page.number }, [ _ctx.$slots.default ? vue.renderSlot(_ctx.$slots, "default", { key: 0, page }) : (vue.openBlock(), vue.createBlock(_component_BPaginationButton, { key: 1, page }, null, 8, ["page"])) ]); }), 128 /* KEYED_FRAGMENT */ )), vue.createCommentVNode("Last"), _ctx.hasLastEllipsis ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_9, [..._hoisted_11])) : vue.createCommentVNode("v-if", true), _ctx.hasLast ? (vue.openBlock(), vue.createElementBlock("li", _hoisted_12, [ _ctx.$slots.default ? vue.renderSlot(_ctx.$slots, "default", { key: 0, page: _ctx.getPage(_ctx.pageCount) }) : (vue.openBlock(), vue.createBlock(_component_BPaginationButton, { key: 1, page: _ctx.getPage(_ctx.pageCount) }, null, 8, ["page"])) ])) : vue.createCommentVNode("v-if", true) ])) ], 2 /* CLASS */ ); } var BPagination = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main, [["render", _sfc_render]]); exports.BPagination = BPagination; exports.PaginationButton = PaginationButton; exports.debounce = debounce;