vue-easytable
Version:
305 lines (270 loc) • 9.05 kB
JSX
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")}>
{t("goto")}
<input
class={clsName("goto-input")}
domProps-value={this.$parent.newPageIndex}
on-keyup={this.jumperEnter}
type="input"
/>
{t("page")}
</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;
},
};