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
2 years ago
|
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);
|
||
|
|
||
|
}
|
||
|
};
|