UNPKG

vue-easytable

Version:
305 lines (270 loc) 9.05 kB
import Pager from "./pager.jsx"; import VeSelect from "vue-easytable/packages/ve-select"; import VeIcon from "vue-easytable/packages/ve-icon"; import { COMPS_NAME, EMIT_EVENTS, LOCALE_COMP_NAME } from "./util/constant"; import { clsName } from "./util"; import { createLocale } from "../../src/utils/index"; import { ICON_NAMES } from "../../src/utils/constant"; const t = createLocale(LOCALE_COMP_NAME); export default { name: COMPS_NAME.VE_PAGINATION, components: { Total: { render() { return ( <span class={clsName("total")}> {t("total", this.$parent.total)} </span> ); }, }, Prev: { render() { return ( <li on-click={this.$parent.prevPage} class={[ this.$parent.newPageIndex === 1 ? clsName("disabled") : "", clsName("li"), clsName("prev"), ]} > <a> <VeIcon name={ICON_NAMES.LEFT_ARROW} /> </a> </li> ); }, }, Pager, Next: { render() { return ( <li on-click={this.$parent.nextPage} class={[ this.$parent.newPageIndex === this.$parent.pageCount ? clsName("disabled") : "", clsName("li"), clsName("next"), ]} > <a> <VeIcon name={ICON_NAMES.RIGHT_ARROW} /> </a> </li> ); }, }, Sizer: { render() { return ( <VeSelect class={clsName("select")} value={this.$parent.newPageSizeOption} popperAppendTo={this.$parent.popperAppendTo} on-input={this.handleChange} //v-model={this.$parent.newPageSizeOption} /> ); }, methods: { handleChange(items) { if (Array.isArray(items) && items.length > 0) { let item = items.find((x) => x.selected); if (item) { this.$parent.pageSizeChangeHandler(item.value); } } }, }, }, Jumper: { methods: { jumperEnter(event) { if (event.keyCode !== 13) return; var val = this.$parent.getValidNum(event.target.value); // bug fixed #483 event.target.value = val; this.$parent.jumpPageHandler(val); }, }, render() { return ( <span class={clsName("goto")}> &nbsp;{t("goto")}&nbsp; <input class={clsName("goto-input")} domProps-value={this.$parent.newPageIndex} on-keyup={this.jumperEnter} type="input" /> &nbsp;{t("page")}&nbsp; </span> ); }, }, }, props: { layout: { type: Array, default() { return ["total", "prev", "pager", "next", "sizer", "jumper"]; }, }, // 总条数 total: { type: Number, required: true, }, // 当前页 pageIndex: { type: Number, default: 1, }, // 最多显示几个数字按钮 pagingCount: { type: Number, default: 5, }, // 每页大小 pageSize: { type: Number, default: 10, }, // 每页大小下拉配置 pageSizeOption: { type: Array, default: function () { return [10, 20, 30]; }, }, // popper append to element popperAppendTo: { type: [String, HTMLElement], default: function () { return document.body; }, }, }, data() { return { newPageIndex: this.pageIndex && this.pageIndex > 0 ? parseInt(this.pageIndex) : 1, newPageSize: this.pageSize, }; }, computed: { pageCount() { return Math.ceil(this.total / this.newPageSize); }, newPageSizeOption() { return this.pageSizeOption.map((x) => { var temp = {}; temp.value = x; temp.label = x + t("itemsPerPage"); if (this.newPageSize == x) { temp.selected = true; } return temp; }); }, }, watch: { pageIndex: function (newVal) { this.newPageIndex = newVal; }, pageSize: function (newVal) { this.newPageSize = newVal; }, }, methods: { getValidNum(value) { let result = 1; value = parseInt(value, 10); if (isNaN(value) || value < 1) { result = 1; } else { if (value < 1) { result = 1; } else if (value > this.pageCount) { result = this.pageCount; } else { result = value; } } return result; }, jumpPageHandler(newPageIndex) { this.newPageIndex = newPageIndex; this.$emit(EMIT_EVENTS.PAGE_NUMBER_CHANGE, this.newPageIndex); }, // 上一页 prevPage() { if (this.newPageIndex > 1) { this.newPageIndex = this.newPageIndex - 1; this.$emit(EMIT_EVENTS.PAGE_NUMBER_CHANGE, this.newPageIndex); } }, // 下一页 nextPage() { if (this.newPageIndex < this.pageCount) { this.newPageIndex = this.newPageIndex + 1; this.$emit(EMIT_EVENTS.PAGE_NUMBER_CHANGE, this.newPageIndex); } }, // 改变页面大小 pageSizeChangeHandler() { let item = this.newPageSizeOption.find((x) => x.selected); if (item) { this.newPageSize = item.value; this.newPageIndex = 1; this.$emit(EMIT_EVENTS.PAGE_SIZE_CHANGE, this.newPageSize); } }, // 回到初始页码 goBackPageIndex() { this.newPageIndex = this.pageIndex && this.pageIndex > 0 ? parseInt(this.pageIndex) : 1; }, // 还原每页大小 goBackPageSize() { if (this.pageSize > 0) { this.newPageSize = this.pageSize; } }, }, render() { let template = <ul class="ve-pagination"></ul>; var comps = { //'total','prev','pager','next','sizer','jumper' total: <total></total>, prev: <prev></prev>, pager: ( <pager pageCount={this.pageCount} pageIndex={this.newPageIndex} pagingCount={this.pagingCount} onJumpPageHandler={this.jumpPageHandler} ></pager> ), next: <next></next>, sizer: <sizer></sizer>, jumper: <jumper onJumpPageHandler={this.jumpPageHandler}></jumper>, }; // https://github.com/ElemeFE/element/issues/10033 // https://github.com/ElemeFE/element/issues/9587 template.children = template.children || []; this.layout.forEach((item) => { template.children.push(comps[item]); }); return template; }, };