UNPKG

vxe-table

Version:

A PC-end table component based on Vxe UI, supporting copy-paste, data pivot table, and high-performance virtual list table solution.

1,647 lines (1,640 loc) 1.51 MB
import { VxeUI } from '@vxe-ui/core'; export { VxeUI } from '@vxe-ui/core'; import XEUtils from 'xe-utils'; import DomZIndex from 'dom-zindex'; import { defineComponent, watch, reactive, h, ref, inject, createCommentVNode, onMounted, onUnmounted, provide, nextTick, TransitionGroup, computed, Teleport, resolveComponent, onActivated, onDeactivated, onBeforeUnmount } from 'vue'; const { getConfig: getConfig$9 } = VxeUI; function isEnableConf(conf) { return conf && conf.enabled !== false; } function isEmptyValue(cellValue) { return cellValue === null || cellValue === undefined || cellValue === ''; } function parseFile(file) { const name = file.name; const tIndex = XEUtils.lastIndexOf(name, '.'); const type = name.substring(tIndex + 1, name.length).toLowerCase(); const filename = name.substring(0, tIndex); return { filename, type }; } function nextZIndex() { return DomZIndex.getNext(); } function getLastZIndex() { return DomZIndex.getCurrent(); } function hasChildrenList(item) { return item && item.children && item.children.length > 0; } function getFuncText(content, args) { if (XEUtils.eqNull(content)) { return ''; } const translate = getConfig$9().translate; return `${translate ? translate('' + content, args) : content}`; } function formatText(value, placeholder) { return '' + (isEmptyValue(value) ? (placeholder ? getConfig$9().emptyCell : '') : value); } /** * 判断值为:'' | null | undefined 时都属于空值 */ function eqEmptyValue(cellValue) { return cellValue === '' || XEUtils.eqNull(cellValue); } const version$1 = "4.19.4"; VxeUI.version = version$1; VxeUI.tableVersion = version$1; VxeUI.setConfig({ emptyCell: ' ', table: { fit: true, showHeader: true, animat: true, delayHover: 250, autoResize: true, // minHeight: null, // keepSource: false, // showOverflow: null, // showHeaderOverflow: null, // showFooterOverflow: null, // resizeInterval: 500, // size: null, // zIndex: null, // stripe: false, // border: false, // round: false, // emptyText: '暂无数据', // emptyRender: { // name: '' // }, // rowConfig: { // keyField: '_X_ROW_KEY' // 行数据的唯一主键字段名 // }, resizeConfig: { // refreshDelay: 20 }, resizableConfig: { dragMode: 'auto', showDragTip: true, isSyncAutoHeight: true, isSyncAutoWidth: true, minHeight: 18 }, currentRowConfig: { strict: true }, currentColumnConfig: { strict: true }, radioConfig: { // trigger: 'default' strict: true }, rowDragConfig: { showIcon: true, animation: true, showGuidesStatus: true, showDragTip: true }, columnDragConfig: { showIcon: true, animation: true, showGuidesStatus: true, showDragTip: true }, checkboxConfig: { // trigger: 'default', strict: true }, tooltipConfig: { enterable: true, defaultPlacement: 'top' }, headerTooltipConfig: { enterable: true }, footerTooltipConfig: { enterable: true }, validConfig: { showErrorMessage: true, autoClear: true, autoPos: true, message: 'inline', msgMode: 'single', theme: 'beautify' }, columnConfig: { autoOptions: { isCalcHeader: true, isCalcBody: true, isCalcFooter: true }, maxFixedSize: 4 }, cellConfig: { padding: true }, headerCellConfig: { height: 'unset' }, footerCellConfig: { height: 'unset' }, menuConfig: { // visibleMethod () {}, // transfer: false, destroyOnClose: true }, customConfig: { // enabled: false, allowVisible: true, allowResizable: true, allowFixed: true, allowSort: true, showSortDragButton: true, showFooter: true, placement: 'top-right', // storage: false, storeOptions: { visible: true, resizable: true, sort: true, fixed: true // rowGroup: false, // aggFunc: false }, // autoAggGroupValues: false, // checkMethod () {}, modalOptions: { showMaximize: true, mask: true, lockView: true, resize: true, escClosable: true }, drawerOptions: { mask: true, lockView: true, escClosable: true, resize: true } }, sortConfig: { // remote: false, // trigger: 'default', // orders: ['asc', 'desc', null], // sortMethod: null, showIcon: true, allowClear: true, allowBtn: true, iconLayout: 'vertical' }, filterConfig: { // remote: false, // filterMethod: null, // isEvery: false, // transfer: false, destroyOnClose: true, multiple: true, showIcon: true, maxHeight: 280 }, floatingFilterConfig: { // enabled: false }, aggregateConfig: { padding: true, placement: 'left', rowField: 'id', parentField: '_X_ROW_PARENT_KEY', childrenField: '_X_ROW_CHILDREN', mapChildrenField: '_X_ROW_CHILD_LIST', indent: 20, showIcon: true, maxGroupSize: 4, showAggFuncTitle: true }, treeConfig: { padding: true, rowField: 'id', parentField: 'parentId', childrenField: 'children', hasChildField: 'hasChild', mapChildrenField: '_X_ROW_CHILD', indent: 20, showIcon: true, showRootLine: true }, expandConfig: { // trigger: 'default', showIcon: true, mode: 'fixed' }, editConfig: { // mode: 'cell', showIcon: true, showAsterisk: true, autoFocus: true }, importConfig: { _typeMaps: { csv: 1, html: 1, xml: 1, txt: 1 } }, exportConfig: { _typeMaps: { csv: 1, html: 1, xml: 1, txt: 1 } }, printConfig: {}, mouseConfig: { extension: true }, keyboardConfig: { isAll: true, isEsc: true }, areaConfig: { autoClear: true, selectCellByHeader: true, selectCellByBody: true, extendDirection: { top: true, left: true, bottom: true, right: true } }, clipConfig: { isCopy: true, isCut: true, isPaste: true }, fnrConfig: { isFind: true, isReplace: true }, virtualXConfig: { // enabled: false, gt: 24, preSize: 1, oSize: 0 }, virtualYConfig: { // enabled: false, // mode: 'wheel', gt: 100, preSize: 1, oSize: 0 }, scrollbarConfig: { // width: 14, // height: 14, x: { // position: 'bottom', visible: true }, y: { // position: 'right', visible: true } }, undoRedoHistoryConfig: { stackSize: 50 } }, grid: { // size: null, // zoomConfig: { // escRestore: true // }, formConfig: { enabled: true }, pagerConfig: { enabled: true // perfect: false }, toolbarConfig: { enabled: true // perfect: false }, proxyConfig: { enabled: true, autoLoad: true, showLoading: true, showResponseMsg: true, showActionMsg: true, response: { list: 'list', result: 'result', total: 'page.total', footerData: 'footerData', message: 'message' } // beforeItem: null, // beforeColumn: null, // beforeQuery: null, // afterQuery: null, // beforeDelete: null, // afterDelete: null, // beforeSave: null, // afterSave: null } }, toolbar: { // size: null, // import: { // mode: 'covering' // }, // export: { // types: ['csv', 'html', 'xml', 'txt'] // }, // buttons: [] }, gantt: {} }); const iconPrefix = 'vxe-table-icon-'; VxeUI.setIcon({ // table TABLE_SORT_ASC: iconPrefix + 'caret-up', TABLE_SORT_DESC: iconPrefix + 'caret-down', TABLE_FILTER_NONE: iconPrefix + 'funnel', TABLE_FILTER_MATCH: iconPrefix + 'funnel', TABLE_EDIT: iconPrefix + 'edit', TABLE_TITLE_PREFIX: iconPrefix + 'question-circle-fill', TABLE_TITLE_SUFFIX: iconPrefix + 'question-circle-fill', TABLE_TREE_LOADED: iconPrefix + 'spinner roll', TABLE_TREE_OPEN: iconPrefix + 'caret-right rotate90', TABLE_TREE_CLOSE: iconPrefix + 'caret-right', TABLE_EXPAND_LOADED: iconPrefix + 'spinner roll', TABLE_EXPAND_OPEN: iconPrefix + 'arrow-right rotate90', TABLE_EXPAND_CLOSE: iconPrefix + 'arrow-right', TABLE_CHECKBOX_CHECKED: iconPrefix + 'checkbox-checked-fill', TABLE_CHECKBOX_UNCHECKED: iconPrefix + 'checkbox-unchecked', TABLE_CHECKBOX_INDETERMINATE: iconPrefix + 'checkbox-indeterminate-fill', TABLE_CHECKBOX_DISABLED_UNCHECKED: iconPrefix + 'checkbox-unchecked-fill', TABLE_RADIO_CHECKED: iconPrefix + 'radio-checked-fill', TABLE_RADIO_UNCHECKED: iconPrefix + 'radio-unchecked', TABLE_RADIO_DISABLED_UNCHECKED: iconPrefix + 'radio-unchecked-fill', TABLE_CUSTOM_SORT: iconPrefix + 'drag-handle', TABLE_MENU_OPTIONS: iconPrefix + 'arrow-right', TABLE_MENU_OPTION_LOADING: iconPrefix + 'repeat roll', TABLE_DRAG_ROW: iconPrefix + 'drag-handle', TABLE_DRAG_COLUMN: iconPrefix + 'drag-handle', TABLE_DRAG_STATUS_ROW: iconPrefix + 'sort', TABLE_DRAG_STATUS_SUB_ROW: iconPrefix + 'add-sub', TABLE_DRAG_STATUS_AGG_GROUP: iconPrefix + 'grouping', TABLE_DRAG_STATUS_AGG_VALUES: iconPrefix + 'values', TABLE_DRAG_STATUS_COLUMN: iconPrefix + 'swap', TABLE_DRAG_DISABLED: iconPrefix + 'no-drop', TABLE_ROW_GROUP_OPEN: iconPrefix + 'arrow-right rotate90', TABLE_ROW_GROUP_CLOSE: iconPrefix + 'arrow-right', TABLE_AGGREGATE_GROUPING: iconPrefix + 'grouping', TABLE_AGGREGATE_VALUES: iconPrefix + 'values', TABLE_AGGREGATE_SORT: iconPrefix + 'drag-handle', TABLE_AGGREGATE_DELETE: iconPrefix + 'close', // toolbar TOOLBAR_TOOLS_REFRESH: iconPrefix + 'repeat', TOOLBAR_TOOLS_REFRESH_LOADING: iconPrefix + 'repeat roll', TOOLBAR_TOOLS_IMPORT: iconPrefix + 'upload', TOOLBAR_TOOLS_EXPORT: iconPrefix + 'download', TOOLBAR_TOOLS_PRINT: iconPrefix + 'print', TOOLBAR_TOOLS_FULLSCREEN: iconPrefix + 'fullscreen', TOOLBAR_TOOLS_MINIMIZE: iconPrefix + 'minimize', TOOLBAR_TOOLS_CUSTOM: iconPrefix + 'custom-column', TOOLBAR_TOOLS_FIXED_LEFT: iconPrefix + 'fixed-left', TOOLBAR_TOOLS_FIXED_LEFT_ACTIVE: iconPrefix + 'fixed-left-fill', TOOLBAR_TOOLS_FIXED_RIGHT: iconPrefix + 'fixed-right', TOOLBAR_TOOLS_FIXED_RIGHT_ACTIVE: iconPrefix + 'fixed-right-fill' }); const setTheme = VxeUI.setTheme; const getTheme = VxeUI.getTheme; const setConfig = VxeUI.setConfig; const getConfig$8 = VxeUI.getConfig; const setIcon = VxeUI.setIcon; const getIcon$8 = VxeUI.getIcon; const setLanguage = VxeUI.setLanguage; const setI18n = VxeUI.setI18n; const getI18n$e = VxeUI.getI18n; const globalEvents$3 = VxeUI.globalEvents; const globalResize$1 = VxeUI.globalResize; const renderer$c = VxeUI.renderer; const validators$1 = VxeUI.validators; const menus$1 = VxeUI.menus; const formats$2 = VxeUI.formats; const commands$2 = VxeUI.commands; const interceptor$1 = VxeUI.interceptor; const clipboard = VxeUI.clipboard; const log$1 = VxeUI.log; const hooks$8 = VxeUI.hooks; const use = VxeUI.use; /** * 已废弃 * @deprecated */ const setup = (options) => { return VxeUI.setConfig(options); }; VxeUI.setup = setup; /** * 已废弃 * @deprecated */ const config = (options) => { return VxeUI.setConfig(options); }; VxeUI.config = config; /** * 已废弃 * @deprecated */ const t = (key, args) => { return VxeUI.getI18n(key, args); }; VxeUI.t = t; /** * 已废弃 * @deprecated */ const _t = (content, args) => { return getFuncText(content, args); }; VxeUI._t = _t; /** * 已废弃,兼容老版本 * @deprecated */ const VXETable = VxeUI; /** * 已废弃,兼容老版本 * @deprecated */ const saveFile = (options) => { return VxeUI.saveFile(options); }; /** * 已废弃,兼容老版本 * @deprecated */ const readFile = (options) => { return VxeUI.readFile(options); }; /** * 已废弃,兼容老版本 * @deprecated */ const print = (options) => { return VxeUI.print(options); }; /** * 已废弃,兼容老版本 * @deprecated */ const modal = { /** * 已废弃,兼容老版本 * @deprecated */ get(id) { return VxeUI.modal.get(id); }, /** * 已废弃,兼容老版本 * @deprecated */ close(id) { return VxeUI.modal.close(id); }, /** * 已废弃,兼容老版本 * @deprecated */ open(options) { return VxeUI.modal.open(options); }, /** * 已废弃,兼容老版本 * @deprecated */ alert(content, title, options) { return VxeUI.modal.alert(content, title, options); }, /** * 已废弃,兼容老版本 * @deprecated */ confirm(content, title, options) { return VxeUI.modal.confirm(content, title, options); }, /** * 已废弃,兼容老版本 * @deprecated */ message(content, options) { return VxeUI.modal.message(content, options); }, /** * 已废弃,兼容老版本 * @deprecated */ notification(content, title, options) { return VxeUI.modal.notification(content, title, options); } }; const defineVxeComponent = defineComponent; const { log } = VxeUI; const version = `table v${"4.19.4"}`; const warnLog = log.create('warn', version); const errLog = log.create('error', version); const { getI18n: getI18n$d, formats: formats$1, renderer: renderer$b } = VxeUI; class ColumnInfo { /* eslint-disable @typescript-eslint/no-use-before-define */ constructor($xeTable, _vm, { renderHeader, renderCell, renderFooter, renderData } = {}) { const tableProps = $xeTable.props; const $xeGrid = $xeTable.xeGrid; const $xeGantt = $xeTable.xeGantt; const $xeGGWrapper = $xeGrid || $xeGantt; const { field, editRender, filterRender, headerFormatter } = _vm; const colId = _vm.colId || XEUtils.uniqueId('col_'); const formatter = _vm.formatter; const visible = XEUtils.isBoolean(_vm.visible) ? _vm.visible : true; const flCompConf = isEnableConf(filterRender) ? renderer$b.get(filterRender.name) : null; const ctFilterOptions = flCompConf ? flCompConf.createTableFilterOptions : null; const filters = toFilters(_vm.filters, colId); if (headerFormatter) { errLog('vxe.error.notProp', ['header-formatter']); } const types = ['seq', 'checkbox', 'radio', 'expand', 'html']; if (_vm.type && types.indexOf(_vm.type) === -1) { warnLog('vxe.error.errProp', [`type=${_vm.type}`, types.join(', ')]); } if (XEUtils.isBoolean(_vm.cellRender) || (_vm.cellRender && !XEUtils.isObject(_vm.cellRender))) { warnLog('vxe.error.errProp', [`column.cell-render=${_vm.cellRender}`, 'column.cell-render={}']); } if (XEUtils.isBoolean(_vm.editRender) || (_vm.editRender && !XEUtils.isObject(_vm.editRender))) { warnLog('vxe.error.errProp', [`column.edit-render=${_vm.editRender}`, 'column.edit-render={}']); } if (_vm.type === 'expand') { const { treeConfig } = tableProps; const { computeTreeOpts } = $xeTable.getComputeMaps(); const treeOpts = computeTreeOpts.value; if (treeConfig && (treeOpts.showLine || treeOpts.line)) { errLog('vxe.error.errConflicts', ['tree-config.showLine', 'column.type=expand']); } } if (formatter) { if (XEUtils.isString(formatter)) { const gFormatOpts = formats$1.get(formatter) || XEUtils[formatter]; if (!gFormatOpts || !XEUtils.isFunction(gFormatOpts.tableCellFormatMethod || gFormatOpts.cellFormatMethod)) { errLog('vxe.error.notFormats', [formatter]); } } else if (XEUtils.isArray(formatter)) { const gFormatOpts = formats$1.get(formatter[0]) || XEUtils[formatter[0]]; if (!gFormatOpts || !XEUtils.isFunction(gFormatOpts.tableCellFormatMethod || gFormatOpts.cellFormatMethod)) { errLog('vxe.error.notFormats', [formatter[0]]); } } } if (_vm.aggFunc) { if (!$xeTable.handlePivotTableAggData && _vm.aggFunc !== true) { errLog('vxe.error.errProp', [`column.agg-func=${_vm.aggFunc}`, 'column.agg-func=true']); } } if (field && editRender) { if (editRender.startField && `${editRender.startField}`.indexOf(field) >= 0) { errLog('vxe.error.modelConflicts', [`field=${field}`, `edit-render.startField=${editRender.startField}`]); } if (editRender.endField && `${editRender.endField}`.indexOf(field) >= 0) { errLog('vxe.error.modelConflicts', [`field=${field}`, `edit-render.endField=${editRender.endField}`]); } } Object.assign(this, { // 基本属性 type: _vm.type, property: _vm.field, field: field, title: _vm.title, width: _vm.width, minWidth: _vm.minWidth, maxWidth: _vm.maxWidth, resizable: _vm.resizable, fixed: _vm.fixed, align: _vm.align, headerAlign: _vm.headerAlign, footerAlign: _vm.footerAlign, showOverflow: _vm.showOverflow, showHeaderOverflow: _vm.showHeaderOverflow, showFooterOverflow: _vm.showFooterOverflow, className: _vm.className, headerClassName: _vm.headerClassName, footerClassName: _vm.footerClassName, formatter: formatter, headerFormatter: _vm.headerFormatter, footerFormatter: _vm.footerFormatter, padding: _vm.padding, verticalAlign: _vm.verticalAlign, sortable: _vm.sortable, sortBy: _vm.sortBy, sortType: _vm.sortType, filters: filters, filterMultiple: XEUtils.isBoolean(_vm.filterMultiple) ? _vm.filterMultiple : true, filterMethod: _vm.filterMethod, filterResetMethod: _vm.filterResetMethod, filterRecoverMethod: _vm.filterRecoverMethod, filterRender: filterRender, floatingFilters: _vm.floatingFilters, rules: _vm.rules, rowGroupNode: _vm.rowGroupNode, treeNode: _vm.treeNode, dragSort: _vm.dragSort, rowResize: _vm.rowResize, cellType: _vm.cellType, cellRender: _vm.cellRender, editRender: editRender, contentRender: _vm.contentRender, headerExportMethod: _vm.headerExportMethod, exportMethod: _vm.exportMethod, footerExportMethod: _vm.footerExportMethod, titleHelp: _vm.titleHelp, titlePrefix: _vm.titlePrefix, titleSuffix: _vm.titleSuffix, aggFunc: _vm.aggFunc, copyMethod: _vm.copyMethod, cutMethod: _vm.cutMethod, pasteMethod: _vm.pasteMethod, // 自定义参数 params: _vm.params, // 渲染属性 id: colId, parentId: null, visible, // 内部属性(一旦被使用,将导致不可升级版本) defaultParentId: null, halfVisible: false, defaultVisible: visible, defaultFixed: _vm.fixed, defaultAggGroup: _vm.aggGroup, defaultAggFunc: _vm.aggFunc, checked: false, halfChecked: false, disabled: false, // 分组层级 level: 1, // 跨行 rowSpan: 1, // 跨列 colSpan: 1, // 数据排序 order: null, sortTime: 0, // 列排序 sortNumber: 0, renderSortNumber: 0, renderAggFn: '', renderAggDigits: null, renderAggFormat: null, renderFixed: '', renderVisible: false, renderWidth: 0, renderHeight: 0, renderResizeWidth: 0, renderAutoWidth: 0, resizeWidth: 0, renderLeft: 0, renderArgs: [], model: {}, renderHeader: renderHeader || _vm.renderHeader, renderCell: renderCell || _vm.renderCell, renderFooter: renderFooter || _vm.renderFooter, renderData: renderData, // 单元格插槽,只对 grid 有效 slots: _vm.slots }); if (ctFilterOptions && (!filters || !filters.length)) { this.filters = toFilters(ctFilterOptions({ $table: $xeTable, column: this }), colId); } if ($xeGGWrapper) { const { computeProxyOpts } = $xeGGWrapper.getComputeMaps(); const proxyOpts = computeProxyOpts.value; if (proxyOpts.beforeColumn) { proxyOpts.beforeColumn({ $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, column: this }); } } } getTitle() { return getFuncText(this.title || (this.type === 'seq' ? getI18n$d('vxe.table.seqTitle') : '')); } getKey() { const { type } = this; return this.field || (type ? `type=${type}` : null); } update(name, value) { // 不支持直接修改的属性 if (name !== 'filters') { if (name === 'field') { // 兼容旧属性 this.property = value; } this[name] = value; } } } const reClsMap = {}; let tpImgEl; function initTpImg() { if (!tpImgEl) { tpImgEl = new Image(); tpImgEl.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; } return tpImgEl; } function getTpImg() { if (!tpImgEl) { return initTpImg(); } return tpImgEl; } function getPropClass(property, params) { return property ? XEUtils.isFunction(property) ? property(params) : property : ''; } function getClsRE(cls) { if (!reClsMap[cls]) { reClsMap[cls] = new RegExp(`(?:^|\\s)${cls}(?!\\S)`, 'g'); } return reClsMap[cls]; } function isPx(val) { return val && /^\d+(\.\d+)?(px)?$/.test(val); } function isScale(val) { return val && /^\d+(\.\d+)?%$/.test(val); } function hasClass(elem, cls) { return !!(elem && elem.className && elem.className.match && elem.className.match(getClsRE(cls))); } function removeClass(elem, cls) { if (elem && hasClass(elem, cls)) { elem.className = elem.className.replace(getClsRE(cls), ''); } } function addClass(elem, cls) { if (elem && !hasClass(elem, cls)) { removeClass(elem, cls); elem.className = `${elem.className} ${cls}`; } } function hasControlKey(evnt) { return evnt.ctrlKey || evnt.metaKey; } function toCssUnit(val, unit = 'px') { if (XEUtils.isNumber(val) || /^\d+$/.test(`${val}`)) { return `${val}${unit}`; } return `${val || ''}`; } function queryElement(elem, selector) { if (elem) { return elem.querySelector(selector); } return null; } function getDomNode() { const documentElement = document.documentElement; const bodyElem = document.body; return { scrollTop: documentElement.scrollTop || bodyElem.scrollTop, scrollLeft: documentElement.scrollLeft || bodyElem.scrollLeft, visibleHeight: documentElement.clientHeight || bodyElem.clientHeight, visibleWidth: documentElement.clientWidth || bodyElem.clientWidth }; } function getOffsetHeight(elem) { return elem ? elem.offsetHeight : 0; } function getPaddingTopBottomSize(elem) { if (elem) { const computedStyle = getComputedStyle(elem); const paddingTop = XEUtils.toNumber(computedStyle.paddingTop); const paddingBottom = XEUtils.toNumber(computedStyle.paddingBottom); return paddingTop + paddingBottom; } return 0; } function setScrollTop(elem, scrollTop) { if (elem) { elem.scrollTop = scrollTop; } } function setScrollLeft(elem, scrollLeft) { if (elem) { elem.scrollLeft = scrollLeft; } } // export function setScrollLeftAndTop (elem: HTMLElement | null, scrollLeft: number, scrollTop: number) { // if (elem) { // elem.scrollLeft = scrollLeft // elem.scrollTop = scrollTop // } // } function updateCellTitle(overflowElem, column) { const content = column.type === 'html' ? overflowElem.innerText : overflowElem.textContent; if (overflowElem.getAttribute('title') !== content) { overflowElem.setAttribute('title', content); } } function checkTargetElement(target, exEls, endEl) { let targetEl = target; if (!exEls || !exEls.length) { return false; } const [exEl1, exEl2, exEl3] = exEls; while (targetEl) { if (exEl1 === targetEl || (exEl2 && targetEl === exEl2) || (exEl3 && targetEl === exEl3)) { return true; } if (endEl && targetEl === endEl) { return false; } targetEl = targetEl.parentElement; } return false; } /** * 检查触发源是否属于目标节点 */ function getEventTargetNode(evnt, container, queryCls, queryMethod) { let targetElem; let target = (evnt.target.shadowRoot && evnt.composed) ? (evnt.composedPath()[0] || evnt.target) : evnt.target; while (target && target.nodeType && target !== document) { if (queryCls && hasClass(target, queryCls) && (!queryMethod || queryMethod(target))) { targetElem = target; } else if (target === container) { return { flag: queryCls ? !!targetElem : true, container, targetElem: targetElem }; } target = target.parentNode; } return { flag: false }; } function getAbsolutePos(elem) { const bounding = elem.getBoundingClientRect(); const boundingTop = bounding.top; const boundingLeft = bounding.left; const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode(); return { boundingTop, top: scrollTop + boundingTop, boundingLeft, left: scrollLeft + boundingLeft, visibleHeight, visibleWidth }; } function hasEventInputTarget(target) { const tagName = target ? target.tagName : ''; return tagName && ['input', 'textarea'].includes((tagName.toLowerCase())); } const scrollIntoViewIfNeeded = 'scrollIntoViewIfNeeded'; const scrollIntoView = 'scrollIntoView'; function scrollToView(elem) { if (elem) { if (elem[scrollIntoViewIfNeeded]) { elem[scrollIntoViewIfNeeded](); } else if (elem[scrollIntoView]) { elem[scrollIntoView](); } } } function triggerEvent(targetElem, type) { if (targetElem) { targetElem.dispatchEvent(new Event(type)); } } let wtlFrame; function wheelScrollLeftTo(scrollLeft, cb) { if (wtlFrame) { cancelAnimationFrame(wtlFrame); } wtlFrame = requestAnimationFrame(() => { cb(scrollLeft); wtlFrame = null; }); } let wtaFrame; function wheelScrollTopTo(diffNum, cb) { if (wtaFrame) { cancelAnimationFrame(wtaFrame); } wtaFrame = requestAnimationFrame(() => { const offsetTop = diffNum; cb(offsetTop); wtaFrame = null; }); } function createInternalData$3() { return { tZindex: 0, currKeyField: '', isCurrDeepKey: false, elemStore: {}, // 存放横向 X 虚拟滚动相关的信息 scrollXStore: { preloadSize: 0, offsetSize: 0, visibleSize: 0, visibleStartIndex: 0, visibleEndIndex: 0, startIndex: 0, endIndex: 0 }, // 存放纵向 Y 虚拟滚动相关信息 scrollYStore: { preloadSize: 0, offsetSize: 0, visibleSize: 0, visibleStartIndex: 0, visibleEndIndex: 0, startIndex: 0, endIndex: 0 }, // 表格宽度 tableWidth: 0, // 表格高度 tableHeight: 0, customHeight: 0, customMinHeight: 0, customMaxHeight: 0, // 当前 hover 行 hoverRow: null, // 最后滚动位置 lastScrollLeft: 0, lastScrollTop: 0, // 单选框属性,已选中保留的行 radioReserveRow: null, // 复选框属性,已选中保留的行集合 checkboxReserveRowMap: {}, // 行数据,已展开保留的行集合 rowExpandedReserveRowMap: {}, // 树结构数据,已展开保留的行集合 treeExpandedReserveRowMap: {}, // 树结构数据,不确定状态的集合 treeIndeterminateRowMaps: {}, // 列表完整数据、条件处理后 tableFullData: [], afterFullData: [], afterTreeFullData: [], afterGroupFullData: [], // 列表条件处理后数据集合 afterFullRowMaps: {}, // 树结构完整数据、条件处理后 tableFullTreeData: [], // 行分组全量数据、条件处理后 tableFullGroupData: [], tableSynchData: [], tableSourceData: [], // 收集的列配置(带分组) collectColumn: [], // 完整所有列(不带分组) tableFullColumn: [], // 渲染所有列 visibleColumn: [], // 全量数据集(包括当前和已删除) fullAllDataRowIdData: {}, // 数据集(仅当前) fullDataRowIdData: {}, // 数据集(仅可视) visibleDataRowIdData: {}, keepUpdateFieldMaps: {}, footerFullDataRowData: {}, // 渲染中缓存数据 sourceDataRowIdData: {}, fullColumnIdData: {}, fullColumnFieldData: {}, // 当前行 currentRow: null, // 合并表头单元格的数据 mergeHeaderList: [], mergeHeaderMaps: {}, // 已合并单元格数据集合 mergeHeaderCellMaps: {}, mergeHeaderRowMaps: {}, mergeHeaderColMaps: {}, // 合并单元格的数据 mergeBodyList: [], mergeBodyMaps: {}, // 已合并单元格数据集合 mergeBodyCellMaps: {}, mergeBodyRowMaps: {}, mergeBodyColMaps: {}, // 合并表尾的数据 mergeFooterList: [], mergeFooterMaps: {}, // 已合并表尾数据集合 mergeFooterCellMaps: {}, mergeFooterRowMaps: {}, mergeFooterColMaps: {}, // 已展开的行集合 rowExpandedMaps: {}, // 懒加载中的展开行的集合 rowExpandLazyLoadedMaps: {}, // 已展开的分组行 rowGroupExpandedMaps: {}, // 已展开树节点集合 treeExpandedMaps: {}, // 懒加载中的树节点的集合 treeExpandLazyLoadedMaps: {}, // 复选框属性,已选中的行集合 selectCheckboxMaps: {}, // 已标记的对象集 pendingRowMaps: {}, // 已新增的临时行 insertRowMaps: {}, // 已删除行 removeRowMaps: {}, cvCacheMaps: {}, // 表头高度 tHeaderHeight: 0, // 表体高度 tBodyHeight: 0, // 表尾高度 tFooterHeight: 0, stackHistoryStore: { undoStacks: [], redoStacks: [] }, teleportToWrapperElem: null, popupToWrapperElem: null, customPopupToElem: null, lastSTime: 0, // isCustomDragStatus: false, inited: false, tooltipTimeout: null, initStatus: false, isActivated: false // _sToTime: null }; } function createReactData$2() { return { updateColFlag: 0, // 低性能的静态列 staticColumns: [], // 渲染的列分组 tableGroupColumn: [], // 可视区渲染的列 tableColumn: [], // 渲染中的数据 tableData: [], // 是否启用了横向 X 可视渲染方式加载 scrollXLoad: false, // 是否启用了纵向 Y 可视渲染方式加载 scrollYLoad: false, // 是否存在纵向滚动条 overflowY: true, // 是否存在横向滚动条 overflowX: false, // 纵向滚动条的宽度 scrollbarWidth: 0, // 横向滚动条的高度 scrollbarHeight: 0, // 行高 rowHeight: 0, // 表格父容器的高度 parentHeight: 0, // 是否使用分组表头 isGroup: false, isAllOverflow: false, // 复选框属性,是否全选 isAllSelected: false, // 复选框属性,有选中且非全选状态 isIndeterminate: false, // 单选框属性,选中列 currentColumn: null, // 单选框属性,选中行 selectRadioRow: null, // 表尾合计数据 footerTableData: [], // 行分组列信息 rowGroupColumn: null, // 展开列信息 expandColumn: null, checkboxColumn: null, radioColumn: null, // 树节点列信息 treeNodeColumn: null, hasFixedColumn: false, // 刷新列标识,当列筛选被改变时,触发表格刷新数据 upDataFlag: 0, // 刷新列标识,当列的特定属性被改变时,触发表格刷新列 reColumnFlag: 0, // 初始化标识 initStore: { filter: false, import: false, export: false, custom: false }, // 自定义列相关的信息 customStore: { btnEl: null, isAll: false, isIndeterminate: false, activeBtn: false, activeWrapper: false, visible: false, maxHeight: null, popupStyle: {}, oldSortMaps: {}, oldFixedMaps: {}, oldVisibleMaps: {} }, customColumnList: [], // 当前选中的筛选列 filterStore: { isAllSelected: false, isIndeterminate: false, style: null, column: null, visible: false, maxHeight: null }, // 存放列相关的信息 columnStore: { leftList: [], centerList: [], rightList: [], resizeList: [], pxList: [], pxMinList: [], autoMinList: [], scaleList: [], scaleMinList: [], autoList: [], remainList: [] }, // 存放快捷菜单的信息 ctxMenuStore: { selected: null, visible: false, showChild: false, selectChild: null, list: [], style: null }, // 存放可编辑相关信息 editStore: { indexs: { columns: [] }, titles: { columns: [] }, // 选中源 selected: { row: null, column: null }, // 已复制源 copyed: { cut: false, rows: [], columns: [] }, // 激活 actived: { row: null, column: null }, // 当前被强制聚焦单元格,只会在鼠标点击后算聚焦 focused: { row: null, column: null } }, // 存放 tooltip 相关信息 tooltipStore: { row: null, column: null, content: '', visible: false, type: null, currOpts: {} }, // 存放数据校验相关信息 validStore: { visible: false }, validErrorMaps: {}, // 导入相关信息 importStore: { inited: false, file: null, type: '', modeList: [], typeList: [], filename: '', visible: false }, importParams: { mode: '', types: null, message: true }, // 导出相关信息 exportStore: { inited: false, name: '', modeList: [], typeList: [], columns: [], isPrint: false, hasFooter: false, hasMerge: false, hasTree: false, hasRowGroup: false, hasColgroup: false, visible: false }, exportParams: { filename: '', sheetName: '', mode: '', type: '', isColgroup: false, isMerge: false, isTreeAllExpanded: false, isRowGroupAllExpanded: false, useStyle: false, original: false, message: true, isHeader: false, isTitle: false, isFooter: false }, visiblwRowsFlag: 1, isRowGroupStatus: false, rowGroupList: [], aggHandleFields: [], aggHandleAggColumns: [], rowGroupExpandedFlag: 1, rowExpandedFlag: 1, treeExpandedFlag: 1, updateCheckboxFlag: 1, pendingRowFlag: 1, insertRowFlag: 1, removeRowFlag: 1, mergeHeadFlag: 1, mergeBodyFlag: 1, mergeFootFlag: 1, rowHeightStore: { large: 52, default: 48, medium: 44, small: 40, mini: 36 }, scrollVMLoading: false, scrollYHeight: 0, scrollYTop: 0, isScrollYBig: false, scrollXLeft: 0, scrollXWidth: 0, isScrollXBig: false, lazScrollLoading: false, rowExpandHeightFlag: 1, calcCellHeightFlag: 1, resizeHeightFlag: 1, resizeWidthFlag: 1, isCustomStatus: false, isCustomDragStatus: true, ctPopupFlag: 1, isCrossDragRow: false, dragRow: null, isCrossDragCol: false, dragCol: null, dragTipText: '', isDragResize: false, isRowLoading: false, isColLoading: false }; } const getAllConvertColumns = (columns, parentColumn) => { const result = []; columns.forEach((column) => { column.parentId = parentColumn ? parentColumn.id : null; if (column.visible) { if (column.children && column.children.length && column.children.some((column) => column.visible)) { result.push(column); result.push(...getAllConvertColumns(column.children, column)); } else { result.push(column); } } }); return result; }; const convertHeaderColumnToRows = (originColumns) => { let maxLevel = 1; const traverse = (column, parent) => { if (parent) { column.level = parent.level + 1; if (maxLevel < column.level) { maxLevel = column.level; } } if (column.children && column.children.length && column.children.some((column) => column.visible)) { let colSpan = 0; column.children.forEach((subColumn) => { if (subColumn.visible) { traverse(subColumn, column); colSpan += subColumn.colSpan; } }); column.colSpan = colSpan; } else { column.colSpan = 1; } }; originColumns.forEach((column) => { column.level = 1; traverse(column); }); const rows = []; for (let i = 0; i < maxLevel; i++) { rows.push([]); } const allColumns = getAllConvertColumns(originColumns); allColumns.forEach((column) => { if (column.children && column.children.length && column.children.some((column) => column.visible)) { column.rowSpan = 1; } else { column.rowSpan = maxLevel - column.level + 1; } rows[column.level - 1].push(column); }); return rows; }; function convertHeaderToGridRows(spanColumns) { const rSize = spanColumns.length; const cSize = spanColumns[0].reduce((sum, cell) => sum + cell.colSpan, 0); const occupiedRows = []; const fullRows = []; for (let rIndex = 0; rIndex < rSize; rIndex++) { const oCols = []; const dCols = []; for (let cIndex = 0; cIndex < cSize; cIndex++) { oCols.push(false); dCols.push(''); } occupiedRows.push(oCols); fullRows.push(dCols); } for (let rIndex = 0; rIndex < rSize; rIndex++) { let currColIndex = 0; for (const column of spanColumns[rIndex]) { const { colSpan, rowSpan } = column; let startColIndex = -1; for (let ccIndex = currColIndex; ccIndex <= cSize - colSpan; ccIndex++) { let oFlag = true; for (let csIndex = 0; csIndex < colSpan; csIndex++) { if (occupiedRows[rIndex][ccIndex + csIndex]) { oFlag = false; break; } } if (oFlag) { startColIndex = ccIndex; break; } } if (startColIndex === -1) { for (let j = 0; j <= cSize - colSpan; j++) { let oFlag = true; for (let k = 0; k < colSpan; k++) { if (occupiedRows[rIndex][j + k]) { oFlag = false; break; } } if (oFlag) { startColIndex = j; break; } } if (startColIndex === -1) { // error break; } } for (let srIndex = rIndex; srIndex < rIndex + rowSpan; srIndex++) { for (let scIndex = startColIndex; scIndex < startColIndex + colSpan; scIndex++) { occupiedRows[srIndex][scIndex] = true; fullRows[srIndex][scIndex] = column; } } currColIndex = startColIndex + colSpan; } } return fullRows; } function restoreScrollLocation($xeTable, scrollLeft, scrollTop) { const internalData = $xeTable.internalData; if (scrollLeft || scrollTop) { internalData.intoRunScroll = false; internalData.inVirtualScroll = false; internalData.inWheelScroll = false; internalData.inHeaderScroll = false; internalData.inBodyScroll = false; internalData.inFooterScroll = false; internalData.scrollRenderType = ''; // 还原滚动状态 return $xeTable.scrollTo(scrollLeft, scrollTop); } return $xeTable.clearScroll(); } function getRowUniqueId() { return XEUtils.uniqueId('row_'); } /** * 生成行的唯一主键 */ function createRowId(rowOpts, row, keyField) { const { createKeyMethod } = rowOpts; if (createKeyMethod) { return createKeyMethod({ row, keyField }); } return getRowUniqueId(); } function hasDeepKey(rowKey) { return rowKey.indexOf('.') > -1; } // 行主键 key function getRowkey($xeTable) { const { currKeyField } = $xeTable.internalData; return currKeyField; } // 行主键 value function getRowid($xeTable, row) { const internalData = $xeTable.internalData; const { isCurrDeepKey, currKeyField } = internalData; return row ? encodeRowid((isCurrDeepKey ? getDeepRowIdByKey : getFastRowIdByKey)(row, currKeyField)) : ''; } function createHandleUpdateRowId($xeTable) { const internalData = $xeTable.internalData; const { isCurrDeepKey, currKeyField } = internalData; const { computeRowOpts } = $xeTable.getComputeMaps(); const rowOpts = computeRowOpts.value; const updateRId = isCurrDeepKey ? updateDeepRowKey : updateFastRowKey; return { rowKey: currKeyField, handleUpdateRowId(row) { return row ? updateRId(rowOpts, row, currKeyField) : ''; } }; } function createHandleGetRowId($xeTable) { const internalData = $xeTable.internalData; const { isCurrDeepKey, currKeyField } = internalData; const getRId = isCurrDeepKey ? getDeepRowIdByKey : getFastRowIdByKey; return { rowKey: currKeyField, handleGetRowId(row) { return row ? encodeRowid(getRId(row, currKeyField)) : ''; } }; } // 编码行主键 function encodeRowid(rowVal) { return XEUtils.eqNull(rowVal) ? '' : encodeURIComponent(rowVal); } function getDeepRowIdByKey(row, rowKey) { return XEUtils.get(row, rowKey); } function updateDeepRowKey(rowOpts, row, rowKey) { let rowid = encodeRowid(getDeepRowIdByKey(row, rowKey)); if (eqEmptyValue(rowid)) { const newRowid = createRowId(rowOpts, row, rowKey); rowid = '' + newRowid; XEUtils.set(row, rowKey, rowid); } return rowid; } function getFastRowIdByKey(row, rowKey) { return row[rowKey]; } function updateFastRowKey(rowOpts, row, rowKey) { let rowid = encodeRowid(getFastRowIdByKey(row, rowKey)); if (eqEmptyValue(rowid)) { const newRowid = createRowId(rowOpts, row, rowKey); rowid = '' + newRowid; row[rowKey] = newRowid; } return rowid; } function handleFieldOrColumn($xeTable, fieldOrColumn) { if (fieldOrColumn) { return XEUtils.isString(fieldOrColumn) || XEUtils.isNumber(fieldOrColumn) ? $xeTable.getColumnByField(`${fieldOrColumn}`) : fieldOrColumn; } return null; } function handleRowidOrRow($xeTable, rowidOrRow) { if (rowidOrRow) { const rowid = XEUtils.isString(rowidOrRow) || XEUtils.isNumber(rowidOrRow) ? rowidOrRow : getRowid($xeTable, rowidOrRow); return $xeTable.getRowById(rowid); } return null; } function getCellRestHeight(rowRest, cellOpts, rowOpts, defaultRowHeight) { return rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight; } function getPaddingLeftRightSize(elem) { if (elem) { const computedStyle = getComputedStyle(elem); const paddingLeft = XEUtils.toNumber(computedStyle.paddingLeft); const paddingRight = XEUtils.toNumber(computedStyle.paddingRight); return paddingLeft + paddingRight; } return 0; } function getElementMarginAndWidth(elem) { if (elem) { const computedStyle = getComputedStyle(elem); const marginLeft = XEUtils.toNumber(computedStyle.marginLeft); const marginRight = XEUtils.toNumber(computedStyle.marginRight); return elem.offsetWidth + marginLeft + marginRight; } return 0; } function toFilters(filters, colid) { if (filters) { if (XEUtils.isArray(filters)) { return filters.map(({ label, value, data, resetValue, checked }) => { return { label, value, data, resetValue, checked: !!checked, _checked: !!checked, _colId: colid }; }); } return []; } return filters; } function toTreePathSeq(path) { return path.map((num, i) => i % 2 === 0 ? (Number(num) + 1) : '.').join(''); } function getCellValue(row, column) { if (column) { return XEUtils.get(row, column.field); } return null; } function setCellValue(row, column, value) { if (column) { XEUtils.set(row, column.field, value); } } function getRefElem(refEl) { if (refEl) { const rest = refEl.value; if (rest) { return (rest.$el || rest); } } return null; } function getCalcHeight(height) { if (height === 'unset') { return 0; } return height || 0; } /** * 列宽拖动最小宽度 * @param params * @returns */ function getColReMinWidth(params) { const { $table, column, cell } = params; const tableProps = $table.props; const internalData = $table.internalData; const { computeResizableOpts } = $table.getComputeMaps(); const resizableOpts = computeResizableOpts.value; const { minWidth: reMinWidth } = resizableOpts; // 如果自定义调整宽度逻辑 if (reMinWidth) { const customMinWidth = XEUtils.isFunction(reMinWidth) ? reMinWidth(params) : reMinWidth; if (customMinWidth !== 'auto') { return Math.max(1, XEUtils.toNumber(customMinWidth)); } } const { elemStore } = internalData; const { showHeaderOverflow: allColumnHeaderOverflow } = tableProps; const { showHeaderOverflow, minWidth: colMinWidth } = column; const headOverflow = XEUtils.isUndefined(showHeaderOverflow) || XEUtils.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow; const showEllipsis = headOverflow === 'ellipsis'; const showTitle = headOverflow === 'title'; const showTooltip = headOverflow