| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { Table, Input, Popconfirm, Form, Radio, message } from 'antd' |
| | | import { Table, Input, Popconfirm, Form, message } from 'antd' |
| | | import { ArrowUpOutlined, ArrowDownOutlined, DeleteOutlined, PlusOutlined, SwapOutlined } from '@ant-design/icons' |
| | | |
| | | import { formRule } from '@/utils/option.js' |
| | | import Utils from '@/utils/utils.js' |
| | | import './index.scss' |
| | | |
| | |
| | | } |
| | | |
| | | save = e => { |
| | | const { record, handleSave, datatype } = this.props |
| | | const { record, handleSave } = this.props |
| | | this.form.validateFields((error, values) => { |
| | | if (datatype === 'number') { |
| | | Object.keys(values).forEach(key => { |
| | | values[key] = parseFloat(values[key]) |
| | | if (isNaN(values[key])) { |
| | | values[key] = 0 |
| | | } |
| | | }) |
| | | } |
| | | handleSave({ ...record, ...values }) |
| | | if (error && error[e.currentTarget.id]) { |
| | | return |
| | |
| | | |
| | | renderCell = form => { |
| | | this.form = form |
| | | const { children, dataIndex, record, datatype } = this.props |
| | | const { children, dataIndex, record } = this.props |
| | | const { editing } = this.state |
| | | |
| | | let rules = [] |
| | | if (datatype === 'number') { |
| | | rules.push({ |
| | | pattern: /^(-?\d+)(\.\d+)?$/, |
| | | message: formRule.input.numbermsg |
| | | }) |
| | | } |
| | | |
| | | return editing ? ( |
| | | <Form.Item style={{ margin: 0 }}> |
| | | <Form.Item style={{ margin: '0 -5px 0 -5px' }}> |
| | | {form.getFieldDecorator(dataIndex, { |
| | | rules: [ |
| | | { |
| | | required: dataIndex === 'Text', |
| | | message: '不可为空.', |
| | | }, |
| | | ...rules |
| | | } |
| | | ], |
| | | initialValue: record[dataIndex] |
| | | })(<Input ref={node => (this.input = node)} autoComplete="off" onPressEnter={this.save} onBlur={this.save} />)} |
| | |
| | | class EditTable extends Component { |
| | | static propTpyes = { |
| | | type: PropTypes.string, // 表单类型 |
| | | module: PropTypes.string, // 元素类型 |
| | | linkSubFields: PropTypes.array, // 关联字段 |
| | | transfield: PropTypes.object, // 表单字段名称 |
| | | onChange: PropTypes.func // 数据变化 |
| | |
| | | columns: columns, |
| | | dataSource: data, |
| | | count: data.length |
| | | }) |
| | | } |
| | | |
| | | getColumnSearchProps = column => ({ |
| | | filterDropdown: () => ( |
| | | <div style={{ padding: 8 }}> |
| | | <Radio.Group onChange={(e) => this.changeDatatype(column, e)} value={column.datatype}> |
| | | <Radio style={{display: 'block', height: '30px', lineHeight: '30px'}} value="string"> |
| | | 字符串 |
| | | </Radio> |
| | | <Radio style={{display: 'block', height: '30px', lineHeight: '30px'}} value="number"> |
| | | 数字 |
| | | </Radio> |
| | | </Radio.Group> |
| | | </div> |
| | | ), |
| | | filterIcon: () => ( |
| | | <SwapOutlined style={{ color: column.datatype === 'number' ? '#1890ff' : ''}} /> |
| | | ) |
| | | }) |
| | | |
| | | changeDatatype = (column, e) => { |
| | | const { columns, dataSource } = this.state |
| | | let value = e.target.value |
| | | let _data = dataSource.map(item => { |
| | | let val = item[column.dataIndex] |
| | | if (value === 'number') { |
| | | val = parseFloat(val) |
| | | if (isNaN(val)) { |
| | | val = 0 |
| | | } |
| | | } else { |
| | | val = '' + val |
| | | } |
| | | |
| | | item[column.dataIndex] = val |
| | | |
| | | return item |
| | | }) |
| | | |
| | | this.setState({ |
| | | dataSource: _data, |
| | | columns: columns.map(col => { |
| | | if (col.dataIndex === column.dataIndex) { |
| | | col.datatype = value |
| | | } |
| | | |
| | | if (col.dataIndex !== 'operation') { |
| | | col = {...col, ...this.getColumnSearchProps(col)} |
| | | } |
| | | |
| | | return col |
| | | }) |
| | | }, () => { |
| | | this.props.onChange(_data) |
| | | }) |
| | | } |
| | | |
| | |
| | | |
| | | let _dataSource = fromJS(dataSource).toJS() |
| | | let fields = [] |
| | | let dataItem = '' |
| | | let subFields = linkSubFields.filter(m => m !== 'Value' && m !== 'Text') |
| | | |
| | | if (subFields.length > 0) { |
| | |
| | | return data |
| | | }) |
| | | |
| | | dataItem = _dataSource ? _dataSource[0] : '' |
| | | |
| | | fields = subFields.map(field => { |
| | | return { |
| | | title: transfield[field] || field, |
| | | $title: transfield[field] || field, |
| | | dataIndex: field, |
| | | editable: true, |
| | | datatype: dataItem && typeof(dataItem[field]) === 'number' ? 'number' : 'string' |
| | | } |
| | | }) |
| | | } else { |
| | | dataItem = _dataSource ? _dataSource[0] : '' |
| | | } |
| | | |
| | | let columns = [ |
| | | { |
| | | title: 'Value', |
| | | $title: 'Value', |
| | | dataIndex: 'Value', |
| | | editable: true, |
| | | datatype: dataItem && typeof(dataItem.Value) === 'number' ? 'number' : 'string' |
| | | editable: true |
| | | }, |
| | | { |
| | | title: 'Text', |
| | | $title: 'Text', |
| | | dataIndex: 'Text', |
| | | editable: true, |
| | | datatype: dataItem && typeof(dataItem.Text) === 'number' ? 'number' : 'string' |
| | | editable: true |
| | | }, |
| | | ...fields, |
| | | { |
| | |
| | | if (type === 'link') { |
| | | columns.unshift({ |
| | | title: 'ParentID', |
| | | $title: 'ParentID', |
| | | dataIndex: 'ParentID', |
| | | editable: true, |
| | | datatype: dataItem && typeof(dataItem.ParentID) === 'number' ? 'number' : 'string' |
| | | editable: true |
| | | }) |
| | | } |
| | | |
| | | return { |
| | | columns: columns.map(col => { |
| | | if (col.dataIndex !== 'operation') { |
| | | col = {...col, ...this.getColumnSearchProps(col)} |
| | | col.title = <div> |
| | | {col.$title} |
| | | </div> |
| | | } |
| | | return col |
| | | }), |
| | | dataSource: _dataSource |
| | | } |
| | | } |
| | | |
| | | handleEmpty = (e) => { |
| | | e.stopPropagation() |
| | | const { linkSubFields, module } = this.props |
| | | const { dataSource } = this.state |
| | | |
| | | if (dataSource.filter(item => item.Value === '').length > 0) { |
| | | message.warning('Value为空已存在!') |
| | | return |
| | | } |
| | | const newData = { |
| | | key: Utils.getuuid(), |
| | | Value: '', |
| | | Text: module === 'form' ? '空' : '全部', |
| | | ParentID: '' |
| | | } |
| | | |
| | | linkSubFields.forEach(m => { |
| | | newData[m] = newData[m] || '' |
| | | }) |
| | | |
| | | let _data = [newData, ...dataSource] |
| | | |
| | | this.setState({ |
| | | dataSource: _data, |
| | | }, () => { |
| | | this.props.onChange(_data) |
| | | }) |
| | | } |
| | | |
| | | resetColumn = (type, linkSubFields) => { |
| | |
| | | } |
| | | |
| | | render() { |
| | | const { module } = this.props |
| | | const { dataSource } = this.state |
| | | const components = { |
| | | body: { |
| | |
| | | editable: col.editable, |
| | | dataIndex: col.dataIndex, |
| | | title: col.title, |
| | | datatype: col.datatype, |
| | | handleSave: this.handleSave, |
| | | handleSave: this.handleSave |
| | | }) |
| | | } |
| | | }) |
| | | return ( |
| | | <div className="common-modal-edit-table"> |
| | | <span className="add-row add-row-empty" onClick={this.handleEmpty}>{module === 'form' ? '空' : '全部'}</span> |
| | | <PlusOutlined className="add-row" onClick={this.handleAdd} /> |
| | | <Table |
| | | components={components} |