king
2021-10-27 bbcb3f45ad0ef4c808bf5a68ec10c0464c094e2f
src/menu/components/table/edit-table/columns/editColumn/index.jsx
@@ -1,18 +1,20 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Form, Row, Col, Input, Select, InputNumber, Radio, Tooltip, Icon, Modal } from 'antd'
import { Form, Row, Col, Input, Select, InputNumber, Radio, Tooltip, Icon, Modal, notification } from 'antd'
import { getColumnForm } from './formconfig'
import { formRule } from '@/utils/option.js'
import './index.scss'
const { TextArea } = Input
const columnTypeOptions = {
  text: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'prefix', 'postfix', 'textFormat', 'editable', 'blacklist'],
  number: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'decimal', 'format', 'prefix', 'postfix', 'editable', 'blacklist'],
  textarea: ['label', 'field', 'type', 'Align', 'Hide', 'Width', 'prefix', 'postfix', 'blacklist'],
  text: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'prefix', 'postfix', 'textFormat', 'editable', 'initval', 'blacklist'],
  number: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'decimal', 'format', 'prefix', 'postfix', 'editable', 'initval', 'sum', 'blacklist'],
  textarea: ['label', 'field', 'type', 'Align', 'Hide', 'Width', 'prefix', 'initval', 'postfix', 'blacklist'],
  custom: ['label', 'type', 'Align', 'Hide', 'Width', 'blacklist'],
  action: ['label', 'type', 'Align', 'Width'],
  formula: ['label', 'type', 'Align', 'Hide', 'Width', 'prefix', 'postfix', 'eval', 'formula', 'blacklist'],
  index: ['label', 'type', 'Align', 'Width']
}
@@ -21,6 +23,7 @@
    dict: PropTypes.object,     // 字典项
    visible: PropTypes.bool,
    column: PropTypes.object,
    columns: PropTypes.array,
    fields: PropTypes.array,
    submitCol: PropTypes.func,  // 提交事件
    cancelCol: PropTypes.func   // 取消时删除事件
@@ -38,8 +41,16 @@
  }
  editColumn = (column) => {
    let formlist = getColumnForm(column, this.props.fields)
    let formlist = getColumnForm(column, this.props.fields, this.props.columns)
    let _options = fromJS(columnTypeOptions[column.type]).toJS()
    if (column.editable === 'true') {
      if (column.type === 'text') {
        _options.push('required', 'enter', 'footEnter')
      } else if (column.type === 'number') {
        _options.push('max', 'min', 'enter', 'footEnter')
      }
    }
    this.setState({
      visible: true,
@@ -63,12 +74,24 @@
  }
  typeChange = (key, value, option) => {
    const { editable, type } = this.state
    if (key === 'type') {
      let _options = fromJS(columnTypeOptions[value]).toJS()
      if (editable === 'true') {
        if (value === 'text') {
          _options.push('required', 'enter', 'footEnter')
        } else if (value === 'number') {
          _options.push('max', 'min', 'enter', 'footEnter')
        }
      }
      this.setState({
        type: value,
        formlist: this.state.formlist.map(item => {
          if (item.key === 'editable') {
            item.initVal = editable
          }
          item.hidden = !_options.includes(item.key)
          return item
@@ -94,9 +117,20 @@
      if (values.type !== this.state.type) {
        let _options = fromJS(columnTypeOptions[values.type]).toJS()
        if (editable === 'true') {
          if (values.type === 'text') {
            _options.push('required', 'enter', 'footEnter')
          } else if (values.type === 'number') {
            _options.push('max', 'min', 'enter', 'footEnter')
          }
        }
        this.setState({
          type: values.type,
          formlist: this.state.formlist.map(item => {
            if (item.key === 'editable') {
              item.initVal = editable
            }
            item.hidden = !_options.includes(item.key)
            return item
@@ -110,7 +144,24 @@
    } else if (key === 'format' && value === 'percent') {
      this.props.form.setFieldsValue({postfix: '%'})
    } else if (key === 'editable') {
      let _options = fromJS(columnTypeOptions[type]).toJS()
      if (value === 'true') {
        if (type === 'text') {
          _options.push('required', 'enter', 'footEnter')
        } else if (type === 'number') {
          _options.push('max', 'min', 'enter', 'footEnter')
        }
      }
      this.setState({
        editable: value,
        formlist: this.state.formlist.map(item => {
          item.hidden = !_options.includes(item.key)
          return item
        })
      })
    }
  }
@@ -255,15 +306,48 @@
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'textarea') { // 文本搜索
        fields.push(
          <Col span={24} key={index} className="textarea">
            <Form.Item label={item.tooltip ?
              <Tooltip placement="topLeft" title={item.tooltip}>
                <Icon type="question-circle" />
                {item.label}
              </Tooltip> : item.label
            }>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal || '',
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.input'] + item.label + '!'
                  }
                ]
              })(<TextArea rows={2} disabled={item.readonly} placeholder={item.placeholder || ''} />)}
            </Form.Item>
          </Col>
        )
      }
    })
    return fields
  }
  handleSubmit = () => {
    const { columns, column } = this.props
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        values.uuid = column.uuid
        values.marks = column.marks || []
        if (values.field && columns.filter(col => col.field && col.uuid !== values.uuid && col.field === values.field).length > 0) {
          notification.warning({
            top: 92,
            message: '字段已添加!',
            duration: 5
          })
          return
        }
        this.setState({visible: false, formlist: null})
        this.props.submitCol(values)
      }