| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Form, Row, Col, Tooltip, Select } from 'antd' |
| | | import { QuestionCircleOutlined } from '@ant-design/icons' |
| | | import { Form, Row, Col, Tooltip, Select, Radio, AutoComplete, Input, Modal } from 'antd' |
| | | import { QuestionCircleOutlined, SwapRightOutlined, DeleteOutlined } from '@ant-design/icons' |
| | | |
| | | // import './index.scss' |
| | | const { confirm } = Modal |
| | | |
| | | class SettingForm extends Component { |
| | | static propTpyes = { |
| | | tables: PropTypes.object |
| | | } |
| | | |
| | | state = {} |
| | | state = { |
| | | resource: 'custom', |
| | | reType: 'field', |
| | | records: [] |
| | | } |
| | | |
| | | componentDidMount () { |
| | | let records = localStorage.getItem('replaceRecord') |
| | | |
| | | if (records) { |
| | | records = JSON.parse(records) |
| | | |
| | | if (!Array.isArray(records)) { |
| | | localStorage.removeItem('replaceRecord') |
| | | records = [] |
| | | } |
| | | |
| | | this.setState({records}) |
| | | |
| | | let field = '' |
| | | let label = '' |
| | | records.forEach(item => { |
| | | if (item.reType !== 'field' || field) return |
| | | |
| | | field = item.value |
| | | label = item.label |
| | | }) |
| | | |
| | | this.props.form.setFieldsValue({field, label}) |
| | | } |
| | | } |
| | | |
| | | handleConfirm = () => { |
| | | const { reType } = this.state |
| | | |
| | | // 表单提交时检查输入值是否正确 |
| | | return new Promise((resolve, reject) => { |
| | | this.props.form.validateFieldsAndScroll((err, values) => { |
| | | if (!err) { |
| | | if (values.resource === 'custom') { |
| | | let records = localStorage.getItem('replaceRecord') |
| | | |
| | | if (reType === 'name') { |
| | | values.field = values.orifield |
| | | values.label = values.name |
| | | |
| | | delete values.orifield |
| | | delete values.name |
| | | } |
| | | |
| | | if (records) { |
| | | records = JSON.parse(records) |
| | | } else { |
| | | records = [] |
| | | } |
| | | |
| | | let field = values.field.toLowerCase() |
| | | records = records.filter(item => item.reType !== reType || item.value.toLowerCase() !== field) |
| | | |
| | | records.unshift({ |
| | | value: values.field, |
| | | label: values.label, |
| | | reType |
| | | }) |
| | | |
| | | this.setState({records: records}) |
| | | |
| | | localStorage.setItem('replaceRecord', JSON.stringify(records)) |
| | | } |
| | | resolve(values) |
| | | } else { |
| | | reject(err) |
| | |
| | | }) |
| | | } |
| | | |
| | | clear = () => { |
| | | let that = this |
| | | confirm({ |
| | | title: '确定清除历史记录吗?', |
| | | content: '', |
| | | onOk() { |
| | | localStorage.removeItem('replaceRecord') |
| | | that.setState({records: []}) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | | } |
| | | |
| | | complete = (key) => { |
| | | const { records, reType } = this.state |
| | | |
| | | let label = '' |
| | | records.forEach(item => { |
| | | if (item.reType === reType && key === item.value) { |
| | | label = item.label |
| | | } |
| | | }) |
| | | |
| | | if (reType === 'name') { |
| | | this.props.form.setFieldsValue({name: label}) |
| | | } else { |
| | | this.props.form.setFieldsValue({label: label}) |
| | | } |
| | | } |
| | | |
| | | render() { |
| | | const { tables } = this.props |
| | | const { getFieldDecorator } = this.props.form |
| | | const { resource, records, reType } = this.state |
| | | |
| | | const formItemLayout = { |
| | | labelCol: { |
| | |
| | | } |
| | | } |
| | | |
| | | let _fields1 = [] |
| | | let _fields2 = [] |
| | | records.forEach(item => { |
| | | if (item.reType === 'field') { |
| | | _fields1.push(item.value) |
| | | } else { |
| | | _fields2.push(item.value) |
| | | } |
| | | }) |
| | | |
| | | return ( |
| | | <Form {...formItemLayout}> |
| | | <Row gutter={24}> |
| | | <Col span={20}> |
| | | <Form.Item label="替换来源"> |
| | | {getFieldDecorator('resource', { |
| | | initialValue: 'custom' |
| | | })( |
| | | <Radio.Group onChange={(e) => {this.setState({resource: e.target.value});this.props.form.setFieldsValue({reType: 'field'})}}> |
| | | <Radio value="dict">数据字典</Radio> |
| | | <Radio value="custom">自定义</Radio> |
| | | <Radio value="langs">语言包</Radio> |
| | | </Radio.Group> |
| | | )} |
| | | </Form.Item> |
| | | </Col> |
| | | {resource !== 'langs' ? <Col span={20}> |
| | | <Form.Item label="替换依据"> |
| | | {getFieldDecorator('reType', { |
| | | initialValue: 'field' |
| | | })( |
| | | <Radio.Group onChange={(e) => this.setState({reType: e.target.value})}> |
| | | <Radio value="field">字段 <SwapRightOutlined /> 名称</Radio> |
| | | <Radio disabled={resource === 'dict'} value="name">原字段 <SwapRightOutlined /> 新字段</Radio> |
| | | </Radio.Group> |
| | | )} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'dict' ? <Col span={20}> |
| | | <Form.Item label={ |
| | | <Tooltip placement="topLeft" title="用于字段替换的表名。"> |
| | | <QuestionCircleOutlined className="mk-form-tip" /> |
| | |
| | | </Select> |
| | | )} |
| | | </Form.Item> |
| | | </Col> |
| | | </Col> : null} |
| | | {resource === 'custom' && reType === 'field' ? <Col span={20}> |
| | | <Form.Item label="字段"> |
| | | {getFieldDecorator('field', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入字段!' |
| | | } |
| | | ] |
| | | })(<AutoComplete dataSource={_fields1} onSelect={this.complete} filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} autoFocus placeholder="" />)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'custom' && reType === 'field' ? <Col span={20}> |
| | | <Form.Item label="名称"> |
| | | {getFieldDecorator('label', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入名称!' |
| | | } |
| | | ] |
| | | })(<Input autoComplete="off"/>)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'custom' && reType === 'name' ? <Col span={20}> |
| | | <Form.Item label="原字段"> |
| | | {getFieldDecorator('orifield', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入原字段!' |
| | | } |
| | | ] |
| | | })(<AutoComplete dataSource={_fields2} onSelect={this.complete} filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} autoFocus placeholder="" />)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'custom' && reType === 'name' ? <Col span={20}> |
| | | <Form.Item label="替换为"> |
| | | {getFieldDecorator('name', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入字段!' |
| | | } |
| | | ] |
| | | })(<Input autoComplete="off"/>)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'custom' && records.length > 0 ? <Col span={24}> |
| | | <DeleteOutlined onClick={this.clear} style={{float: 'right', fontSize: '18px', marginTop: '-10px', cursor: 'pointer', color: '#ff4d4f'}} title="清空历史记录" /> |
| | | </Col> : null} |
| | | </Row> |
| | | </Form> |
| | | ) |