| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Form, Row, Col, Tooltip, Select, Radio, AutoComplete, Modal } from 'antd' |
| | | import { Form, Row, Col, Tooltip, Select, Radio, AutoComplete, Input, Modal } from 'antd' |
| | | import { QuestionCircleOutlined, SwapRightOutlined, DeleteOutlined } from '@ant-design/icons' |
| | | |
| | | // import './index.scss' |
| | |
| | | state = { |
| | | resource: 'custom', |
| | | reType: 'field', |
| | | field: '', |
| | | label: '', |
| | | fields: [], |
| | | labels: [] |
| | | records: [] |
| | | } |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | componentDidMount () { |
| | | let records = localStorage.getItem('replaceRecord') |
| | | |
| | | if (records) { |
| | | records = JSON.parse(records) |
| | | |
| | | let fields = records.fields || [] |
| | | let labels = records.labels || [] |
| | | if (!Array.isArray(records)) { |
| | | localStorage.removeItem('replaceRecord') |
| | | records = [] |
| | | } |
| | | |
| | | this.setState({fields, labels, field: fields[0] || '', label: labels[0] || ''}) |
| | | 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 (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 = {fields: [], labels: []} |
| | | records = [] |
| | | } |
| | | |
| | | records.fields.unshift(values.field) |
| | | records.labels.unshift(values.label) |
| | | let field = values.field.toLowerCase() |
| | | records = records.filter(item => item.reType !== reType || item.value.toLowerCase() !== field) |
| | | |
| | | let _fields = [] |
| | | let _labels = [] |
| | | records.unshift({ |
| | | value: values.field, |
| | | label: values.label, |
| | | reType |
| | | }) |
| | | |
| | | records.fields = records.fields.filter(m => { |
| | | if (_fields.includes(m.toLowerCase())) return false |
| | | _fields.push(m.toLowerCase()) |
| | | return true |
| | | }) |
| | | records.labels = records.labels.filter(m => { |
| | | if (_labels.includes(m.toLowerCase())) return false |
| | | _labels.push(m.toLowerCase()) |
| | | return true |
| | | }) |
| | | this.setState({records: records}) |
| | | |
| | | localStorage.setItem('replaceRecord', JSON.stringify(records)) |
| | | } |
| | |
| | | } |
| | | |
| | | clear = () => { |
| | | let _this = this |
| | | let that = this |
| | | confirm({ |
| | | title: '确定清除历史记录吗?', |
| | | content: '', |
| | | onOk() { |
| | | localStorage.removeItem('replaceRecord') |
| | | _this.setState({fields: [], labels: []}) |
| | | 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, fields, labels, field, label, reType } = this.state |
| | | const { resource, records, reType } = this.state |
| | | |
| | | const formItemLayout = { |
| | | labelCol: { |
| | |
| | | } |
| | | } |
| | | |
| | | let _fields = fields |
| | | if (field) { |
| | | _fields = fields.filter(item => item.toLowerCase().indexOf(field.toLowerCase()) > -1) |
| | | } |
| | | let _labels = labels |
| | | if (label) { |
| | | _labels = labels.filter(item => item.indexOf(label) > -1) |
| | | } |
| | | let _fields1 = [] |
| | | let _fields2 = [] |
| | | records.forEach(item => { |
| | | if (item.reType === 'field') { |
| | | _fields1.push(item.value) |
| | | } else { |
| | | _fields2.push(item.value) |
| | | } |
| | | }) |
| | | |
| | | return ( |
| | | <Form {...formItemLayout}> |
| | |
| | | <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> |
| | | <Col span={20}> |
| | | {resource !== 'langs' ? <Col span={20}> |
| | | <Form.Item label="替换依据"> |
| | | {getFieldDecorator('reType', { |
| | | initialValue: 'field' |
| | |
| | | </Radio.Group> |
| | | )} |
| | | </Form.Item> |
| | | </Col> |
| | | </Col> : null} |
| | | {resource === 'dict' ? <Col span={20}> |
| | | <Form.Item label={ |
| | | <Tooltip placement="topLeft" title="用于字段替换的表名。"> |
| | |
| | | {resource === 'custom' && reType === 'field' ? <Col span={20}> |
| | | <Form.Item label="字段"> |
| | | {getFieldDecorator('field', { |
| | | initialValue: field, |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入字段!' |
| | | } |
| | | ] |
| | | })(<AutoComplete dataSource={_fields} autoFocus onSearch={(val) => this.setState({ field: val})} placeholder="" />)} |
| | | })(<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: label, |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入名称!' |
| | | } |
| | | ] |
| | | })(<AutoComplete dataSource={_labels} onSearch={(val) => this.setState({ label: val})} placeholder="" />)} |
| | | })(<Input autoComplete="off"/>)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'custom' && reType === 'name' ? <Col span={20}> |
| | | <Form.Item label="原字段"> |
| | | {getFieldDecorator('label', { |
| | | initialValue: label, |
| | | {getFieldDecorator('orifield', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入名称!' |
| | | message: '请输入原字段!' |
| | | } |
| | | ] |
| | | })(<AutoComplete dataSource={_labels} autoFocus onSearch={(val) => this.setState({ label: val})} placeholder="" />)} |
| | | })(<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('field', { |
| | | initialValue: field, |
| | | {getFieldDecorator('name', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入字段!' |
| | | } |
| | | ] |
| | | })(<AutoComplete dataSource={_fields} onSearch={(val) => this.setState({ field: val})} placeholder="" />)} |
| | | })(<Input autoComplete="off"/>)} |
| | | </Form.Item> |
| | | </Col> : null} |
| | | {resource === 'custom' && fields.length > 0 ? <Col span={24}> |
| | | {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> |