@arco-design/web-vue
Version:
Arco Design Vue 2.0: A Vue.js 3 UI Library
298 lines (297 loc) • 8.92 kB
JavaScript
;
var vue = require("vue");
var globalConfig = require("../_utils/global-config.js");
var pageItem = require("./page-item.js");
var pageItemStep = require("./page-item-step.js");
var pageItemEllipsis = require("./page-item-ellipsis.js");
var pageJumper = require("./page-jumper.js");
var pageOptions = require("./page-options.js");
var index = require("../locale/index.js");
var is = require("../_utils/is.js");
var useSize = require("../_hooks/use-size.js");
var _Pagination = vue.defineComponent({
name: "Pagination",
props: {
total: {
type: Number,
required: true
},
current: Number,
defaultCurrent: {
type: Number,
default: 1
},
pageSize: Number,
defaultPageSize: {
type: Number,
default: 10
},
disabled: {
type: Boolean,
default: false
},
hideOnSinglePage: {
type: Boolean,
default: false
},
simple: {
type: Boolean,
default: false
},
showTotal: {
type: Boolean,
default: false
},
showMore: {
type: Boolean,
default: false
},
showJumper: {
type: Boolean,
default: false
},
showPageSize: {
type: Boolean,
default: false
},
pageSizeOptions: {
type: Array,
default: () => [10, 20, 30, 40, 50]
},
pageSizeProps: {
type: Object
},
size: {
type: String
},
pageItemStyle: {
type: Object
},
activePageItemStyle: {
type: Object
},
baseSize: {
type: Number,
default: 6
},
bufferSize: {
type: Number,
default: 2
},
autoAdjust: {
type: Boolean,
default: true
}
},
emits: {
"update:current": (current) => true,
"update:pageSize": (pageSize) => true,
"change": (current) => true,
"pageSizeChange": (pageSize) => true
},
setup(props, {
emit,
slots
}) {
const prefixCls = globalConfig.getPrefixCls("pagination");
const {
t
} = index.useI18n();
const {
disabled,
pageItemStyle,
activePageItemStyle,
size
} = vue.toRefs(props);
const {
mergedSize
} = useSize.useSize(size);
const _current = vue.ref(props.defaultCurrent);
const _pageSize = vue.ref(props.defaultPageSize);
const computedCurrent = vue.computed(() => {
var _a;
return (_a = props.current) != null ? _a : _current.value;
});
const computedPageSize = vue.computed(() => {
var _a;
return (_a = props.pageSize) != null ? _a : _pageSize.value;
});
const pages = vue.computed(() => Math.ceil(props.total / computedPageSize.value));
const handleClick = (page) => {
if (page !== computedCurrent.value && is.isNumber(page) && !props.disabled) {
_current.value = page;
emit("update:current", page);
emit("change", page);
}
};
const handlePageSizeChange = (pageSize) => {
_pageSize.value = pageSize;
emit("update:pageSize", pageSize);
emit("pageSizeChange", pageSize);
};
const pagerProps = vue.reactive({
current: computedCurrent,
pages,
disabled,
style: pageItemStyle,
activeStyle: activePageItemStyle,
onClick: handleClick
});
const getPageItemElement = (type, props2 = {}) => {
if (type === "more") {
return vue.createVNode(pageItemEllipsis, vue.mergeProps(props2, pagerProps), {
default: slots["page-item-ellipsis"]
});
}
if (type === "previous") {
return vue.createVNode(pageItemStep, vue.mergeProps({
"type": "previous"
}, props2, pagerProps), {
default: slots["page-item-step"]
});
}
if (type === "next") {
return vue.createVNode(pageItemStep, vue.mergeProps({
"type": "next"
}, props2, pagerProps), {
default: slots["page-item-step"]
});
}
return vue.createVNode(pageItem, vue.mergeProps(props2, pagerProps), {
default: slots["page-item"]
});
};
const pageList = vue.computed(() => {
const pageList2 = [];
if (pages.value < props.baseSize + props.bufferSize * 2) {
for (let i = 1; i <= pages.value; i++) {
pageList2.push(getPageItemElement("page", {
key: i,
pageNumber: i
}));
}
} else {
let left = 1;
let right = pages.value;
let hasLeftEllipsis = false;
let hasRightEllipsis = false;
if (computedCurrent.value > 2 + props.bufferSize) {
hasLeftEllipsis = true;
left = Math.min(computedCurrent.value - props.bufferSize, pages.value - 2 * props.bufferSize);
}
if (computedCurrent.value < pages.value - (props.bufferSize + 1)) {
hasRightEllipsis = true;
right = Math.max(computedCurrent.value + props.bufferSize, 2 * props.bufferSize + 1);
}
if (hasLeftEllipsis) {
pageList2.push(getPageItemElement("page", {
key: 1,
pageNumber: 1
}));
pageList2.push(getPageItemElement("more", {
key: "left-ellipsis-pager",
step: -(props.bufferSize * 2 + 1)
}));
}
for (let i = left; i <= right; i++) {
pageList2.push(getPageItemElement("page", {
key: i,
pageNumber: i
}));
}
if (hasRightEllipsis) {
pageList2.push(getPageItemElement("more", {
key: "right-ellipsis-pager",
step: props.bufferSize * 2 + 1
}));
pageList2.push(getPageItemElement("page", {
key: pages.value,
pageNumber: pages.value
}));
}
}
return pageList2;
});
const renderPager = () => {
if (props.simple) {
return vue.createVNode("span", {
"class": `${prefixCls}-simple`
}, [getPageItemElement("previous", {
simple: true
}), vue.createVNode(pageJumper, {
"disabled": props.disabled,
"current": computedCurrent.value,
"size": mergedSize.value,
"pages": pages.value,
"simple": true,
"onChange": handleClick
}, null), getPageItemElement("next", {
simple: true
})]);
}
return vue.createVNode("ul", {
"class": `${prefixCls}-list`
}, [getPageItemElement("previous", {
simple: true
}), pageList.value, props.showMore && getPageItemElement("more", {
key: "more",
step: props.bufferSize * 2 + 1
}), getPageItemElement("next", {
simple: true
})]);
};
vue.watch(computedPageSize, (curPageSize, prePageSize) => {
if (props.autoAdjust && curPageSize !== prePageSize && computedCurrent.value > 1) {
const index2 = prePageSize * (computedCurrent.value - 1) + 1;
const newPage = Math.ceil(index2 / curPageSize);
if (newPage !== computedCurrent.value) {
_current.value = newPage;
emit("update:current", newPage);
emit("change", newPage);
}
}
});
vue.watch(pages, (curPages, prePages) => {
if (props.autoAdjust && curPages !== prePages && computedCurrent.value > 1 && computedCurrent.value > curPages) {
const newCurrent = Math.max(curPages, 1);
_current.value = newCurrent;
emit("update:current", newCurrent);
emit("change", newCurrent);
}
});
const cls = vue.computed(() => [prefixCls, `${prefixCls}-size-${mergedSize.value}`, {
[`${prefixCls}-simple`]: props.simple,
[`${prefixCls}-disabled`]: props.disabled
}]);
return () => {
var _a, _b;
if (props.hideOnSinglePage && pages.value <= 1) {
return null;
}
return vue.createVNode("div", {
"class": cls.value
}, [props.showTotal && vue.createVNode("span", {
"class": `${prefixCls}-total`
}, [(_b = (_a = slots.total) == null ? void 0 : _a.call(slots, {
total: props.total
})) != null ? _b : t("pagination.total", props.total)]), renderPager(), props.showPageSize && vue.createVNode(pageOptions, {
"disabled": props.disabled,
"sizeOptions": props.pageSizeOptions,
"pageSize": computedPageSize.value,
"size": mergedSize.value,
"onChange": handlePageSizeChange,
"selectProps": props.pageSizeProps
}, null), !props.simple && props.showJumper && vue.createVNode(pageJumper, {
"disabled": props.disabled,
"current": computedCurrent.value,
"pages": pages.value,
"size": mergedSize.value,
"onChange": handleClick
}, {
"jumper-prepend": slots["jumper-prepend"],
"jumper-append": slots["jumper-append"]
})]);
};
}
});
module.exports = _Pagination;