import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Button, Modal, Empty, notification } from 'antd'
|
|
import Utils from '@/utils/utils.js'
|
import zhCN from '@/locales/zh-CN/model.js'
|
import enUS from '@/locales/en-US/model.js'
|
import EditCard from './editcard'
|
|
import './index.scss'
|
|
class FieldsComponent extends Component {
|
static propTpyes = {
|
type: PropTypes.string, // 搜索条件添加、显示列添加
|
config: PropTypes.object, // 容器Id
|
tableFields: PropTypes.string, // 已选表字段集
|
updatefield: PropTypes.func
|
}
|
|
state = {
|
dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
|
fields: [], // 字段集
|
tableVisible: false, // 模态框控制
|
}
|
|
queryField = () => {
|
const { type, config, tableFields } = this.props
|
// 判断是否已选择表名
|
if (!tableFields || tableFields.length === 0) {
|
notification.warning({
|
top: 92,
|
message: '请选择表名!',
|
duration: 5
|
})
|
return
|
}
|
|
// 表字段集转为map数据
|
let columns = new Map()
|
tableFields.forEach(table => {
|
table.columns.forEach(column => {
|
columns.set(column.field, column)
|
})
|
})
|
|
if (type === 'search') {
|
// 添加搜索条件,字段集中存在搜索条件字段,使用搜索条件对象替换字段集,设置数据类型
|
config.search.forEach(item => {
|
if (columns.has(item.field)) {
|
let _datatype = columns.get(item.field).datatype
|
columns.set(item.field, {...item, selected: true, datatype: _datatype})
|
}
|
})
|
} else if (type === 'columns') {
|
// 添加显示列,字段集中存在显示列字段,使用显示列对象替换字段集,设置数据类型
|
config.columns.forEach(item => {
|
if (columns.has(item.field)) {
|
let _datatype = columns.get(item.field).datatype
|
columns.set(item.field, {...item, selected: true, datatype: _datatype})
|
}
|
})
|
} else if (type === 'fields') {
|
config.columns.forEach(item => {
|
if (columns.has(item.field)) {
|
let _datatype = columns.get(item.field).datatype
|
columns.set(item.field, {...item, selected: true, datatype: _datatype})
|
}
|
})
|
} else if (type === 'form') {
|
if (config.groups.length > 1) {
|
config.groups.forEach(group => {
|
group.sublist.forEach(item => {
|
if (columns.has(item.field)) {
|
let _datatype = columns.get(item.field).datatype
|
columns.set(item.field, {...item, selected: true, datatype: _datatype})
|
}
|
})
|
})
|
} else {
|
config.fields.forEach(item => {
|
if (columns.has(item.field)) {
|
let _datatype = columns.get(item.field).datatype
|
columns.set(item.field, {...item, selected: true, datatype: _datatype})
|
}
|
})
|
}
|
}
|
|
// 显示字段集弹窗
|
this.setState({
|
tableVisible: true,
|
fields: [...columns.values()]
|
})
|
}
|
|
addFieldSubmit = () => {
|
const { type } = this.props
|
// 字段集为空,关闭弹窗
|
if (!this.state.fields || this.state.fields.length === 0) {
|
this.setState({
|
tableVisible: false
|
})
|
}
|
|
let config = fromJS(this.props.config).toJS()
|
|
// 获取已选字段集合
|
let cards = this.refs.searchcard.state.selectCards
|
let columnsMap = new Map()
|
cards.forEach(card => {
|
columnsMap.set(card.field, card)
|
})
|
|
let items = []
|
if (type === 'search') {
|
config.search.forEach(item => {
|
if (columnsMap.has(item.field)) {
|
let cell = columnsMap.get(item.field)
|
|
if (cell.selected && cell.type === item.type) { // 数据未修改
|
items.push(item)
|
} else if (cell.selected) { // 数据类型修改
|
if (cell.type === 'select') {
|
item.match = '='
|
} else if (cell.type === 'daterange') {
|
item.match = 'between'
|
} else {
|
cell.type = 'text'
|
item.match = 'like'
|
}
|
|
item.type = cell.type
|
item.initval = ''
|
items.push(item)
|
}
|
columnsMap.delete(item.field)
|
} else if (!item.origin) {
|
items.push(item)
|
}
|
})
|
|
let _columns = [...columnsMap.values()]
|
|
_columns.forEach(item => {
|
if (item.selected) {
|
let _match = ''
|
if (item.type === 'select') {
|
_match = '='
|
} else if (item.type === 'daterange') {
|
_match = 'between'
|
} else {
|
item.type = 'text'
|
_match = 'like'
|
}
|
|
let newcard = {
|
uuid: Utils.getuuid(),
|
label: item.label,
|
field: item.field,
|
initval: '',
|
type: item.type,
|
resourceType: '0',
|
setAll: 'false',
|
options: [],
|
orderType: 'asc',
|
match: _match,
|
display: 'dropdown'
|
}
|
|
items.push(newcard)
|
}
|
})
|
config.search = items
|
} else if (type === 'columns') {
|
config.columns.forEach(item => {
|
if (columnsMap.has(item.field)) {
|
let cell = columnsMap.get(item.field)
|
|
if (cell.selected) {
|
items.push(item)
|
}
|
columnsMap.delete(item.field)
|
} else if (!item.origin) {
|
items.push(item)
|
}
|
})
|
|
let _columns = [...columnsMap.values()]
|
|
_columns.forEach(item => {
|
if (item.selected) {
|
let newcard = {
|
uuid: Utils.getuuid(),
|
Align: 'left',
|
label: item.label,
|
field: item.field,
|
Hide: 'false',
|
IsSort: item.type === 'picture' ? 'false' : 'true',
|
type: item.type,
|
Width: 120
|
}
|
|
if (item.type === 'number') {
|
newcard.decimal = item.decimal
|
} else {
|
newcard.fieldlength = item.length || 50
|
}
|
|
items.push(newcard)
|
}
|
})
|
config.columns = items
|
} else if (type === 'fields') {
|
config.columns.forEach(item => {
|
if (columnsMap.has(item.field)) {
|
let cell = columnsMap.get(item.field)
|
|
if (cell.selected) {
|
items.push(item)
|
}
|
columnsMap.delete(item.field)
|
} else {
|
items.push(item)
|
}
|
})
|
|
let _columns = [...columnsMap.values()]
|
|
_columns.forEach(item => {
|
if (item.selected) {
|
let newcard = {
|
uuid: Utils.getuuid(),
|
label: item.label,
|
field: item.field,
|
datatype: item.type === 'number' ? 'Decimal(18,0)' : 'Nvarchar(50)'
|
}
|
|
items.push(newcard)
|
}
|
})
|
} else if (type === 'form') {
|
if (config.groups.length > 1) {
|
config.groups.forEach(group => {
|
group.sublist.forEach(item => {
|
if (columnsMap.has(item.field)) {
|
let cell = columnsMap.get(item.field)
|
|
if (cell.selected && cell.type === item.type) { // 数据选择状态及类型未修改时,直接添加
|
items.push(item)
|
} else if (cell.selected) { // 数据类型修改时,重置类型及初始值
|
item.type = cell.type
|
item.initval = ''
|
items.push(item)
|
}
|
columnsMap.delete(item.field)
|
} else if (!item.origin) { // 过滤示例项
|
items.push(item)
|
}
|
})
|
group.sublist = items
|
})
|
|
let _columns = [...columnsMap.values()]
|
|
let _additems = _columns.map(item => { // 循环添加新增字段
|
return {
|
uuid: Utils.getuuid(),
|
label: item.label,
|
field: item.field,
|
initval: '',
|
type: item.type,
|
resourceType: '0',
|
setAll: 'false',
|
options: [],
|
dataSource: '',
|
orderType: 'asc',
|
decimal: item.decimal,
|
readonly: 'false',
|
required: 'true'
|
}
|
})
|
config.groups[config.groups.length - 1].sublist = [...config.groups.slice(-1)[0].sublist, ..._additems]
|
} else {
|
config.fields.forEach(item => {
|
if (columnsMap.has(item.field)) {
|
let cell = columnsMap.get(item.field)
|
|
if (cell.selected && cell.type === item.type) { // 数据选择状态及类型未修改时,直接添加
|
items.push(item)
|
} else if (cell.selected) { // 数据类型修改时,重置类型及初始值
|
item.type = cell.type
|
item.initval = ''
|
items.push(item)
|
}
|
columnsMap.delete(item.field)
|
} else if (!item.origin) { // 过滤示例项
|
items.push(item)
|
}
|
})
|
|
let _columns = [...columnsMap.values()]
|
|
_columns.forEach(item => { // 循环添加新增字段
|
if (item.selected) {
|
let newcard = {
|
uuid: Utils.getuuid(),
|
label: item.label,
|
field: item.field,
|
initval: '',
|
type: item.type,
|
resourceType: '0',
|
setAll: 'false',
|
options: [],
|
dataSource: '',
|
decimal: item.decimal,
|
orderType: 'asc',
|
readonly: 'false',
|
required: 'true'
|
}
|
|
items.push(newcard)
|
}
|
})
|
|
config.fields = items
|
}
|
}
|
|
if (type === 'search' || type === 'columns' || type === 'form') {
|
this.props.updatefield(config)
|
|
notification.success({
|
top: 92,
|
message: '操作成功',
|
duration: 2
|
})
|
} else if (type === 'fields') {
|
this.props.updatefield(items)
|
|
notification.success({
|
top: 92,
|
message: '操作成功',
|
duration: 2
|
})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
/**
|
* @description 组件销毁,清除state更新
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
}
|
|
render() {
|
const { type } = this.props
|
const { dict, fields } = this.state
|
|
return (
|
<div className="quickly-add">
|
<Button type="primary" block onClick={this.queryField}>{dict['model.batchAdd']}</Button>
|
{/* 根据字段名添加显示列及搜索条件 */}
|
<Modal
|
wrapClassName="model-table-fieldmanage-modal"
|
title={dict['model.edit']}
|
visible={this.state.tableVisible}
|
width={'65vw'}
|
maskClosable={false}
|
style={{minWidth: '900px', maxWidth: '1200px'}}
|
cancelText={dict['model.close']}
|
onOk={this.addFieldSubmit}
|
onCancel={() => { // 取消添加
|
this.setState({
|
tableVisible: false
|
})
|
}}
|
destroyOnClose
|
>
|
{fields.length > 0 ?
|
<EditCard data={fields} ref="searchcard" type={type} dict={dict} /> : null
|
}
|
{(!fields || fields.length === 0) &&
|
<Empty />
|
}
|
</Modal>
|
</div>
|
)
|
}
|
}
|
|
export default FieldsComponent
|