import React, {Component} from 'react'
|
import { is, fromJS } from 'immutable'
|
import { Row, Col, Radio, Input, Button } from 'antd'
|
import { CheckOutlined } from '@ant-design/icons'
|
import './index.scss'
|
|
const { Search } = Input
|
|
class EditCardCell extends Component {
|
constructor(props) {
|
super(props)
|
|
let _type = props.card.type
|
|
if (!props.card.origin) {
|
if (props.type === 'columns') {
|
if (_type !== 'number') {
|
_type = 'text'
|
}
|
} else if (props.type === 'search') {
|
if (_type === 'date' || _type === 'datetime') {
|
_type = 'date'
|
} else if (_type !== 'select') {
|
_type = 'text'
|
}
|
} else if (props.type === 'form') {
|
if (_type === 'datetime' || _type === 'date') {
|
_type = 'date'
|
} else if (_type !== 'number') {
|
_type = 'text'
|
}
|
}
|
}
|
|
this.state = {
|
card: {...props.card, type: _type},
|
type: props.type
|
}
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
const { card } = this.state
|
|
if (nextProps.card.origin !== card.origin) {
|
this.setState({
|
card: {...card, origin: nextProps.card.origin}
|
})
|
}
|
}
|
|
changeSelect = () => {
|
const { card } = this.state
|
|
if (card.origin) return
|
|
this.setState({
|
card: {...card, selected: !card.selected}
|
}, () => {
|
this.props.changeCard(this.state.card)
|
})
|
}
|
|
changeType = (e) => {
|
const { card } = this.state
|
|
if (card.origin) return
|
|
this.setState({
|
card: {...card, type: e.target.value}
|
}, () => {
|
this.props.changeCard(this.state.card, 'update')
|
})
|
}
|
|
render() {
|
const { card, type } = this.state
|
return (
|
<div className={'ant-card ant-card-bordered ' + (card.selected ? 'selected' : '') + (card.origin ? ' fixed' : '')} >
|
<div className="base" onClick={this.changeSelect}>
|
<CheckOutlined />
|
<p title={card.field}>字段: <span>{card.field}</span></p>
|
<p title={card.label}>名称: <span>{card.label}</span></p>
|
</div>
|
{type === 'search' ?
|
<Radio.Group onChange={this.changeType} value={card.type} disabled={!card.selected || card.origin}>
|
<Radio value="text">text</Radio>
|
<Radio value="select">select</Radio>
|
<Radio value="date">date</Radio>
|
</Radio.Group> : null
|
}
|
{type === 'columns' ?
|
<Radio.Group onChange={this.changeType} value={card.type} disabled={!card.selected || card.origin}>
|
<Radio value="text">text</Radio>
|
<Radio value="number">number</Radio>
|
</Radio.Group> : null
|
}
|
{type === 'form' ?
|
<Radio.Group onChange={this.changeType} value={card.type} disabled={!card.selected || card.origin}>
|
<Radio value="text">text</Radio>
|
<Radio value="number">number</Radio>
|
<Radio value="select">select</Radio>
|
<Radio value="date">date</Radio>
|
</Radio.Group> : null
|
}
|
</div>
|
)
|
}
|
}
|
|
class EditCard extends Component {
|
constructor(props) {
|
super(props)
|
|
this.state = {
|
selectCards: [],
|
type: props.type,
|
searchKey: '',
|
}
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
const { data } = this.props
|
|
if (!is(fromJS(nextProps.data), fromJS(data))) {
|
this.setState({selectCards: []})
|
}
|
}
|
|
changeCard = (item, m) => {
|
let cards = JSON.parse(JSON.stringify(this.state.selectCards))
|
|
if (m === 'update') {
|
cards = cards.map(card => {
|
if (card.field === item.field) {
|
return item
|
}
|
return card
|
})
|
} else if (!item.selected) {
|
cards = cards.filter(card => card.field !== item.field)
|
} else {
|
cards.push(item)
|
}
|
|
this.setState({
|
selectCards: cards
|
}, () => {
|
this.props.onChange(cards)
|
})
|
}
|
|
reset = () => {
|
this.setState({
|
searchKey: '',
|
})
|
}
|
|
render() {
|
const { data } = this.props
|
const { type } = this.state
|
|
return (
|
<div className="common-modal-edit-card">
|
<Row className="search-row">
|
<Col span={8}>
|
<Search placeholder="请输入字段" autoFocus onSearch={value => {this.setState({searchKey: value})}} enterButton />
|
</Col>
|
<Col span={8}>
|
<Button onClick={this.reset}>重置</Button>
|
</Col>
|
</Row>
|
<Row>
|
{data.map((item, index) => {
|
if (item.field.toLowerCase().indexOf(this.state.searchKey.toLowerCase()) >= 0 || item.label.indexOf(this.state.searchKey) >= 0) {
|
return (
|
<Col key={index} span={8}>
|
<EditCardCell type={type} card={item} changeCard={this.changeCard} />
|
</Col>
|
)
|
} else {
|
return ''
|
}
|
})}
|
</Row>
|
</div>
|
)
|
}
|
}
|
|
export default EditCard
|