UNPKG

vxe-table-demonic

Version:

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

359 lines (358 loc) 13.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _xeUtils = _interopRequireDefault(require("xe-utils")); var _dom = require("../../tools/dom"); 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 renderType = 'footer'; function mergeFooterMethod(mergeFooterList, _rowIndex, _columnIndex) { for (var mIndex = 0; mIndex < mergeFooterList.length; mIndex++) { var _a = mergeFooterList[mIndex], mergeRowIndex = _a.row, mergeColIndex = _a.col, mergeRowspan = _a.rowspan, mergeColspan = _a.colspan; if (mergeColIndex > -1 && mergeRowIndex > -1 && mergeRowspan && mergeColspan) { if (mergeRowIndex === _rowIndex && mergeColIndex === _columnIndex) { return { rowspan: mergeRowspan, colspan: mergeColspan }; } if (_rowIndex >= mergeRowIndex && _rowIndex < mergeRowIndex + mergeRowspan && _columnIndex >= mergeColIndex && _columnIndex < mergeColIndex + mergeColspan) { return { rowspan: 0, colspan: 0 }; } } } } var _default = (0, _vue.defineComponent)({ name: 'VxeTableFooter', props: { footerTableData: { type: Array, default: function () { return []; } }, tableColumn: { type: Array, default: function () { return []; } }, fixedColumn: { type: Array, default: function () { return []; } }, fixedType: { type: String, default: null } }, setup: function (props) { var $xetable = (0, _vue.inject)('$xetable', {}); var xID = $xetable.xID, tableProps = $xetable.props, tableReactData = $xetable.reactData, tableInternalData = $xetable.internalData; var _a = $xetable.getRefMaps(), refTableHeader = _a.refTableHeader, refTableBody = _a.refTableBody, refValidTooltip = _a.refValidTooltip; var _b = $xetable.getComputeMaps(), computeTooltipOpts = _b.computeTooltipOpts, computeColumnOpts = _b.computeColumnOpts; var refElem = (0, _vue.ref)(); var refFooterTable = (0, _vue.ref)(); var refFooterColgroup = (0, _vue.ref)(); var refFooterTFoot = (0, _vue.ref)(); var refFooterXSpace = (0, _vue.ref)(); /** * 滚动处理 * 如果存在列固定左侧,同步更新滚动状态 * 如果存在列固定右侧,同步更新滚动状态 */ var scrollEvent = function (evnt) { var fixedType = props.fixedType; var scrollXLoad = tableReactData.scrollXLoad; var lastScrollLeft = tableInternalData.lastScrollLeft; var validTip = refValidTooltip.value; var tableHeader = refTableHeader.value; var tableBody = refTableBody.value; var headerElem = tableHeader ? tableHeader.$el : null; var footerElem = refElem.value; var bodyElem = tableBody.$el; var scrollLeft = footerElem.scrollLeft; var isX = scrollLeft !== lastScrollLeft; tableInternalData.lastScrollLeft = scrollLeft; tableReactData.lastScrollTime = Date.now(); if (headerElem) { headerElem.scrollLeft = scrollLeft; } if (bodyElem) { bodyElem.scrollLeft = scrollLeft; } if (scrollXLoad && isX) { $xetable.triggerScrollXEvent(evnt); } if (isX && validTip && validTip.reactData.visible) { validTip.updatePlacement(); } $xetable.dispatchEvent('scroll', { type: renderType, fixed: fixedType, scrollTop: bodyElem.scrollTop, scrollLeft: scrollLeft, isX: isX, isY: false }, evnt); }; (0, _vue.onMounted)(function () { (0, _vue.nextTick)(function () { var fixedType = props.fixedType; var elemStore = tableInternalData.elemStore; var prefix = "".concat(fixedType || 'main', "-footer-"); elemStore["".concat(prefix, "wrapper")] = refElem; elemStore["".concat(prefix, "table")] = refFooterTable; elemStore["".concat(prefix, "colgroup")] = refFooterColgroup; elemStore["".concat(prefix, "list")] = refFooterTFoot; elemStore["".concat(prefix, "xSpace")] = refFooterXSpace; }); }); (0, _vue.onUnmounted)(function () { var fixedType = props.fixedType; var elemStore = tableInternalData.elemStore; var prefix = "".concat(fixedType || 'main', "-footer-"); elemStore["".concat(prefix, "wrapper")] = null; elemStore["".concat(prefix, "table")] = null; elemStore["".concat(prefix, "colgroup")] = null; elemStore["".concat(prefix, "list")] = null; elemStore["".concat(prefix, "xSpace")] = null; }); var renderVN = function () { var fixedType = props.fixedType, fixedColumn = props.fixedColumn, tableColumn = props.tableColumn, footerTableData = props.footerTableData; var footerRowClassName = tableProps.footerRowClassName, footerCellClassName = tableProps.footerCellClassName, footerRowStyle = tableProps.footerRowStyle, footerCellStyle = tableProps.footerCellStyle, allFooterAlign = tableProps.footerAlign, footerSpanMethod = tableProps.footerSpanMethod, allAlign = tableProps.align, columnKey = tableProps.columnKey, allColumnFooterOverflow = tableProps.showFooterOverflow; var visibleColumn = tableInternalData.visibleColumn; var scrollXLoad = tableReactData.scrollXLoad, overflowX = tableReactData.overflowX, scrollbarWidth = tableReactData.scrollbarWidth, currentColumn = tableReactData.currentColumn, mergeFooterList = tableReactData.mergeFooterList; var tooltipOpts = computeTooltipOpts.value; var columnOpts = computeColumnOpts.value; // 如果是使用优化模式 if (fixedType) { // 如果存在展开行使用全量渲染 if (!tableReactData.expandColumn && (scrollXLoad || allColumnFooterOverflow)) { if (!mergeFooterList.length || !footerSpanMethod) { tableColumn = fixedColumn; } else { tableColumn = visibleColumn; } } else { tableColumn = visibleColumn; } } return (0, _vue.h)('div', { ref: refElem, class: ['vxe-table--footer-wrapper', fixedType ? "fixed-".concat(fixedType, "--wrapper") : 'body--wrapper'], xid: xID, onScroll: scrollEvent }, [fixedType ? (0, _vue.createCommentVNode)() : (0, _vue.h)('div', { ref: refFooterXSpace, class: 'vxe-body--x-space' }), (0, _vue.h)('table', { ref: refFooterTable, class: 'vxe-table--footer', xid: xID, cellspacing: 0, cellpadding: 0, border: 0 }, [ /** * 列宽 */ (0, _vue.h)('colgroup', { ref: refFooterColgroup }, tableColumn.map(function (column, $columnIndex) { return (0, _vue.h)('col', { name: column.id, key: $columnIndex }); }).concat(scrollbarWidth ? [(0, _vue.h)('col', { name: 'col_gutter' })] : [])), /** * 底部 */ (0, _vue.h)('tfoot', { ref: refFooterTFoot }, footerTableData.map(function (list, _rowIndex) { var $rowIndex = _rowIndex; return (0, _vue.h)('tr', { class: ['vxe-footer--row', footerRowClassName ? _xeUtils.default.isFunction(footerRowClassName) ? footerRowClassName({ $table: $xetable, _rowIndex: _rowIndex, $rowIndex: $rowIndex, fixed: fixedType, type: renderType }) : footerRowClassName : ''], style: footerRowStyle ? _xeUtils.default.isFunction(footerRowStyle) ? footerRowStyle({ $table: $xetable, _rowIndex: _rowIndex, $rowIndex: $rowIndex, fixed: fixedType, type: renderType }) : footerRowStyle : null }, tableColumn.map(function (column, $columnIndex) { var _a; var type = column.type, showFooterOverflow = column.showFooterOverflow, footerAlign = column.footerAlign, align = column.align, footerClassName = column.footerClassName; var showAllTip = tooltipOpts.showAll; var isColGroup = column.children && column.children.length; var fixedHiddenColumn = fixedType ? column.fixed !== fixedType && !isColGroup : column.fixed && overflowX; var footOverflow = _xeUtils.default.isUndefined(showFooterOverflow) || _xeUtils.default.isNull(showFooterOverflow) ? allColumnFooterOverflow : showFooterOverflow; var footAlign = footerAlign || align || allFooterAlign || allAlign; var showEllipsis = footOverflow === 'ellipsis'; var showTitle = footOverflow === 'title'; var showTooltip = footOverflow === true || footOverflow === 'tooltip'; var hasEllipsis = showTitle || showTooltip || showEllipsis; var attrs = { colid: column.id }; var tfOns = {}; var columnIndex = $xetable.getColumnIndex(column); var _columnIndex = $xetable.getVTColumnIndex(column); var itemIndex = _columnIndex; var params = { $table: $xetable, $grid: $xetable.xegrid, _rowIndex: _rowIndex, $rowIndex: $rowIndex, column: column, columnIndex: columnIndex, $columnIndex: $columnIndex, _columnIndex: _columnIndex, itemIndex: itemIndex, items: list, fixed: fixedType, type: renderType, data: footerTableData }; // 纵向虚拟滚动不支持动态行高 if (scrollXLoad && !hasEllipsis) { showEllipsis = hasEllipsis = true; } if (showTitle || showTooltip || showAllTip) { tfOns.onMouseenter = function (evnt) { if (showTitle) { (0, _dom.updateCellTitle)(evnt.currentTarget, column); } else if (showTooltip || showAllTip) { $xetable.triggerFooterTooltipEvent(evnt, params); } }; } if (showTooltip || showAllTip) { tfOns.onMouseleave = function (evnt) { if (showTooltip || showAllTip) { $xetable.handleTargetLeaveEvent(evnt); } }; } tfOns.onClick = function (evnt) { $xetable.dispatchEvent('footer-cell-click', Object.assign({ cell: evnt.currentTarget }, params), evnt); }; tfOns.onDblclick = function (evnt) { $xetable.dispatchEvent('footer-cell-dblclick', Object.assign({ cell: evnt.currentTarget }, params), evnt); }; // 合并行或列 if (mergeFooterList.length) { var spanRest = mergeFooterMethod(mergeFooterList, _rowIndex, _columnIndex); if (spanRest) { var rowspan = spanRest.rowspan, colspan = spanRest.colspan; if (!rowspan || !colspan) { return null; } if (rowspan > 1) { attrs.rowspan = rowspan; } if (colspan > 1) { attrs.colspan = colspan; } } } else if (footerSpanMethod) { // 自定义合并方法 var _b = footerSpanMethod(params) || {}, _c = _b.rowspan, rowspan = _c === void 0 ? 1 : _c, _d = _b.colspan, colspan = _d === void 0 ? 1 : _d; if (!rowspan || !colspan) { return null; } if (rowspan > 1) { attrs.rowspan = rowspan; } if (colspan > 1) { attrs.colspan = colspan; } } return (0, _vue.h)('td', __assign(__assign(__assign(__assign({ class: ['vxe-footer--column', column.id, (_a = {}, _a["col--".concat(footAlign)] = footAlign, _a["col--".concat(type)] = type, _a['col--last'] = $columnIndex === tableColumn.length - 1, _a['fixed--hidden'] = fixedHiddenColumn, _a['col--ellipsis'] = hasEllipsis, _a['col--current'] = currentColumn === column, _a), (0, _dom.getPropClass)(footerClassName, params), (0, _dom.getPropClass)(footerCellClassName, params)] }, attrs), { style: footerCellStyle ? _xeUtils.default.isFunction(footerCellStyle) ? footerCellStyle(params) : footerCellStyle : null }), tfOns), { key: columnKey || columnOpts.useKey ? column.id : $columnIndex }), [(0, _vue.h)('div', { class: ['vxe-cell', { 'c--title': showTitle, 'c--tooltip': showTooltip, 'c--ellipsis': showEllipsis }] }, column.renderFooter(params))]); }).concat(scrollbarWidth ? [(0, _vue.h)('td', { class: 'vxe-footer--gutter col--gutter' })] : [])); }))])]); }; return renderVN; } }); exports.default = _default;