You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
6.7 KiB
269 lines
6.7 KiB
import T from "ant-design-vue/es/table/Table"; |
|
import get from "lodash.get" |
|
export default { |
|
data() { |
|
return { |
|
needTotalList: [], |
|
|
|
selectedRows: [], |
|
selectedRowKeys: [], |
|
|
|
localLoading: false, |
|
localDataSource: [], |
|
localPagination: Object.assign({}, T.props.pagination) |
|
}; |
|
}, |
|
props: Object.assign({}, T.props, { |
|
rowKey: { |
|
type: [String, Function], |
|
default: 'id' |
|
}, |
|
data: { |
|
type: Function, |
|
required: true |
|
}, |
|
pageNum: { |
|
type: Number, |
|
default: 1 |
|
}, |
|
pageSize: { |
|
type: Number, |
|
default: 10 |
|
}, |
|
showSizeChanger: { |
|
type: Boolean, |
|
default: true |
|
}, |
|
showAlertInfo: { |
|
type: Boolean, |
|
default: false |
|
}, |
|
showPagination: { |
|
default: 'auto' |
|
} |
|
}), |
|
watch: { |
|
'localPagination.current'(val) { |
|
this.$router.push({ |
|
name: this.$route.name, |
|
params: Object.assign({}, this.$route.params, { |
|
pageNo: val |
|
}), |
|
}); |
|
}, |
|
pageNum(val) { |
|
Object.assign(this.localPagination, { |
|
current: val |
|
}); |
|
}, |
|
pageSize(val) { |
|
console.log('pageSize:', val) |
|
Object.assign(this.localPagination, { |
|
pageSize: val |
|
}); |
|
}, |
|
showSizeChanger(val) { |
|
console.log('showSizeChanger', val) |
|
Object.assign(this.localPagination, { |
|
showSizeChanger: val |
|
}); |
|
} |
|
}, |
|
created() { |
|
this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, { |
|
current: this.pageNum, |
|
pageSize: this.pageSize, |
|
showSizeChanger: this.showSizeChanger |
|
}); |
|
this.needTotalList = this.initTotalList(this.columns) |
|
this.loadData(); |
|
}, |
|
methods: { |
|
refresh() { |
|
this.loadData(); |
|
}, |
|
loadData(pagination, filters, sorter) { |
|
|
|
this.localLoading = true |
|
var result = this.data( |
|
Object.assign({ |
|
pageNo: (pagination && pagination.current) || |
|
this.localPagination.current, |
|
pageSize: (pagination && pagination.pageSize) || |
|
this.localPagination.pageSize |
|
}, |
|
(sorter && sorter.field && { |
|
sortField: sorter.field |
|
}) || {}, |
|
(sorter && sorter.order && { |
|
sortOrder: sorter.order |
|
}) || {}, { |
|
...filters |
|
} |
|
) |
|
); |
|
|
|
if (result instanceof Promise) { |
|
result.then(r => { |
|
this.localPagination = Object.assign({}, this.localPagination, { |
|
current: r.pageNo, // 返回结果中的当前分页数 |
|
total: r.totalCount, // 返回结果中的总记录数 |
|
showSizeChanger: this.showSizeChanger, |
|
pageSize: (pagination && pagination.pageSize) || |
|
this.localPagination.pageSize |
|
}); |
|
//update--begin--autor:wangshuai-----date:20200724------for:判断showPagination是否为false------ |
|
(!this.showPagination || !r.totalCount && this.showPagination === 'auto') && (this.localPagination = false) |
|
//update--end--autor:wangshuai-----date:20200724------for:判断showPagination是否为false----- |
|
this.localDataSource = r.data; // 返回结果中的数组数据 |
|
this.localLoading = false |
|
}); |
|
} |
|
}, |
|
initTotalList(columns) { |
|
const totalList = [] |
|
columns && columns instanceof Array && columns.forEach(column => { |
|
if (column.needTotal) { |
|
totalList.push({ ...column, |
|
total: 0 |
|
}) |
|
} |
|
}) |
|
return totalList |
|
}, |
|
updateSelect(selectedRowKeys, selectedRows) { |
|
this.selectedRowKeys = selectedRowKeys |
|
this.selectedRows = selectedRows |
|
let list = this.needTotalList |
|
this.needTotalList = list.map(item => { |
|
return { |
|
...item, |
|
total: selectedRows.reduce((sum, val) => { |
|
let total = sum + get(val, item.dataIndex) |
|
return isNaN(total) ? 0 : total |
|
}, 0) |
|
} |
|
}) |
|
// this.$emit('change', selectedRowKeys, selectedRows) |
|
}, |
|
updateEdit() { |
|
this.selectedRows = [] |
|
}, |
|
onClearSelected() { |
|
// 【TESTA-262】页面清空后还能才做所选行,增加 this.$emit('clearAll') |
|
this.selectedRowKeys = [] |
|
this.selectedRows = [] |
|
this.updateSelect([], []) |
|
this.$emit('clearAll') |
|
}, |
|
renderMsg(h) { |
|
const _vm = this |
|
let d = [] |
|
// 构建 已选择 |
|
d.push( |
|
h('span', { |
|
style: { |
|
marginRight: '12px' |
|
} |
|
}, ['已选择 ', h('a', { |
|
style: { |
|
fontWeight: 600 |
|
} |
|
}, this.selectedRows.length)]) |
|
); |
|
|
|
// 构建 列统计 |
|
this.needTotalList.map(item => { |
|
d.push(h('span', { |
|
style: { |
|
marginRight: '12px' |
|
} |
|
}, |
|
[ |
|
`${ item.title }总计 `, |
|
h('a', { |
|
style: { |
|
fontWeight: 600 |
|
} |
|
}, `${ !item.customRender ? item.total : item.customRender(item.total) }`) |
|
])) |
|
}); |
|
|
|
// 构建 清空选择 |
|
d.push(h('a', { |
|
style: { |
|
marginLeft: '24px' |
|
}, |
|
on: { |
|
click: _vm.onClearSelected |
|
} |
|
}, '清空')) |
|
|
|
return d |
|
}, |
|
renderAlert(h) { |
|
return h('span', { |
|
slot: 'message' |
|
}, this.renderMsg(h)) |
|
}, |
|
}, |
|
|
|
render(h) { |
|
const _vm = this |
|
|
|
let props = {}, |
|
localKeys = Object.keys(this.$data); |
|
|
|
Object.keys(T.props).forEach(k => { |
|
let localKey = `local${k.substring(0,1).toUpperCase()}${k.substring(1)}`; |
|
if (localKeys.includes(localKey)) { |
|
return props[k] = _vm[localKey]; |
|
} |
|
return props[k] = _vm[k]; |
|
}) |
|
|
|
|
|
// 显示信息提示 |
|
if (this.showAlertInfo) { |
|
|
|
props.rowSelection = { |
|
selectedRowKeys: this.selectedRowKeys, |
|
onChange: (selectedRowKeys, selectedRows) => { |
|
_vm.updateSelect(selectedRowKeys, selectedRows) |
|
_vm.$emit('onSelect', { selectedRowKeys: selectedRowKeys, selectedRows: selectedRows }) |
|
} |
|
}; |
|
|
|
return h('div', {}, [ |
|
h("a-alert", { |
|
style: { |
|
marginBottom: '16px' |
|
}, |
|
props: { |
|
type: 'info', |
|
showIcon: true |
|
} |
|
}, [_vm.renderAlert(h)]), |
|
h("a-table", { |
|
tag: "component", |
|
attrs: props, |
|
on: { |
|
change: _vm.loadData |
|
}, |
|
scopedSlots: this.$scopedSlots |
|
}, this.$slots.default) |
|
]); |
|
|
|
} |
|
|
|
return h("a-table", { |
|
tag: "component", |
|
attrs: props, |
|
on: { |
|
change: _vm.loadData |
|
}, |
|
scopedSlots: this.$scopedSlots |
|
}, this.$slots.default); |
|
|
|
} |
|
}; |