UNPKG

vxe-table-demonic

Version:

一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...

607 lines (606 loc) 19.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _xeUtils = _interopRequireDefault(require("xe-utils")); var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf")); var _event = require("../../tools/event"); var _size = require("../../hooks/size"); var _log = require("../../tools/log"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var __assign = void 0 && (void 0).__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var _default = (0, _vue.defineComponent)({ name: 'VxePager', props: { size: { type: String, default: function () { return _conf.default.pager.size || _conf.default.size; } }, // 自定义布局 layouts: { type: Array, default: function () { return _conf.default.pager.layouts || ['PrevJump', 'PrevPage', 'Jump', 'PageCount', 'NextPage', 'NextJump', 'Sizes', 'Total']; } }, // 当前页 currentPage: { type: Number, default: 1 }, // 加载中 loading: Boolean, // 每页大小 pageSize: { type: Number, default: function () { return _conf.default.pager.pageSize || 10; } }, // 总条数 total: { type: Number, default: 0 }, // 显示页码按钮的数量 pagerCount: { type: Number, default: function () { return _conf.default.pager.pagerCount || 7; } }, // 每页大小选项列表 pageSizes: { type: Array, default: function () { return _conf.default.pager.pageSizes || [10, 15, 20, 50, 100]; } }, // 列对其方式 align: { type: String, default: function () { return _conf.default.pager.align; } }, // 带边框 border: { type: Boolean, default: function () { return _conf.default.pager.border; } }, // 带背景颜色 background: { type: Boolean, default: function () { return _conf.default.pager.background; } }, // 配套的样式 perfect: { type: Boolean, default: function () { return _conf.default.pager.perfect; } }, // 当只有一页时隐藏 autoHidden: { type: Boolean, default: function () { return _conf.default.pager.autoHidden; } }, transfer: { type: Boolean, default: function () { return _conf.default.pager.transfer; } }, className: [String, Function], // 自定义图标 iconPrevPage: String, iconJumpPrev: String, iconJumpNext: String, iconNextPage: String, iconJumpMore: String, iconHomePage: String, iconEndPage: String }, emits: ['update:pageSize', 'update:currentPage', 'page-change'], setup: function (props, context) { var slots = context.slots, emit = context.emit; var xID = _xeUtils.default.uniqueId(); var computeSize = (0, _size.useSize)(props); var $xegrid = (0, _vue.inject)('$xegrid', null); var reactData = (0, _vue.reactive)({ inpCurrPage: props.currentPage }); var refElem = (0, _vue.ref)(); var refMaps = { refElem: refElem }; var $xepager = { xID: xID, props: props, context: context, getRefMaps: function () { return refMaps; } }; var pagerMethods = {}; var pagerPrivateMethods = {}; var getPageCount = function (total, size) { return Math.max(Math.ceil(total / size), 1); }; var computePageCount = (0, _vue.computed)(function () { return getPageCount(props.total, props.pageSize); }); var jumpPageEvent = function (evnt, currentPage) { emit('update:currentPage', currentPage); if (evnt && currentPage !== props.currentPage) { pagerMethods.dispatchEvent('page-change', { type: 'current', pageSize: props.pageSize, currentPage: currentPage }, evnt); } }; var changeCurrentPage = function (currentPage, evnt) { emit('update:currentPage', currentPage); if (evnt && currentPage !== props.currentPage) { pagerMethods.dispatchEvent('page-change', { type: 'current', pageSize: props.pageSize, currentPage: currentPage }, evnt); } }; var triggerJumpEvent = function (evnt) { var inputElem = evnt.target; var inpValue = _xeUtils.default.toInteger(inputElem.value); var pageCount = computePageCount.value; var current = inpValue <= 0 ? 1 : inpValue >= pageCount ? pageCount : inpValue; var currPage = _xeUtils.default.toValueString(current); inputElem.value = currPage; reactData.inpCurrPage = currPage; changeCurrentPage(current, evnt); }; var computeNumList = (0, _vue.computed)(function () { var pagerCount = props.pagerCount; var pageCount = computePageCount.value; var len = pageCount > pagerCount ? pagerCount - 2 : pagerCount; var rest = []; for (var index = 0; index < len; index++) { rest.push(index); } return rest; }); var computeOffsetNumber = (0, _vue.computed)(function () { return Math.floor((props.pagerCount - 2) / 2); }); var computeSizeList = (0, _vue.computed)(function () { return props.pageSizes.map(function (item) { if (_xeUtils.default.isNumber(item)) { return { value: item, label: "".concat(_conf.default.i18n('vxe.pager.pagesize', [item])) }; } return __assign({ value: '', label: '' }, item); }); }); var handleHomePage = function (evnt) { var currentPage = props.currentPage; if (currentPage > 1) { changeCurrentPage(1, evnt); } }; var handleEndPage = function (evnt) { var currentPage = props.currentPage; var pageCount = computePageCount.value; if (currentPage < pageCount) { changeCurrentPage(pageCount, evnt); } }; var handlePrevPage = function (evnt) { var currentPage = props.currentPage; var pageCount = computePageCount.value; if (currentPage > 1) { changeCurrentPage(Math.min(pageCount, Math.max(currentPage - 1, 1)), evnt); } }; var handleNextPage = function (evnt) { var currentPage = props.currentPage; var pageCount = computePageCount.value; if (currentPage < pageCount) { changeCurrentPage(Math.min(pageCount, currentPage + 1), evnt); } }; var handlePrevJump = function (evnt) { var numList = computeNumList.value; changeCurrentPage(Math.max(props.currentPage - numList.length, 1), evnt); }; var handleNextJump = function (evnt) { var pageCount = computePageCount.value; var numList = computeNumList.value; changeCurrentPage(Math.min(props.currentPage + numList.length, pageCount), evnt); }; var pageSizeEvent = function (params) { var value = params.value; var pageSize = _xeUtils.default.toNumber(value); var pageCount = getPageCount(props.total, pageSize); var currentPage = props.currentPage; if (currentPage > pageCount) { currentPage = pageCount; emit('update:currentPage', pageCount); } emit('update:pageSize', pageSize); pagerMethods.dispatchEvent('page-change', { type: 'size', pageSize: pageSize, currentPage: currentPage }); }; var jumpInputEvent = function (evnt) { var inputElem = evnt.target; reactData.inpCurrPage = inputElem.value; }; var jumpKeydownEvent = function (evnt) { if ((0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.ENTER)) { triggerJumpEvent(evnt); } else if ((0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.ARROW_UP)) { evnt.preventDefault(); handleNextPage(evnt); } else if ((0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.ARROW_DOWN)) { evnt.preventDefault(); handlePrevPage(evnt); } }; // 第一页 var renderHomePage = function () { return (0, _vue.h)('button', { class: ['vxe-pager--prev-btn', { 'is--disabled': props.currentPage <= 1 }], type: 'button', title: _conf.default.i18n('vxe.pager.homePageTitle'), onClick: handleHomePage }, [(0, _vue.h)('i', { class: ['vxe-pager--btn-icon', props.iconHomePage || _conf.default.icon.PAGER_HOME] })]); }; // 上一页 var renderPrevPage = function () { return (0, _vue.h)('button', { class: ['vxe-pager--prev-btn', { 'is--disabled': props.currentPage <= 1 }], type: 'button', title: _conf.default.i18n('vxe.pager.prevPageTitle'), onClick: handlePrevPage }, [(0, _vue.h)('i', { class: ['vxe-pager--btn-icon', props.iconPrevPage || _conf.default.icon.PAGER_PREV_PAGE] })]); }; // 向上翻页 var renderPrevJump = function (tagName) { return (0, _vue.h)(tagName || 'button', { class: ['vxe-pager--jump-prev', { 'is--fixed': !tagName, 'is--disabled': props.currentPage <= 1 }], type: 'button', title: _conf.default.i18n('vxe.pager.prevJumpTitle'), onClick: handlePrevJump }, [tagName ? (0, _vue.h)('i', { class: ['vxe-pager--jump-more-icon', props.iconJumpMore || _conf.default.icon.PAGER_JUMP_MORE] }) : null, (0, _vue.h)('i', { class: ['vxe-pager--jump-icon', props.iconJumpPrev || _conf.default.icon.PAGER_JUMP_PREV] })]); }; // 向下翻页 var renderNextJump = function (tagName) { var pageCount = computePageCount.value; return (0, _vue.h)(tagName || 'button', { class: ['vxe-pager--jump-next', { 'is--fixed': !tagName, 'is--disabled': props.currentPage >= pageCount }], type: 'button', title: _conf.default.i18n('vxe.pager.nextJumpTitle'), onClick: handleNextJump }, [tagName ? (0, _vue.h)('i', { class: ['vxe-pager--jump-more-icon', props.iconJumpMore || _conf.default.icon.PAGER_JUMP_MORE] }) : null, (0, _vue.h)('i', { class: ['vxe-pager--jump-icon', props.iconJumpNext || _conf.default.icon.PAGER_JUMP_NEXT] })]); }; // 下一页 var renderNextPage = function () { var pageCount = computePageCount.value; return (0, _vue.h)('button', { class: ['vxe-pager--next-btn', { 'is--disabled': props.currentPage >= pageCount }], type: 'button', title: _conf.default.i18n('vxe.pager.nextPageTitle'), onClick: handleNextPage }, [(0, _vue.h)('i', { class: ['vxe-pager--btn-icon', props.iconNextPage || _conf.default.icon.PAGER_NEXT_PAGE] })]); }; // 最后一页 var renderEndPage = function () { var pageCount = computePageCount.value; return (0, _vue.h)('button', { class: ['vxe-pager--prev-btn', { 'is--disabled': props.currentPage >= pageCount }], type: 'button', title: _conf.default.i18n('vxe.pager.endPageTitle'), onClick: handleEndPage }, [(0, _vue.h)('i', { class: ['vxe-pager--btn-icon', props.iconEndPage || _conf.default.icon.PAGER_END] })]); }; // 页数 var renderNumber = function (showJump) { var currentPage = props.currentPage, pagerCount = props.pagerCount; var nums = []; var pageCount = computePageCount.value; var numList = computeNumList.value; var offsetNumber = computeOffsetNumber.value; var isOv = pageCount > pagerCount; var isLt = isOv && currentPage > offsetNumber + 1; var isGt = isOv && currentPage < pageCount - offsetNumber; var startNumber = 1; if (isOv) { if (currentPage >= pageCount - offsetNumber) { startNumber = Math.max(pageCount - numList.length + 1, 1); } else { startNumber = Math.max(currentPage - offsetNumber, 1); } } if (showJump && isLt) { nums.push((0, _vue.h)('button', { class: 'vxe-pager--num-btn', type: 'button', onClick: function (evnt) { return jumpPageEvent(evnt, 1); } }, 1), renderPrevJump('span')); } numList.forEach(function (item, index) { var number = startNumber + index; if (number <= pageCount) { nums.push((0, _vue.h)('button', { key: number, class: ['vxe-pager--num-btn', { 'is--active': currentPage === number }], type: 'button', onClick: function (evnt) { return jumpPageEvent(evnt, number); } }, number)); } }); if (showJump && isGt) { nums.push(renderNextJump('button'), (0, _vue.h)('button', { class: 'vxe-pager--num-btn', type: 'button', onClick: function (evnt) { return jumpPageEvent(evnt, pageCount); } }, pageCount)); } return (0, _vue.h)('span', { class: 'vxe-pager--btn-wrapper' }, nums); }; // jumpNumber var renderJumpNumber = function () { return renderNumber(true); }; // sizes var renderSizes = function () { var sizeList = computeSizeList.value; return (0, _vue.h)((0, _vue.resolveComponent)('vxe-select'), { class: 'vxe-pager--sizes', modelValue: props.pageSize, placement: 'top', transfer: props.transfer, options: sizeList, onChange: pageSizeEvent }); }; // Jump var renderJump = function (isFull) { return (0, _vue.h)('span', { class: 'vxe-pager--jump' }, [isFull ? (0, _vue.h)('span', { class: 'vxe-pager--goto-text' }, _conf.default.i18n('vxe.pager.goto')) : null, (0, _vue.h)('input', { class: 'vxe-pager--goto', value: reactData.inpCurrPage, type: 'text', autocomplete: 'off', onInput: jumpInputEvent, onKeydown: jumpKeydownEvent, onBlur: triggerJumpEvent }), isFull ? (0, _vue.h)('span', { class: 'vxe-pager--classifier-text' }, _conf.default.i18n('vxe.pager.pageClassifier')) : null]); }; // FullJump var renderFullJump = function () { return renderJump(true); }; // PageCount var renderPageCount = function () { var pageCount = computePageCount.value; return (0, _vue.h)('span', { class: 'vxe-pager--count' }, [(0, _vue.h)('span', { class: 'vxe-pager--separator' }), (0, _vue.h)('span', pageCount)]); }; // total var renderTotal = function () { return (0, _vue.h)('span', { class: 'vxe-pager--total' }, _conf.default.i18n('vxe.pager.total', [props.total])); }; pagerMethods = { dispatchEvent: function (type, params, evnt) { emit(type, Object.assign({ $pager: $xepager, $event: evnt }, params)); }, homePage: function () { handleHomePage(); return (0, _vue.nextTick)(); }, endPage: function () { handleEndPage(); return (0, _vue.nextTick)(); }, prevPage: function () { handlePrevPage(); return (0, _vue.nextTick)(); }, nextPage: function () { handleNextPage(); return (0, _vue.nextTick)(); }, prevJump: function () { handlePrevJump(); return (0, _vue.nextTick)(); }, nextJump: function () { handleNextJump(); return (0, _vue.nextTick)(); } }; pagerPrivateMethods = { handlePrevPage: handlePrevPage, handleNextPage: handleNextPage, handlePrevJump: handlePrevJump, handleNextJump: handleNextJump }; Object.assign($xepager, pagerMethods, pagerPrivateMethods); (0, _vue.watch)(function () { return props.currentPage; }, function (value) { reactData.inpCurrPage = value; }); var renderVN = function () { var _a; var align = props.align, layouts = props.layouts, className = props.className; var childNodes = []; var vSize = computeSize.value; var pageCount = computePageCount.value; if (slots.left) { childNodes.push((0, _vue.h)('span', { class: 'vxe-pager--left-wrapper' }, slots.left({ $grid: $xegrid }))); } layouts.forEach(function (name) { var renderFn; switch (name) { case 'Home': renderFn = renderHomePage; break; case 'PrevJump': renderFn = renderPrevJump; break; case 'PrevPage': renderFn = renderPrevPage; break; case 'Number': renderFn = renderNumber; break; case 'JumpNumber': renderFn = renderJumpNumber; break; case 'NextPage': renderFn = renderNextPage; break; case 'NextJump': renderFn = renderNextJump; break; case 'End': renderFn = renderEndPage; break; case 'Sizes': renderFn = renderSizes; break; case 'FullJump': renderFn = renderFullJump; break; case 'Jump': renderFn = renderJump; break; case 'PageCount': renderFn = renderPageCount; break; case 'Total': renderFn = renderTotal; break; } if (renderFn) { childNodes.push(renderFn()); } else { if (process.env.NODE_ENV === 'development') { (0, _log.errLog)('vxe.error.notProp', ["layouts -> ".concat(name)]); } } }); if (slots.right) { childNodes.push((0, _vue.h)('span', { class: 'vxe-pager--right-wrapper' }, slots.right({ $grid: $xegrid }))); } return (0, _vue.h)('div', { ref: refElem, class: ['vxe-pager', className ? _xeUtils.default.isFunction(className) ? className({ $pager: $xepager }) : className : '', (_a = {}, _a["size--".concat(vSize)] = vSize, _a["align--".concat(align)] = align, _a['is--border'] = props.border, _a['is--background'] = props.background, _a['is--perfect'] = props.perfect, _a['is--hidden'] = props.autoHidden && pageCount === 1, _a['is--loading'] = props.loading, _a)] }, [(0, _vue.h)('div', { class: 'vxe-pager--wrapper' }, childNodes)]); }; $xepager.renderVN = renderVN; return $xepager; }, render: function () { return this.renderVN(); } }); exports.default = _default;