UNPKG

element-plus

Version:

A Component Library for Vue 3

391 lines (386 loc) 12.6 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var iconsVue = require('@element-plus/icons-vue'); var constants = require('./constants.js'); var prev_vue_vue_type_script_setup_true_lang = require('./components/prev.vue2.js'); var next_vue_vue_type_script_setup_true_lang = require('./components/next.vue2.js'); var sizes_vue_vue_type_script_setup_true_lang = require('./components/sizes.vue2.js'); var jumper_vue_vue_type_script_setup_true_lang = require('./components/jumper.vue2.js'); var total_vue_vue_type_script_setup_true_lang = require('./components/total.vue2.js'); var pager_vue_vue_type_script_setup_true_lang = require('./components/pager.vue2.js'); var index = require('../../../hooks/use-size/index.js'); var runtime = require('../../../utils/vue/props/runtime.js'); var icon = require('../../../utils/vue/icon.js'); var typescript = require('../../../utils/typescript.js'); var types = require('../../../utils/types.js'); var index$1 = require('../../../hooks/use-locale/index.js'); var index$2 = require('../../../hooks/use-namespace/index.js'); var index$3 = require('../../../hooks/use-deprecated/index.js'); var event = require('../../../constants/event.js'); var error = require('../../../utils/error.js'); const isAbsent = (v) => typeof v !== "number"; const paginationProps = runtime.buildProps({ /** * @description options of item count per page */ pageSize: Number, /** * @description default initial value of page size, not setting is the same as setting 10 */ defaultPageSize: Number, /** * @description total item count */ total: Number, /** * @description total page count. Set either `total` or `page-count` and pages will be displayed; if you need `page-sizes`, `total` is required */ pageCount: Number, /** * @description number of pagers. Pagination collapses when the total page count exceeds this value */ pagerCount: { type: Number, validator: (value) => { return types.isNumber(value) && Math.trunc(value) === value && value > 4 && value < 22 && value % 2 === 1; }, default: 7 }, /** * @description current page number */ currentPage: Number, /** * @description default initial value of current-page, not setting is the same as setting 1 */ defaultCurrentPage: Number, /** * @description layout of Pagination, elements separated with a comma */ layout: { type: String, default: ["prev", "pager", "next", "jumper", "->", "total"].join(", ") }, /** * @description item count of each page */ pageSizes: { type: runtime.definePropType(Array), default: () => typescript.mutable([10, 20, 30, 40, 50, 100]) }, /** * @description custom class name for the page size Select's dropdown */ popperClass: { type: String, default: "" }, /** * @description custom style for the page size Select's dropdown */ popperStyle: { type: runtime.definePropType([String, Object]) }, /** * @description text for the prev button */ prevText: { type: String, default: "" }, /** * @description icon for the prev button, higher priority of `prev-text` */ prevIcon: { type: icon.iconPropType, default: () => iconsVue.ArrowLeft }, /** * @description text for the next button */ nextText: { type: String, default: "" }, /** * @description icon for the next button, higher priority of `next-text` */ nextIcon: { type: icon.iconPropType, default: () => iconsVue.ArrowRight }, /** * @description whether Pagination size is teleported to body */ teleported: { type: Boolean, default: true }, /** * @description whether to use small pagination */ small: Boolean, /** * @description set page size */ size: index.useSizeProp, /** * @description whether the buttons have a background color */ background: Boolean, /** * @description whether Pagination is disabled */ disabled: Boolean, /** * @description whether to hide when there's only one page */ hideOnSinglePage: Boolean, /** * @description which element the size dropdown appends to. */ appendSizeTo: String }); const paginationEmits = { "update:current-page": (val) => types.isNumber(val), "update:page-size": (val) => types.isNumber(val), "size-change": (val) => types.isNumber(val), change: (currentPage, pageSize) => types.isNumber(currentPage) && types.isNumber(pageSize), "current-change": (val) => types.isNumber(val), "prev-click": (val) => types.isNumber(val), "next-click": (val) => types.isNumber(val) }; const componentName = "ElPagination"; var Pagination = vue.defineComponent({ name: componentName, props: paginationProps, emits: paginationEmits, setup(props, { emit, slots }) { const { t } = index$1.useLocale(); const ns = index$2.useNamespace("pagination"); const vnodeProps = vue.getCurrentInstance().vnode.props || {}; const _globalSize = index.useGlobalSize(); const _size = vue.computed( () => { var _a; return props.small ? "small" : (_a = props.size) != null ? _a : _globalSize.value; } ); index$3.useDeprecated( { from: "small", replacement: "size", version: "3.0.0", scope: "el-pagination", ref: "https://element-plus.org/zh-CN/component/pagination.html" }, vue.computed(() => !!props.small) ); const hasCurrentPageListener = "onUpdate:currentPage" in vnodeProps || "onUpdate:current-page" in vnodeProps || "onCurrentChange" in vnodeProps; const hasPageSizeListener = "onUpdate:pageSize" in vnodeProps || "onUpdate:page-size" in vnodeProps || "onSizeChange" in vnodeProps; const assertValidUsage = vue.computed(() => { if (isAbsent(props.total) && isAbsent(props.pageCount)) return false; if (!isAbsent(props.currentPage) && !hasCurrentPageListener) return false; if (props.layout.includes("sizes")) { if (!isAbsent(props.pageCount)) { if (!hasPageSizeListener) return false; } else if (!isAbsent(props.total)) { if (!isAbsent(props.pageSize)) { if (!hasPageSizeListener) { return false; } } } } return true; }); const innerPageSize = vue.ref( isAbsent(props.defaultPageSize) ? 10 : props.defaultPageSize ); const innerCurrentPage = vue.ref( isAbsent(props.defaultCurrentPage) ? 1 : props.defaultCurrentPage ); const pageSizeBridge = vue.computed({ get() { return isAbsent(props.pageSize) ? innerPageSize.value : props.pageSize; }, set(v) { if (isAbsent(props.pageSize)) { innerPageSize.value = v; } if (hasPageSizeListener) { emit("update:page-size", v); emit("size-change", v); } } }); const pageCountBridge = vue.computed(() => { let pageCount = 0; if (!isAbsent(props.pageCount)) { pageCount = props.pageCount; } else if (!isAbsent(props.total)) { pageCount = Math.max(1, Math.ceil(props.total / pageSizeBridge.value)); } return pageCount; }); const currentPageBridge = vue.computed({ get() { return isAbsent(props.currentPage) ? innerCurrentPage.value : props.currentPage; }, set(v) { let newCurrentPage = v; if (v < 1) { newCurrentPage = 1; } else if (v > pageCountBridge.value) { newCurrentPage = pageCountBridge.value; } if (isAbsent(props.currentPage)) { innerCurrentPage.value = newCurrentPage; } if (hasCurrentPageListener) { emit("update:current-page", newCurrentPage); emit("current-change", newCurrentPage); } } }); vue.watch(pageCountBridge, (val) => { if (currentPageBridge.value > val) currentPageBridge.value = val; }); vue.watch( [currentPageBridge, pageSizeBridge], (value) => { emit(event.CHANGE_EVENT, ...value); }, { flush: "post" } ); function handleCurrentChange(val) { currentPageBridge.value = val; } function handleSizeChange(val) { pageSizeBridge.value = val; const newPageCount = pageCountBridge.value; if (currentPageBridge.value > newPageCount) { currentPageBridge.value = newPageCount; } } function prev() { if (props.disabled) return; currentPageBridge.value -= 1; emit("prev-click", currentPageBridge.value); } function next() { if (props.disabled) return; currentPageBridge.value += 1; emit("next-click", currentPageBridge.value); } function addClass(element, cls) { if (element) { if (!element.props) { element.props = {}; } element.props.class = [element.props.class, cls].join(" "); } } vue.provide(constants.elPaginationKey, { pageCount: pageCountBridge, disabled: vue.computed(() => props.disabled), currentPage: currentPageBridge, changeEvent: handleCurrentChange, handleSizeChange }); return () => { var _a, _b; if (!assertValidUsage.value) { error.debugWarn(componentName, t("el.pagination.deprecationWarning")); return null; } if (!props.layout) return null; if (props.hideOnSinglePage && pageCountBridge.value <= 1) return null; const rootChildren = []; const rightWrapperChildren = []; const rightWrapperRoot = vue.h( "div", { class: ns.e("rightwrapper") }, rightWrapperChildren ); const TEMPLATE_MAP = { prev: vue.h(prev_vue_vue_type_script_setup_true_lang.default, { disabled: props.disabled, currentPage: currentPageBridge.value, prevText: props.prevText, prevIcon: props.prevIcon, onClick: prev }), jumper: vue.h(jumper_vue_vue_type_script_setup_true_lang.default, { size: _size.value }), pager: vue.h(pager_vue_vue_type_script_setup_true_lang.default, { currentPage: currentPageBridge.value, pageCount: pageCountBridge.value, pagerCount: props.pagerCount, onChange: handleCurrentChange, disabled: props.disabled }), next: vue.h(next_vue_vue_type_script_setup_true_lang.default, { disabled: props.disabled, currentPage: currentPageBridge.value, pageCount: pageCountBridge.value, nextText: props.nextText, nextIcon: props.nextIcon, onClick: next }), sizes: vue.h(sizes_vue_vue_type_script_setup_true_lang.default, { pageSize: pageSizeBridge.value, pageSizes: props.pageSizes, popperClass: props.popperClass, popperStyle: props.popperStyle, disabled: props.disabled, teleported: props.teleported, size: _size.value, appendSizeTo: props.appendSizeTo }), slot: (_b = (_a = slots == null ? void 0 : slots.default) == null ? void 0 : _a.call(slots)) != null ? _b : null, total: vue.h(total_vue_vue_type_script_setup_true_lang.default, { total: isAbsent(props.total) ? 0 : props.total }) }; const components = props.layout.split(",").map((item) => item.trim()); let haveRightWrapper = false; components.forEach((c) => { if (c === "->") { haveRightWrapper = true; return; } if (!haveRightWrapper) { rootChildren.push(TEMPLATE_MAP[c]); } else { rightWrapperChildren.push(TEMPLATE_MAP[c]); } }); addClass(rootChildren[0], ns.is("first")); addClass(rootChildren[rootChildren.length - 1], ns.is("last")); if (haveRightWrapper && rightWrapperChildren.length > 0) { addClass(rightWrapperChildren[0], ns.is("first")); addClass( rightWrapperChildren[rightWrapperChildren.length - 1], ns.is("last") ); rootChildren.push(rightWrapperRoot); } return vue.h( "div", { class: [ ns.b(), ns.is("background", props.background), ns.m(_size.value) ] }, rootChildren ); }; } }); exports.default = Pagination; exports.paginationEmits = paginationEmits; exports.paginationProps = paginationProps; //# sourceMappingURL=pagination.js.map