vxe-table-select-area
Version:
一个基于 vxe-table 的可区域选中复制、粘贴的组件
981 lines (971 loc) • 34.1 kB
JavaScript
import Table from '../../table'
import XEUtils from 'xe-utils'
import GlobalConfig from '../../v-x-e-table/src/conf'
import vSize from '../../mixins/size'
import VXETable from '../../v-x-e-table'
import UtilTools, { isEnableConf } from '../../tools/utils'
import DomTools, { getOffsetHeight, getPaddingTopBottomSize } from '../../tools/dom'
import { GlobalEvent } from '../../tools/event'
import { warnLog, errLog } from '../../tools/log'
import { getSlotVNs } from '../../tools/vn'
const methods = {}
const propKeys = Object.keys(Table.props)
function renderDefaultForm (h, _vm) {
const { $scopedSlots, proxyConfig, proxyOpts, formData, formConfig, formOpts } = _vm
if (isEnableConf(formConfig) && formOpts.items && formOpts.items.length) {
const formSlots = {}
if (!formOpts.inited) {
formOpts.inited = true
const beforeItem = proxyOpts.beforeItem
if (proxyOpts && beforeItem) {
formOpts.items.forEach(item => {
beforeItem.call(_vm, { $grid: _vm, item })
})
}
}
// 处理插槽
formOpts.items.forEach((item) => {
XEUtils.each(item.slots, (func) => {
if (!XEUtils.isFunction(func)) {
if ($scopedSlots[func]) {
formSlots[func] = $scopedSlots[func]
}
}
})
})
return [
h('vxe-form', {
props: Object.assign({}, formOpts, {
data: proxyConfig && proxyOpts.form ? formData : formOpts.data
}),
on: {
submit: _vm.submitEvent,
reset: _vm.resetEvent,
collapse: _vm.collapseEvent,
'submit-invalid': _vm.submitInvalidEvent
},
scopedSlots: formSlots
})
]
}
return []
}
function getFuncSlot (_vm, optSlots, slotKey) {
const { $scopedSlots } = _vm
const funcSlot = optSlots[slotKey]
if (funcSlot) {
if (XEUtils.isString(funcSlot)) {
if ($scopedSlots[funcSlot]) {
return $scopedSlots[funcSlot]
} else {
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
errLog('vxe.error.notSlot', [funcSlot])
}
}
} else {
return funcSlot
}
}
return null
}
function getToolbarSlots (_vm) {
const { $scopedSlots, toolbarOpts } = _vm
const toolbarOptSlots = toolbarOpts.slots
let buttonsSlot
let toolsSlot
const slots = {}
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if ($scopedSlots.buttons && (!toolbarOptSlots || toolbarOptSlots.buttons !== 'buttons')) {
warnLog('vxe.error.reqProp', ['toolbar-config.slots.buttons'])
}
if ($scopedSlots.tools && (!toolbarOptSlots || toolbarOptSlots.tools !== 'tools')) {
warnLog('vxe.error.reqProp', ['toolbar-config.slots.tools'])
}
}
if (toolbarOptSlots) {
buttonsSlot = getFuncSlot(_vm, toolbarOptSlots, 'buttons')
toolsSlot = getFuncSlot(_vm, toolbarOptSlots, 'tools')
if (buttonsSlot) {
slots.buttons = buttonsSlot
}
if (toolsSlot) {
slots.tools = toolsSlot
}
}
return slots
}
function getPagerSlots (_vm) {
const { pagerOpts } = _vm
const pagerOptSlots = pagerOpts.slots
const slots = {}
let leftSlot
let rightSlot
if (pagerOptSlots) {
leftSlot = getFuncSlot(_vm, pagerOptSlots, 'left')
rightSlot = getFuncSlot(_vm, pagerOptSlots, 'right')
if (leftSlot) {
slots.left = leftSlot
}
if (rightSlot) {
slots.right = rightSlot
}
}
return slots
}
function getTableOns (_vm) {
const { $listeners, proxyConfig, proxyOpts } = _vm
const ons = {}
XEUtils.each($listeners, (cb, type) => {
ons[type] = (...args) => {
_vm.$emit(type, ...args)
}
})
if (proxyConfig) {
if (proxyOpts.sort) {
ons['sort-change'] = _vm.sortChangeEvent
}
if (proxyOpts.filter) {
ons['filter-change'] = _vm.filterChangeEvent
}
}
return ons
}
Object.keys(Table.methods).forEach(name => {
methods[name] = function (...args) {
return this.$refs.xTable && this.$refs.xTable[name](...args)
}
})
export default {
name: 'VxeGrid',
mixins: [vSize],
props: {
...Table.props,
columns: Array,
pagerConfig: [Boolean, Object],
proxyConfig: Object,
toolbar: [Boolean, Object],
toolbarConfig: [Boolean, Object],
formConfig: [Boolean, Object],
zoomConfig: Object,
size: { type: String, default: () => GlobalConfig.grid.size || GlobalConfig.size }
},
provide () {
return {
$xegrid: this
}
},
data () {
return {
tableLoading: false,
isZMax: false,
tableData: [],
pendingRecords: [],
filterData: [],
formData: {},
sortData: [],
tZindex: 0,
tablePage: {
total: 0,
pageSize: GlobalConfig.pager.pageSize || 10,
currentPage: 1
}
}
},
computed: {
isMsg () {
return this.proxyOpts.message !== false
},
proxyOpts () {
return Object.assign({}, GlobalConfig.grid.proxyConfig, this.proxyConfig)
},
pagerOpts () {
return Object.assign({}, GlobalConfig.grid.pagerConfig, this.pagerConfig)
},
formOpts () {
return Object.assign({}, GlobalConfig.grid.formConfig, this.formConfig)
},
toolbarOpts () {
return Object.assign({}, GlobalConfig.grid.toolbarConfig, this.toolbarConfig || this.toolbar)
},
zoomOpts () {
return Object.assign({}, GlobalConfig.grid.zoomConfig, this.zoomConfig)
},
renderStyle () {
return this.isZMax ? { zIndex: this.tZindex } : null
},
tableExtendProps () {
const rest = {}
propKeys.forEach(key => {
rest[key] = this[key]
})
return rest
},
tableProps () {
const { isZMax, seqConfig, pagerConfig, loading, editConfig, proxyConfig, proxyOpts, tableExtendProps, tableLoading, tablePage, tableData } = this
const tableProps = Object.assign({}, tableExtendProps)
if (isZMax) {
if (tableExtendProps.maxHeight) {
tableProps.maxHeight = 'auto'
} else {
tableProps.height = 'auto'
}
}
if (proxyConfig) {
tableProps.loading = loading || tableLoading
tableProps.data = tableData
tableProps.rowClassName = this.handleRowClassName
if (proxyOpts.seq && isEnableConf(pagerConfig)) {
tableProps.seqConfig = Object.assign({}, seqConfig, { startIndex: (tablePage.currentPage - 1) * tablePage.pageSize })
}
}
if (editConfig) {
tableProps.editConfig = Object.assign({}, editConfig, { beforeEditMethod: this.handleBeforeEditMethod })
}
return tableProps
}
},
watch: {
columns (value) {
this.$nextTick(() => this.loadColumn(value))
},
toolbar (value) {
if (value) {
this.initToolbar()
}
},
toolbarConfig (value) {
if (value) {
this.initToolbar()
}
},
proxyConfig () {
this.initProxy()
},
pagerConfig () {
this.initPages()
}
},
created () {
const { data, formOpts, proxyOpts, proxyConfig } = this
if (proxyConfig && (data || (proxyOpts.form && formOpts.data))) {
errLog('vxe.error.errConflicts', ['grid.data', 'grid.proxy-config'])
}
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (this.toolbar) {
warnLog('vxe.error.delProp', ['grid.toolbar', 'grid.toolbar-config'])
}
if (this.toolbarConfig && !XEUtils.isObject(this.toolbarConfig)) {
warnLog('vxe.error.errProp', [`grid.toolbar-config=${this.toolbarConfig}`, 'grid.toolbar-config={}'])
}
}
this.initPages()
GlobalEvent.on(this, 'keydown', this.handleGlobalKeydownEvent)
},
mounted () {
if (this.columns && this.columns.length) {
this.loadColumn(this.columns)
}
this.initToolbar()
this.initProxy()
},
destroyed () {
GlobalEvent.off(this, 'keydown')
},
render (h) {
const { $scopedSlots, vSize, isZMax } = this
const hasForm = !!($scopedSlots.form || isEnableConf(this.formConfig))
const hasToolbar = !!($scopedSlots.toolbar || isEnableConf(this.toolbarConfig) || this.toolbar)
const hasPager = !!($scopedSlots.pager || isEnableConf(this.pagerConfig))
return h('div', {
class: ['vxe-grid', {
[`size--${vSize}`]: vSize,
'is--animat': !!this.animat,
'is--round': this.round,
'is--maximize': isZMax,
'is--loading': this.loading || this.tableLoading
}],
style: this.renderStyle
}, [
/**
* 渲染表单
*/
hasForm ? h('div', {
ref: 'formWrapper',
class: 'vxe-grid--form-wrapper'
}, $scopedSlots.form
? $scopedSlots.form.call(this, { $grid: this }, h)
: renderDefaultForm(h, this)
) : null,
/**
* 渲染工具栏
*/
hasToolbar ? h('div', {
ref: 'toolbarWrapper',
class: 'vxe-grid--toolbar-wrapper'
}, $scopedSlots.toolbar
? $scopedSlots.toolbar.call(this, { $grid: this }, h)
: [
h('vxe-toolbar', {
props: this.toolbarOpts,
ref: 'xToolbar',
scopedSlots: getToolbarSlots(this)
})
]
) : null,
/**
* 渲染表格顶部区域
*/
$scopedSlots.top ? h('div', {
ref: 'topWrapper',
class: 'vxe-grid--top-wrapper'
}, $scopedSlots.top.call(this, { $grid: this }, h)) : null,
/**
* 渲染表格
*/
h('vxe-table', {
props: this.tableProps,
on: getTableOns(this),
scopedSlots: $scopedSlots,
ref: 'xTable'
}),
/**
* 渲染表格底部区域
*/
$scopedSlots.bottom ? h('div', {
ref: 'bottomWrapper',
class: 'vxe-grid--bottom-wrapper'
}, $scopedSlots.bottom.call(this, { $grid: this }, h)) : null,
/**
* 渲染分页
*/
hasPager ? h('div', {
ref: 'pagerWrapper',
class: 'vxe-grid--pager-wrapper'
}, $scopedSlots.pager
? $scopedSlots.pager.call(this, { $grid: this }, h)
: [
h('vxe-pager', {
props: { ...this.pagerOpts, ...(this.proxyConfig ? this.tablePage : {}) },
on: {
'page-change': this.pageChangeEvent
},
scopedSlots: getPagerSlots(this)
})
]
) : null
])
},
methods: {
...methods,
callSlot (slotFunc, params, h, vNodes) {
if (slotFunc) {
const { $scopedSlots } = this
if (XEUtils.isString(slotFunc)) {
slotFunc = $scopedSlots[slotFunc] || null
}
if (XEUtils.isFunction(slotFunc)) {
return getSlotVNs(slotFunc.call(this, params, h, vNodes))
}
}
return []
},
getParentHeight () {
const { $el, isZMax } = this
return (isZMax ? DomTools.getDomNode().visibleHeight : XEUtils.toNumber(getComputedStyle($el.parentNode).height)) - this.getExcludeHeight()
},
/**
* 获取需要排除的高度
*/
getExcludeHeight () {
const { $refs, $el, isZMax, height } = this
const { formWrapper, toolbarWrapper, topWrapper, bottomWrapper, pagerWrapper } = $refs
const parentPaddingSize = isZMax || height !== 'auto' ? 0 : getPaddingTopBottomSize($el.parentNode)
return parentPaddingSize + getPaddingTopBottomSize($el) + getOffsetHeight(formWrapper) + getOffsetHeight(toolbarWrapper) + getOffsetHeight(topWrapper) + getOffsetHeight(bottomWrapper) + getOffsetHeight(pagerWrapper)
},
handleRowClassName (params) {
const rowClassName = this.rowClassName
const clss = []
if (this.pendingRecords.some(item => item === params.row)) {
clss.push('row--pending')
}
clss.push(rowClassName ? (XEUtils.isFunction(rowClassName) ? rowClassName(params) : rowClassName) : '')
return clss
},
handleBeforeEditMethod (params) {
const { editConfig } = this
const beforeEditMethod = editConfig ? (editConfig.beforeEditMethod || editConfig.activeMethod) : null
if (this.pendingRecords.indexOf(params.row) === -1) {
return !beforeEditMethod || beforeEditMethod({ ...params, $grid: this })
}
return false
},
initToolbar () {
this.$nextTick(() => {
const { xTable, xToolbar } = this.$refs
if (xTable && xToolbar) {
xTable.connect(xToolbar)
}
})
},
initPages () {
const { tablePage, pagerConfig, pagerOpts } = this
const { currentPage, pageSize } = pagerOpts
if (pagerConfig) {
if (currentPage) {
tablePage.currentPage = currentPage
}
if (pageSize) {
tablePage.pageSize = pageSize
}
}
},
initProxy () {
const { proxyInited, proxyConfig, proxyOpts, formConfig, formOpts } = this
if (proxyConfig) {
if (isEnableConf(formConfig) && proxyOpts.form && formOpts.items) {
const formData = {}
formOpts.items.forEach(item => {
const { field, itemRender } = item
if (field) {
let itemValue = null
if (itemRender) {
const { defaultValue } = itemRender
if (XEUtils.isFunction(defaultValue)) {
itemValue = defaultValue({ item })
} else if (!XEUtils.isUndefined(defaultValue)) {
itemValue = defaultValue
}
}
formData[field] = itemValue
}
})
this.formData = formData
}
if (!proxyInited && proxyOpts.autoLoad !== false) {
this.proxyInited = true
this.$nextTick().then(() => this.commitProxy('_init')).then((rest) => {
this.$emit('proxy-query', { ...rest, isInited: true, $grid: this, $event: new Event('init') })
})
}
}
},
handleGlobalKeydownEvent (evnt) {
const isEsc = evnt.keyCode === 27
if (isEsc && this.isZMax && this.zoomOpts.escRestore !== false) {
this.triggerZoomEvent(evnt)
}
},
/**
* 提交指令,支持 code 或 button
* @param {String/Object} code 字符串或对象
*/
commitProxy (proxyTarget, ...args) {
const { $refs, toolbar, toolbarConfig, toolbarOpts, proxyOpts, tablePage, pagerConfig, editRules, formData, isMsg } = this
const { beforeQuery, afterQuery, beforeDelete, afterDelete, beforeSave, afterSave, ajax = {}, props: proxyProps = {} } = proxyOpts
const $xetable = $refs.xTable
let button
let code
if (XEUtils.isString(proxyTarget)) {
const matchObj = toolbarConfig || toolbar ? XEUtils.findTree(toolbarOpts.buttons, item => item.code === proxyTarget, { children: 'dropdowns' }) : null
code = proxyTarget
button = matchObj ? matchObj.item : null
} else {
button = proxyTarget
code = button.code
}
const btnParams = button ? button.params : null
switch (code) {
case 'insert':
return this.insert()
case 'insert_actived':
return this.insert().then(({ row }) => this.setActiveRow(row))
case 'mark_cancel':
this.triggerPendingEvent(code)
break
case 'remove':
return this.handleDeleteRow(code, 'vxe.grid.removeSelectRecord', () => this.removeCheckboxRow())
case 'import':
this.importData(btnParams)
break
case 'open_import':
this.openImport(btnParams)
break
case 'export':
this.exportData(btnParams)
break
case 'open_export':
this.openExport(btnParams)
break
case 'reset_custom':
this.resetColumn(true)
break
case '_init':
case 'reload':
case 'query': {
const ajaxMethods = ajax.query
if (ajaxMethods) {
const isInited = code === '_init'
const isReload = code === 'reload'
let sortList = []
let filterList = []
let pageParams = {}
if (pagerConfig) {
if (isInited || isReload) {
tablePage.currentPage = 1
}
if (isEnableConf(pagerConfig)) {
pageParams = { ...tablePage }
}
}
if (isInited) {
const { sortOpts } = $xetable
let defaultSort = sortOpts.defaultSort
// 如果使用默认排序
if (defaultSort) {
if (!XEUtils.isArray(defaultSort)) {
defaultSort = [defaultSort]
}
sortList = defaultSort.map((item) => {
return {
field: item.field,
property: item.field,
order: item.order
}
})
}
filterList = $xetable.getCheckedFilters()
} else {
if (isReload) {
this.pendingRecords = []
$xetable.clearAll()
} else {
sortList = $xetable.getSortColumns()
filterList = $xetable.getCheckedFilters()
}
}
const params = {
code,
button,
isInited,
isReload,
$grid: this,
page: pageParams,
sort: sortList.length ? sortList[0] : {},
sorts: sortList,
filters: filterList,
form: formData,
options: ajaxMethods
}
this.sortData = sortList
this.filterData = filterList
this.tableLoading = true
const applyArgs = [params].concat(args)
return Promise.resolve((beforeQuery || ajaxMethods)(...applyArgs))
.then(rest => {
this.tableLoading = false
if (rest) {
if (isEnableConf(pagerConfig)) {
const total = XEUtils.get(rest, proxyProps.total || 'page.total') || 0
tablePage.total = XEUtils.toNumber(total)
this.tableData = XEUtils.get(rest, proxyProps.result || 'result') || []
// 检验当前页码,不能超出当前最大页数
const pageCount = Math.max(Math.ceil(total / tablePage.pageSize), 1)
if (tablePage.currentPage > pageCount) {
tablePage.currentPage = pageCount
}
} else {
this.tableData = (proxyProps.list ? XEUtils.get(rest, proxyProps.list) : rest) || []
}
} else {
this.tableData = []
}
if (afterQuery) {
afterQuery(...applyArgs)
}
return { status: true }
}).catch(() => {
this.tableLoading = false
return { status: false }
})
} else {
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
errLog('vxe.error.notFunc', ['proxy-config.ajax.query'])
}
}
break
}
case 'delete': {
const ajaxMethods = ajax.delete
if (ajaxMethods) {
const selectRecords = $xetable.getCheckboxRecords()
const removeRecords = selectRecords.filter(row => !$xetable.isInsertByRow(row))
const body = { removeRecords }
const applyArgs = [{ $grid: this, code, button, body, options: ajaxMethods }].concat(args)
if (selectRecords.length) {
return this.handleDeleteRow(code, 'vxe.grid.deleteSelectRecord', () => {
if (!removeRecords.length) {
return $xetable.remove(selectRecords)
}
this.tableLoading = true
return Promise.resolve((beforeDelete || ajaxMethods)(...applyArgs))
.then(rest => {
this.tableLoading = false
this.pendingRecords = this.pendingRecords.filter(row => removeRecords.indexOf(row) === -1)
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ content: this.getRespMsg(rest, 'vxe.grid.delSuccess'), status: 'success' })
}
if (afterDelete) {
afterDelete(...applyArgs)
} else {
this.commitProxy('query')
}
return { status: true }
})
.catch(rest => {
this.tableLoading = false
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ id: code, content: this.getRespMsg(rest, 'vxe.grid.operError'), status: 'error' })
}
return { status: false }
})
})
} else {
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ id: code, content: GlobalConfig.i18n('vxe.grid.selectOneRecord'), status: 'warning' })
}
}
} else {
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
errLog('vxe.error.notFunc', ['proxy-config.ajax.delete'])
}
}
break
}
case 'save': {
const ajaxMethods = ajax.save
if (ajaxMethods) {
const body = Object.assign({ pendingRecords: this.pendingRecords }, this.getRecordset())
const { insertRecords, removeRecords, updateRecords, pendingRecords } = body
const applyArgs = [{ $grid: this, code, button, body, options: ajaxMethods }].concat(args)
// 排除掉新增且标记为删除的数据
if (insertRecords.length) {
body.pendingRecords = pendingRecords.filter(row => insertRecords.indexOf(row) === -1)
}
// 排除已标记为删除的数据
if (pendingRecords.length) {
body.insertRecords = insertRecords.filter(row => pendingRecords.indexOf(row) === -1)
}
let restPromise = Promise.resolve()
if (editRules) {
// 只校验新增和修改的数据
restPromise = this.validate(body.insertRecords.concat(updateRecords))
}
return restPromise.then((errMap) => {
if (errMap) {
// 如果校验不通过
return
}
if (body.insertRecords.length || removeRecords.length || updateRecords.length || body.pendingRecords.length) {
this.tableLoading = true
return Promise.resolve((beforeSave || ajaxMethods)(...applyArgs))
.then(rest => {
this.tableLoading = false
this.pendingRecords = []
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ content: this.getRespMsg(rest, 'vxe.grid.saveSuccess'), status: 'success' })
}
if (afterSave) {
afterSave(...applyArgs)
} else {
this.commitProxy('query')
}
return { status: true }
})
.catch(rest => {
this.tableLoading = false
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ id: code, content: this.getRespMsg(rest, 'vxe.grid.operError'), status: 'error' })
}
return { status: false }
})
} else {
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ id: code, content: GlobalConfig.i18n('vxe.grid.dataUnchanged'), status: 'info' })
}
}
})
} else {
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
errLog('vxe.error.notFunc', ['proxy-config.ajax.save'])
}
}
break
}
default: {
const btnMethod = VXETable.commands.get(code)
if (btnMethod) {
btnMethod({ code, button, $grid: this, $table: $xetable }, ...args)
}
}
}
return this.$nextTick()
},
getRespMsg (rest, defaultMsg) {
const { props: proxyProps = {} } = this.proxyOpts
let msg
if (rest && proxyProps.message) {
msg = XEUtils.get(rest, proxyProps.message)
}
return msg || GlobalConfig.i18n(defaultMsg)
},
handleDeleteRow (code, alertKey, callback) {
const selectRecords = this.getCheckboxRecords()
if (this.isMsg) {
if (selectRecords.length) {
return VXETable.modal.confirm({ id: `cfm_${code}`, content: GlobalConfig.i18n(alertKey), escClosable: true }).then(type => {
if (type === 'confirm') {
return callback()
}
})
} else {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ id: `msg_${code}`, content: GlobalConfig.i18n('vxe.grid.selectOneRecord'), status: 'warning' })
}
} else {
if (selectRecords.length) {
callback()
}
}
return Promise.resolve()
},
getFormItems (itemIndex) {
const { formConfig, formOpts } = this
const itemList = []
XEUtils.eachTree(isEnableConf(formConfig) && formOpts.items ? formOpts.items : [], item => {
itemList.push(item)
}, { children: 'children' })
return XEUtils.isUndefined(itemIndex) ? itemList : itemList[itemIndex]
},
getPendingRecords () {
return this.pendingRecords
},
triggerToolbarCommitEvent (params, evnt) {
const { code } = params
return this.commitProxy(params, evnt).then((rest) => {
if (code && rest && rest.status && ['query', 'reload', 'delete', 'save'].includes(code)) {
this.$emit(code === 'delete' || code === 'save' ? `proxy-${code}` : 'proxy-query', { ...rest, isReload: code === 'reload', $grid: this, $event: evnt })
}
})
},
triggerToolbarBtnEvent (button, evnt) {
this.triggerToolbarCommitEvent(button, evnt)
this.$emit('toolbar-button-click', { code: button.code, button, $grid: this, $event: evnt })
},
triggerToolbarTolEvent (tool, evnt) {
this.triggerToolbarCommitEvent(tool, evnt)
this.$emit('toolbar-tool-click', { code: tool.code, tool, $grid: this, $event: evnt })
},
triggerPendingEvent (code) {
const { pendingRecords, isMsg } = this
const selectRecords = this.getCheckboxRecords()
if (selectRecords.length) {
const plus = []
const minus = []
selectRecords.forEach(data => {
if (pendingRecords.some(item => data === item)) {
minus.push(data)
} else {
plus.push(data)
}
})
if (minus.length) {
this.pendingRecords = pendingRecords.filter(item => minus.indexOf(item) === -1).concat(plus)
} else if (plus.length) {
this.pendingRecords = pendingRecords.concat(plus)
}
this.clearCheckboxRow()
} else {
if (isMsg) {
// 检测弹窗模块
if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') {
if (!VXETable.modal) {
errLog('vxe.error.reqModule', ['Modal'])
}
}
VXETable.modal.message({ id: code, content: GlobalConfig.i18n('vxe.grid.selectOneRecord'), status: 'warning' })
}
}
},
pageChangeEvent (params) {
const { proxyConfig, tablePage } = this
const { currentPage, pageSize } = params
tablePage.currentPage = currentPage
tablePage.pageSize = pageSize
this.$emit('page-change', Object.assign({ $grid: this }, params))
if (proxyConfig) {
this.commitProxy('query').then((rest) => {
this.$emit('proxy-query', { ...rest, $grid: this, $event: params.$event })
})
}
},
sortChangeEvent (params) {
const { $table, column, sortList } = params
const isRemote = XEUtils.isBoolean(column.remoteSort) ? column.remoteSort : $table.sortOpts.remote
// 如果是服务端排序
if (isRemote) {
this.sortData = sortList
if (this.proxyConfig) {
this.tablePage.currentPage = 1
this.commitProxy('query').then((rest) => {
this.$emit('proxy-query', { ...rest, $grid: this, $event: params.$event })
})
}
}
this.$emit('sort-change', Object.assign({ $grid: this }, params))
},
filterChangeEvent (params) {
const { $table, filterList } = params
// 如果是服务端过滤
if ($table.filterOpts.remote) {
this.filterData = filterList
if (this.proxyConfig) {
this.tablePage.currentPage = 1
this.commitProxy('query').then((rest) => {
this.$emit('proxy-query', { ...rest, $grid: this, $event: params.$event })
})
}
}
this.$emit('filter-change', Object.assign({ $grid: this }, params))
},
submitEvent (params) {
const { proxyConfig } = this
if (proxyConfig) {
this.commitProxy('reload').then((rest) => {
this.$emit('proxy-query', { ...rest, isReload: true, $grid: this, $event: params.$event })
})
}
this.$emit('form-submit', Object.assign({ $grid: this }, params))
},
resetEvent (params) {
const { proxyConfig } = this
if (proxyConfig) {
this.commitProxy('reload').then((rest) => {
this.$emit('proxy-query', { ...rest, isReload: true, $grid: this, $event: params.$event })
})
}
this.$emit('form-reset', Object.assign({ $grid: this }, params))
},
submitInvalidEvent (params) {
this.$emit('form-submit-invalid', Object.assign({ $grid: this }, params))
},
collapseEvent (params) {
this.$nextTick(() => this.recalculate(true))
this.$emit('form-toggle-collapse', Object.assign({ $grid: this }, params))
this.$emit('form-collapse', Object.assign({ $grid: this }, params))
},
triggerZoomEvent (evnt) {
this.zoom()
this.$emit('zoom', { $grid: this, type: this.isZMax ? 'max' : 'revert', $event: evnt })
},
zoom () {
return this[this.isZMax ? 'revert' : 'maximize']()
},
isMaximized () {
return this.isZMax
},
maximize () {
return this.handleZoom(true)
},
revert () {
return this.handleZoom()
},
handleZoom (isMax) {
const { isZMax } = this
if (isMax ? !isZMax : isZMax) {
this.isZMax = !isZMax
if (this.tZindex < UtilTools.getLastZIndex()) {
this.tZindex = UtilTools.nextZIndex()
}
}
return this.$nextTick().then(() => this.recalculate(true)).then(() => this.isZMax)
},
getProxyInfo () {
const { sortData, proxyConfig } = this
if (proxyConfig) {
return {
data: this.tableData,
filter: this.filterData,
form: this.formData,
sort: sortData.length ? sortData[0] : {},
sorts: sortData,
pager: this.tablePage,
pendingRecords: this.pendingRecords
}
}
return null
},
// 检查插槽
...(process.env.VUE_APP_VXE_TABLE_ENV === 'development' ? {
loadColumn (columns) {
const { $scopedSlots } = this
XEUtils.eachTree(columns, column => {
if (column.slots) {
XEUtils.each(column.slots, (func) => {
if (!XEUtils.isFunction(func)) {
if (!$scopedSlots[func]) {
errLog('vxe.error.notSlot', [func])
}
}
})
}
})
return this.$refs.xTable.loadColumn(columns)
},
reloadColumn (columns) {
this.clearAll()
return this.loadColumn(columns)
}
} : null)
}
}