UNPKG

vxe-table

Version:

一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...

819 lines (729 loc) 26.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.Cell = void 0; var _ctor = _interopRequireDefault(require("xe-utils/ctor")); var _conf = _interopRequireDefault(require("../../conf")); var _vXETable = _interopRequireDefault(require("../../v-x-e-table")); var _tools = require("../../tools"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function renderHelpIcon(h, params) { var $table = params.$table, column = params.column; var titleHelp = column.titleHelp; return titleHelp ? [h('i', { class: ['vxe-cell-help-icon', titleHelp.icon || _conf.default.icon.TABLE_HELP], on: { mouseenter: function mouseenter(evnt) { $table.triggerHeaderHelpEvent(evnt, params); }, mouseleave: function mouseleave(evnt) { $table.handleTargetLeaveEvent(evnt); } } })] : []; } function renderTitleContent(h, params, content) { var $table = params.$table, column = params.column; var showHeaderOverflow = column.showHeaderOverflow; var allColumnHeaderOverflow = $table.showHeaderOverflow, tooltipOpts = $table.tooltipOpts; var enabled = tooltipOpts.enabled; var headOverflow = _ctor.default.isUndefined(showHeaderOverflow) || _ctor.default.isNull(showHeaderOverflow) ? allColumnHeaderOverflow : showHeaderOverflow; var showTitle = headOverflow === 'title'; var showTooltip = headOverflow === true || headOverflow === 'tooltip'; var ons = {}; if (showTitle || showTooltip || enabled) { ons.mouseenter = function (evnt) { if ($table._isResize) { return; } if (showTitle) { _tools.DomTools.updateCellTitle(evnt.currentTarget, column); } else if (showTooltip || enabled) { $table.triggerHeaderTooltipEvent(evnt, params); } }; } if (showTooltip || enabled) { ons.mouseleave = function (evnt) { if ($table._isResize) { return; } if (showTooltip || enabled) { $table.handleTargetLeaveEvent(evnt); } }; } return [h('span', { class: 'vxe-cell--title', on: ons }, content)]; } function getFooterContent(h, params) { var $table = params.$table, column = params.column, _columnIndex = params._columnIndex, items = params.items; var slots = column.slots, editRender = column.editRender, cellRender = column.cellRender; var renderOpts = editRender || cellRender; if (slots && slots.footer) { return slots.footer.call($table, params, h); } if (renderOpts) { var compConf = _vXETable.default.renderer.get(renderOpts.name); if (compConf && compConf.renderFooter) { return compConf.renderFooter.call($table, h, renderOpts, params); } } return [_tools.UtilTools.formatText(items[_columnIndex], 1)]; } function getDefaultCellLabel(params) { var row = params.row, column = params.column; return _tools.UtilTools.formatText(_tools.UtilTools.getCellLabel(row, column, params), 1); } var Cell = { createColumn: function createColumn($xetable, _vm) { var type = _vm.type, sortable = _vm.sortable, remoteSort = _vm.remoteSort, filters = _vm.filters, editRender = _vm.editRender, treeNode = _vm.treeNode; var editConfig = $xetable.editConfig, editOpts = $xetable.editOpts, checkboxOpts = $xetable.checkboxOpts; var renMaps = { renderHeader: this.renderDefaultHeader, renderCell: treeNode ? this.renderTreeCell : this.renderDefaultCell, renderFooter: this.renderDefaultFooter }; switch (type) { case 'seq': renMaps.renderHeader = this.renderIndexHeader; renMaps.renderCell = treeNode ? this.renderTreeIndexCell : this.renderIndexCell; break; case 'radio': renMaps.renderHeader = this.renderRadioHeader; renMaps.renderCell = treeNode ? this.renderTreeRadioCell : this.renderRadioCell; break; case 'checkbox': renMaps.renderHeader = this.renderSelectionHeader; renMaps.renderCell = checkboxOpts.checkField ? treeNode ? this.renderTreeSelectionCellByProp : this.renderSelectionCellByProp : treeNode ? this.renderTreeSelectionCell : this.renderSelectionCell; break; case 'expand': renMaps.renderCell = this.renderExpandCell; renMaps.renderData = this.renderExpandData; break; case 'html': renMaps.renderCell = treeNode ? this.renderTreeHTMLCell : this.renderHTMLCell; if (filters && (sortable || remoteSort)) { renMaps.renderHeader = this.renderSortAndFilterHeader; } else if (sortable || remoteSort) { renMaps.renderHeader = this.renderSortHeader; } else if (filters) { renMaps.renderHeader = this.renderFilterHeader; } break; default: if (editConfig && editRender) { renMaps.renderHeader = this.renderEditHeader; renMaps.renderCell = editOpts.mode === 'cell' ? treeNode ? this.renderTreeCellEdit : this.renderCellEdit : treeNode ? this.renderTreeRowEdit : this.renderRowEdit; } else if (filters && (sortable || remoteSort)) { renMaps.renderHeader = this.renderSortAndFilterHeader; } else if (sortable || remoteSort) { renMaps.renderHeader = this.renderSortHeader; } else if (filters) { renMaps.renderHeader = this.renderFilterHeader; } } return _tools.UtilTools.getColumnConfig($xetable, _vm, renMaps); }, /** * 单元格 */ renderHeaderTitle: function renderHeaderTitle(h, params) { var $table = params.$table, column = params.column; var slots = column.slots, editRender = column.editRender, cellRender = column.cellRender; var renderOpts = editRender || cellRender; if (slots && slots.header) { return renderTitleContent(h, params, slots.header.call($table, params, h)); } if (renderOpts) { var compConf = _vXETable.default.renderer.get(renderOpts.name); if (compConf && compConf.renderHeader) { return renderTitleContent(h, params, compConf.renderHeader.call($table, h, renderOpts, params)); } } return renderTitleContent(h, params, _tools.UtilTools.formatText(column.getTitle(), 1)); }, renderDefaultHeader: function renderDefaultHeader(h, params) { return renderHelpIcon(h, params).concat(Cell.renderHeaderTitle(h, params)); }, renderDefaultCell: function renderDefaultCell(h, params) { var $table = params.$table, column = params.column; var slots = column.slots, editRender = column.editRender, cellRender = column.cellRender; var renderOpts = editRender || cellRender; if (slots && slots.default) { return slots.default.call($table, params, h); } if (renderOpts) { var funName = editRender ? 'renderCell' : 'renderDefault'; var compConf = _vXETable.default.renderer.get(renderOpts.name); if (compConf && compConf[funName]) { return compConf[funName].call($table, h, renderOpts, Object.assign({ $type: editRender ? 'edit' : 'cell' }, params)); } } return [h('span', { class: 'vxe-cell--label' }, [getDefaultCellLabel(params)])]; }, renderTreeCell: function renderTreeCell(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderDefaultCell.call(this, h, params)); }, renderDefaultFooter: function renderDefaultFooter(h, params) { return [h('span', { class: 'vxe-cell--item' }, getFooterContent(h, params))]; }, /** * 树节点 */ renderTreeIcon: function renderTreeIcon(h, params, cellVNodes) { var $table = params.$table, isHidden = params.isHidden; var treeOpts = $table.treeOpts, treeExpandeds = $table.treeExpandeds, treeLazyLoadeds = $table.treeLazyLoadeds; var row = params.row, column = params.column, level = params.level; var slots = column.slots; var children = treeOpts.children, hasChild = treeOpts.hasChild, indent = treeOpts.indent, lazy = treeOpts.lazy, trigger = treeOpts.trigger, iconLoaded = treeOpts.iconLoaded, showIcon = treeOpts.showIcon, iconOpen = treeOpts.iconOpen, iconClose = treeOpts.iconClose; var rowChilds = row[children]; var hasLazyChilds = false; var isAceived = false; var isLazyLoaded = false; var on = {}; if (slots && slots.icon) { return slots.icon.call($table, params, h, cellVNodes); } if (!isHidden) { isAceived = treeExpandeds.indexOf(row) > -1; if (lazy) { isLazyLoaded = treeLazyLoadeds.indexOf(row) > -1; hasLazyChilds = row[hasChild]; } } if (!trigger || trigger === 'default') { on.click = function (evnt) { return $table.triggerTreeExpandEvent(evnt, params); }; } return [h('div', { class: ['vxe-cell--tree-node', { 'is--active': isAceived }], style: { paddingLeft: "".concat(level * indent, "px") } }, [showIcon && (rowChilds && rowChilds.length || hasLazyChilds) ? [h('div', { class: 'vxe-tree--btn-wrapper', on: on }, [h('i', { class: ['vxe-tree--node-btn', isLazyLoaded ? iconLoaded || _conf.default.icon.TABLE_TREE_LOADED : isAceived ? iconOpen || _conf.default.icon.TABLE_TREE_OPEN : iconClose || _conf.default.icon.TABLE_TREE_CLOSE] })])] : null, h('div', { class: 'vxe-tree-cell' }, cellVNodes)])]; }, /** * 索引 */ renderIndexHeader: function renderIndexHeader(h, params) { var $table = params.$table, column = params.column; var slots = column.slots; return renderTitleContent(h, params, slots && slots.header ? slots.header.call($table, params, h) : _tools.UtilTools.formatText(column.getTitle(), 1)); }, renderIndexCell: function renderIndexCell(h, params) { var $table = params.$table, column = params.column; var seqOpts = $table.seqOpts; var slots = column.slots; if (slots && slots.default) { return slots.default.call($table, params, h); } var $seq = params.$seq, seq = params.seq, level = params.level; var seqMethod = seqOpts.seqMethod; return [_tools.UtilTools.formatText(seqMethod ? seqMethod(params) : level ? "".concat($seq, ".").concat(seq) : seqOpts.startIndex + seq, 1)]; }, renderTreeIndexCell: function renderTreeIndexCell(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderIndexCell(h, params)); }, /** * 单选 */ renderRadioHeader: function renderRadioHeader(h, params) { var $table = params.$table, column = params.column; var slots = column.slots; return renderTitleContent(h, params, slots && slots.header ? slots.header.call($table, params, h) : [h('span', { class: 'vxe-radio--label' }, _tools.UtilTools.formatText(column.getTitle(), 1))]); }, renderRadioCell: function renderRadioCell(h, params) { var $table = params.$table, column = params.column, isHidden = params.isHidden; var radioOpts = $table.radioOpts, selectRow = $table.selectRow; var slots = column.slots; var labelField = radioOpts.labelField, checkMethod = radioOpts.checkMethod; var row = params.row; var isChecked = row === selectRow; var isDisabled = !!checkMethod; var on; if (!isHidden) { on = { click: function click(evnt) { if (!isDisabled) { $table.triggerRadioRowEvent(evnt, params); } } }; if (checkMethod) { isDisabled = !checkMethod({ row: row }); } } return [h('span', { class: ['vxe-cell--radio', { 'is--checked': isChecked, 'is--disabled': isDisabled }], on: on }, [h('span', { class: 'vxe-radio--icon vxe-radio--checked-icon' }), h('span', { class: 'vxe-radio--icon vxe-radio--unchecked-icon' })].concat(slots && slots.default ? slots.default.call($table, params, h) : labelField ? [h('span', { class: 'vxe-radio--label' }, _ctor.default.get(row, labelField))] : []))]; }, renderTreeRadioCell: function renderTreeRadioCell(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderRadioCell(h, params)); }, /** * 多选 */ renderSelectionHeader: function renderSelectionHeader(h, params) { var $table = params.$table, column = params.column, isHidden = params.isHidden; var isIndeterminate = $table.isIndeterminate, isAllCheckboxDisabled = $table.isAllCheckboxDisabled; var slots = column.slots; var checkboxOpts = $table.checkboxOpts; var headerTitle = column.getTitle(); var isChecked = false; var on; if (checkboxOpts.checkStrictly ? !checkboxOpts.showHeader : checkboxOpts.showHeader === false) { return renderTitleContent(h, params, slots && slots.header ? slots.header.call($table, params, h) : [h('span', { class: 'vxe-checkbox--label' }, headerTitle)]); } if (!isHidden) { isChecked = isAllCheckboxDisabled ? false : $table.isAllSelected; on = { click: function click(evnt) { if (!isAllCheckboxDisabled) { $table.triggerCheckAllEvent(evnt, !isChecked); } } }; } return renderTitleContent(h, params, [h('span', { class: ['vxe-cell--checkbox', { 'is--checked': isChecked, 'is--disabled': isAllCheckboxDisabled, 'is--indeterminate': isIndeterminate }], attrs: { title: _conf.default.i18n('vxe.table.allTitle') }, on: on }, [h('span', { class: 'vxe-checkbox--icon vxe-checkbox--checked-icon' }), h('span', { class: 'vxe-checkbox--icon vxe-checkbox--unchecked-icon' }), h('span', { class: 'vxe-checkbox--icon vxe-checkbox--indeterminate-icon' })].concat(slots && slots.header ? slots.header.call($table, params, h) : headerTitle ? [h('span', { class: 'vxe-checkbox--label' }, headerTitle)] : []))]); }, renderSelectionCell: function renderSelectionCell(h, params) { var $table = params.$table, row = params.row, column = params.column, isHidden = params.isHidden; var treeConfig = $table.treeConfig, treeIndeterminates = $table.treeIndeterminates; var _$table$checkboxOpts = $table.checkboxOpts, labelField = _$table$checkboxOpts.labelField, checkMethod = _$table$checkboxOpts.checkMethod; var slots = column.slots; var indeterminate = false; var isChecked = false; var isDisabled = !!checkMethod; var on; if (!isHidden) { isChecked = $table.selection.indexOf(row) > -1; on = { click: function click(evnt) { if (!isDisabled) { $table.triggerCheckRowEvent(evnt, params, !isChecked); } } }; if (checkMethod) { isDisabled = !checkMethod({ row: row }); } if (treeConfig) { indeterminate = treeIndeterminates.indexOf(row) > -1; } } return [h('span', { class: ['vxe-cell--checkbox', { 'is--checked': isChecked, 'is--disabled': isDisabled, 'is--indeterminate': indeterminate }], on: on }, [h('span', { class: 'vxe-checkbox--icon vxe-checkbox--checked-icon' }), h('span', { class: 'vxe-checkbox--icon vxe-checkbox--unchecked-icon' }), h('span', { class: 'vxe-checkbox--icon vxe-checkbox--indeterminate-icon' })].concat(slots && slots.default ? slots.default.call($table, params, h) : labelField ? [h('span', { class: 'vxe-checkbox--label' }, _ctor.default.get(row, labelField))] : []))]; }, renderTreeSelectionCell: function renderTreeSelectionCell(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderSelectionCell(h, params)); }, renderSelectionCellByProp: function renderSelectionCellByProp(h, params) { var $table = params.$table, row = params.row, column = params.column, isHidden = params.isHidden; var treeConfig = $table.treeConfig, treeIndeterminates = $table.treeIndeterminates; var _$table$checkboxOpts2 = $table.checkboxOpts, labelField = _$table$checkboxOpts2.labelField, property = _$table$checkboxOpts2.checkField, halfField = _$table$checkboxOpts2.halfField, checkMethod = _$table$checkboxOpts2.checkMethod; var slots = column.slots; var indeterminate = false; var isChecked = false; var isDisabled = !!checkMethod; var on; if (!isHidden) { isChecked = _ctor.default.get(row, property); on = { click: function click(evnt) { if (!isDisabled) { $table.triggerCheckRowEvent(evnt, params, !isChecked); } } }; if (checkMethod) { isDisabled = !checkMethod({ row: row }); } if (treeConfig) { indeterminate = treeIndeterminates.indexOf(row) > -1; } } return [h('span', { class: ['vxe-cell--checkbox', { 'is--checked': isChecked, 'is--disabled': isDisabled, 'is--indeterminate': halfField && !isChecked ? row[halfField] : indeterminate }], on: on }, [h('span', { class: 'vxe-checkbox--icon vxe-checkbox--checked-icon' }), h('span', { class: 'vxe-checkbox--icon vxe-checkbox--unchecked-icon' }), h('span', { class: 'vxe-checkbox--icon vxe-checkbox--indeterminate-icon' })].concat(slots && slots.default ? slots.default.call($table, params, h) : labelField ? [h('span', { class: 'vxe-checkbox--label' }, _ctor.default.get(row, labelField))] : []))]; }, renderTreeSelectionCellByProp: function renderTreeSelectionCellByProp(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderSelectionCellByProp(h, params)); }, /** * 展开行 */ renderExpandCell: function renderExpandCell(h, params) { var $table = params.$table, isHidden = params.isHidden, row = params.row, column = params.column; var expandOpts = $table.expandOpts, rowExpandeds = $table.rowExpandeds, expandLazyLoadeds = $table.expandLazyLoadeds; var lazy = expandOpts.lazy, labelField = expandOpts.labelField, iconLoaded = expandOpts.iconLoaded, showIcon = expandOpts.showIcon, iconOpen = expandOpts.iconOpen, iconClose = expandOpts.iconClose, visibleMethod = expandOpts.visibleMethod; var slots = column.slots; var isAceived = false; var isLazyLoaded = false; if (slots && slots.icon) { return slots.icon.call($table, params, h); } if (!isHidden) { isAceived = rowExpandeds.indexOf(params.row) > -1; if (lazy) { isLazyLoaded = expandLazyLoadeds.indexOf(row) > -1; } } return [showIcon && (!visibleMethod || visibleMethod(params)) ? h('span', { class: ['vxe-table--expanded', { 'is--active': isAceived }], on: { click: function click(evnt) { $table.triggerRowExpandEvent(evnt, params); } } }, [h('i', { class: ['vxe-table--expand-btn', isLazyLoaded ? iconLoaded || _conf.default.icon.TABLE_EXPAND_LOADED : isAceived ? iconOpen || _conf.default.icon.TABLE_EXPAND_OPEN : iconClose || _conf.default.icon.TABLE_EXPAND_CLOSE] })]) : null, slots && slots.default || labelField ? h('span', { class: 'vxe-table--expand-label' }, slots.default ? slots.default.call($table, params, h) : _ctor.default.get(row, labelField)) : null]; }, renderExpandData: function renderExpandData(h, params) { var $table = params.$table, column = params.column; var slots = column.slots, contentRender = column.contentRender; if (slots && slots.content) { return slots.content.call($table, params, h); } if (contentRender) { var compConf = _vXETable.default.renderer.get(contentRender.name); if (compConf && compConf.renderExpand) { return compConf.renderExpand.call($table, h, contentRender, params); } } return []; }, /** * HTML 标签 */ renderHTMLCell: function renderHTMLCell(h, params) { var $table = params.$table, column = params.column; var slots = column.slots; if (slots && slots.default) { return slots.default.call($table, params, h); } return [h('span', { class: 'vxe-cell--html', domProps: { innerHTML: getDefaultCellLabel(params) } })]; }, renderTreeHTMLCell: function renderTreeHTMLCell(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderHTMLCell(h, params)); }, /** * 排序和筛选 */ renderSortAndFilterHeader: function renderSortAndFilterHeader(h, params) { return Cell.renderDefaultHeader(h, params).concat(Cell.renderSortIcon(h, params)).concat(Cell.renderFilterIcon(h, params)); }, /** * 排序 */ renderSortHeader: function renderSortHeader(h, params) { return Cell.renderDefaultHeader(h, params).concat(Cell.renderSortIcon(h, params)); }, renderSortIcon: function renderSortIcon(h, params) { var $table = params.$table, column = params.column; var _$table$sortOpts = $table.sortOpts, showIcon = _$table$sortOpts.showIcon, iconAsc = _$table$sortOpts.iconAsc, iconDesc = _$table$sortOpts.iconDesc; return showIcon ? [h('span', { class: 'vxe-cell--sort' }, [h('i', { class: ['vxe-sort--asc-btn', iconAsc || _conf.default.icon.TABLE_SORT_ASC, { 'sort--active': column.order === 'asc' }], attrs: { title: _conf.default.i18n('vxe.table.sortAsc') }, on: { click: function click(evnt) { $table.triggerSortEvent(evnt, column, 'asc'); } } }), h('i', { class: ['vxe-sort--desc-btn', iconDesc || _conf.default.icon.TABLE_SORT_DESC, { 'sort--active': column.order === 'desc' }], attrs: { title: _conf.default.i18n('vxe.table.sortDesc') }, on: { click: function click(evnt) { $table.triggerSortEvent(evnt, column, 'desc'); } } })])] : []; }, /** * 筛选 */ renderFilterHeader: function renderFilterHeader(h, params) { return Cell.renderDefaultHeader(h, params).concat(Cell.renderFilterIcon(h, params)); }, renderFilterIcon: function renderFilterIcon(h, params) { var $table = params.$table, column = params.column, hasFilter = params.hasFilter; var filterStore = $table.filterStore, filterOpts = $table.filterOpts; var showIcon = filterOpts.showIcon, iconNone = filterOpts.iconNone, iconMatch = filterOpts.iconMatch; return showIcon ? [h('span', { class: ['vxe-cell--filter', { 'is--active': filterStore.visible && filterStore.column === column }] }, [h('i', { class: ['vxe-filter--btn', hasFilter ? iconMatch || _conf.default.icon.TABLE_FILTER_MATCH : iconNone || _conf.default.icon.TABLE_FILTER_NONE], attrs: { title: _conf.default.i18n('vxe.table.filter') }, on: { click: function click(evnt) { $table.triggerFilterEvent(evnt, params.column, params); } } })])] : []; }, /** * 可编辑 */ renderEditHeader: function renderEditHeader(h, params) { var $table = params.$table, column = params.column; var editRules = $table.editRules, editOpts = $table.editOpts; var sortable = column.sortable, remoteSort = column.remoteSort, filters = column.filters; var isRequired; if (editRules) { var columnRules = _ctor.default.get(editRules, params.column.property); if (columnRules) { isRequired = columnRules.some(function (rule) { return rule.required; }); } } return [isRequired && editOpts.showAsterisk ? h('i', { class: 'vxe-cell--required-icon' }) : null, editOpts.showIcon ? h('i', { class: ['vxe-cell--edit-icon', editOpts.icon || _conf.default.icon.TABLE_EDIT] }) : null].concat(Cell.renderDefaultHeader(h, params)).concat(sortable || remoteSort ? Cell.renderSortIcon(h, params) : []).concat(filters ? Cell.renderFilterIcon(h, params) : []); }, // 行格编辑模式 renderRowEdit: function renderRowEdit(h, params) { var $table = params.$table; var actived = $table.editStore.actived; return Cell.runRenderer(h, params, this, actived && actived.row === params.row); }, renderTreeRowEdit: function renderTreeRowEdit(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderRowEdit(h, params)); }, // 单元格编辑模式 renderCellEdit: function renderCellEdit(h, params) { var $table = params.$table; var actived = $table.editStore.actived; return Cell.runRenderer(h, params, this, actived && actived.row === params.row && actived.column === params.column); }, renderTreeCellEdit: function renderTreeCellEdit(h, params) { return Cell.renderTreeIcon(h, params, Cell.renderCellEdit(h, params)); }, runRenderer: function runRenderer(h, params, _vm, isEdit) { var $table = params.$table, column = params.column; var slots = column.slots, editRender = column.editRender, formatter = column.formatter; var compConf = _vXETable.default.renderer.get(editRender.name); if (isEdit) { if (slots && slots.edit) { return slots.edit.call($table, params, h); } return compConf && compConf.renderEdit ? compConf.renderEdit.call($table, h, editRender, Object.assign({ $type: 'edit' }, params)) : []; } if (slots && slots.default) { return slots.default.call($table, params, h); } if (formatter) { return [h('span', { class: 'vxe-cell--label' }, [getDefaultCellLabel(params)])]; } return Cell.renderDefaultCell.call(_vm, h, params); } }; exports.Cell = Cell; var _default = Cell; exports.default = _default;