import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { Transfer } from 'antd'
|
import { ArrowUpOutlined, ArrowDownOutlined } from '@ant-design/icons'
|
|
import './index.scss'
|
|
class TransferForm extends Component {
|
static propTypes = {
|
columns: PropTypes.array,
|
selected: PropTypes.array
|
}
|
|
state = {
|
data: [],
|
targetKeys: [],
|
selectedKeys: []
|
}
|
|
handleChange = (nextTargetKeys, direction, moveKeys) => {
|
this.setState({ targetKeys: nextTargetKeys })
|
}
|
|
handleSelectChange = (sourceSelectedKeys, targetSelectedKeys) => {
|
this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys] })
|
}
|
|
UNSAFE_componentWillMount() {
|
let datas = new Map()
|
this.props.columns.forEach(item => {
|
if (item.field && item.Hide !== 'true') {
|
datas.set(item.uuid, item)
|
}
|
})
|
|
let selecteds = []
|
|
this.props.selected.forEach(item => {
|
if (datas.has(item)) {
|
selecteds.push(item)
|
}
|
})
|
|
this.setState({
|
data: [...datas.values()].map(item => {
|
return {
|
key: item.uuid,
|
title: item.label,
|
field: item.field,
|
description: item.label + '(' + item.field + ')'
|
}
|
}),
|
targetKeys: selecteds
|
})
|
}
|
|
changeorder = (e, item, type) => {
|
const { targetKeys } = this.state
|
e.stopPropagation()
|
|
let _index = 0
|
let keys = targetKeys.filter((key, i) => {
|
if (key === item.key) {
|
_index = i
|
return false
|
} else {
|
return true
|
}
|
})
|
|
if ((_index === 0 && type === 'up') || (_index === targetKeys.length - 1 && type === 'down')) {
|
return
|
}
|
|
if (type === 'up') {
|
keys.splice(_index - 1, 0, item.key)
|
} else {
|
keys.splice(_index + 1, 0, item.key)
|
}
|
|
this.setState({
|
targetKeys: keys
|
})
|
}
|
|
getItem = (item) => {
|
const { targetKeys } = this.state
|
|
if (targetKeys.includes(item.key)) {
|
return <span title={item.description}>
|
{item.description}
|
<ArrowUpOutlined onClick={(e) => {this.changeorder(e, item, 'up')}} />
|
<ArrowDownOutlined onClick={(e) => {this.changeorder(e, item, 'down')}} />
|
</span>
|
} else {
|
return item.description
|
}
|
}
|
|
filterdata = (inputValue, option) => {
|
if (!inputValue) return true
|
|
return option.description.toLowerCase().indexOf(inputValue.toLowerCase()) > -1
|
}
|
|
render() {
|
const { targetKeys, selectedKeys } = this.state
|
|
return (
|
<div className="common-table-columns-transfer">
|
<Transfer
|
dataSource={this.state.data}
|
showSearch={this.state.data.length > 10}
|
filterOption={this.filterdata}
|
targetKeys={targetKeys}
|
selectedKeys={selectedKeys}
|
onChange={this.handleChange}
|
onSelectChange={this.handleSelectChange}
|
render={this.getItem}
|
/>
|
</div>
|
)
|
}
|
}
|
|
export default TransferForm
|