From b9a0e8541f0959db5d848f7b893c8838851ce411 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期四, 09 四月 2020 13:29:49 +0800 Subject: [PATCH] 2020-04-09 --- src/templates/zshare/modaleditable/index.jsx | 121 ++++++++++++++++++++++++++++++++++++---- 1 files changed, 108 insertions(+), 13 deletions(-) diff --git a/src/templates/zshare/modaleditable/index.jsx b/src/templates/zshare/modaleditable/index.jsx index 2784030..d2104a8 100644 --- a/src/templates/zshare/modaleditable/index.jsx +++ b/src/templates/zshare/modaleditable/index.jsx @@ -1,6 +1,7 @@ import React, {Component} from 'react' import { is, fromJS } from 'immutable' -import { Table, Input, Button, Popconfirm, Form, Icon } from 'antd' +import { Table, Input, Button, Popconfirm, Form, Icon, Radio } from 'antd' +import { formRule } from '@/utils/option.js' import Utils from '@/utils/utils.js' import './index.scss' @@ -31,8 +32,13 @@ } save = e => { - const { record, handleSave } = this.props + const { record, handleSave, datatype } = this.props this.form.validateFields((error, values) => { + if (datatype === 'number') { + Object.keys(values).forEach(key => { + values[key] = parseFloat(values[key]) + }) + } handleSave({ ...record, ...values }) if (error && error[e.currentTarget.id]) { return @@ -43,8 +49,16 @@ renderCell = form => { this.form = form - const { children, dataIndex, record } = this.props + const { children, dataIndex, record, datatype } = 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 }}> @@ -54,6 +68,7 @@ required: dataIndex === 'Value' || dataIndex === 'Text', message: 'NOT NULL.', }, + ...rules ], initialValue: record[dataIndex] })(<Input ref={node => (this.input = node)} autoComplete="off" onPressEnter={this.save} onBlur={this.save} />)} @@ -97,6 +112,7 @@ let _width = '40%' let fields = [] + let dataItem = props.data ? props.data[0] : '' if (props.type === 'link') { _width = '27%' @@ -107,23 +123,28 @@ title: field.label, dataIndex: field.field, width: _width, - editable: true + editable: true, + datatype: dataItem && typeof(dataItem[field.field]) === 'number' ? 'number' : 'string' } }) } + + let columns = [ { title: 'Value', dataIndex: 'Value', width: _width, - editable: true + editable: true, + datatype: dataItem && typeof(dataItem.Value) === 'number' ? 'number' : 'string' }, { title: 'Text', dataIndex: 'Text', width: _width, - editable: true + editable: true, + datatype: dataItem && typeof(dataItem.Text) === 'number' ? 'number' : 'string' }, ...fields, { @@ -153,17 +174,79 @@ title: 'ParentID', dataIndex: 'ParentID', width: '27%', - editable: true + editable: true, + datatype: dataItem && typeof(dataItem.ParentID) === 'number' ? 'number' : 'string' }) } this.state = { - columns: columns, + columns: columns.map(col => { + if (col.dataIndex !== 'operation') { + col = {...col, ...this.getColumnSearchProps(col)} + } + return col + }), dataSource: props.data, count: props.data.length, type: props.type, linkSubFields: props.linkSubFields } + } + + 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"> + String + </Radio> + <Radio style={{display: 'block', height: '30px', lineHeight: '30px'}} value="number"> + Number + </Radio> + </Radio.Group> + </div> + ), + filterIcon: () => ( + <Icon type="swap" style={{ color: column.datatype === 'number' ? '#1890ff' : undefined}} /> + ) + }) + + changeDatatype = (column, e) => { + const { columns, dataSource } = this.state + let value = e.target.value + + this.setState({ + dataSource: dataSource.map(item => { + let val = item[column.dataIndex] + if (value === 'number') { + try { + val = parseFloat(val) + if (isNaN(val)) { + val = '' + } + } catch { + val = '' + } + } else { + val = '' + val + } + + item[column.dataIndex] = val + + return item + }), + columns: columns.map(col => { + if (col.dataIndex === column.dataIndex) { + col.datatype = value + } + + if (col.dataIndex !== 'operation') { + col = {...col, ...this.getColumnSearchProps(col)} + } + + return col + }) + }) } handleUpDown = (record, direction) => { @@ -237,6 +320,8 @@ }) } + let dataItem = dataSource ? dataSource[0] : '' + if (type === 'link') { _width = '27%' } else if (type === 'select') { @@ -246,7 +331,8 @@ title: field.label, dataIndex: field.field, width: _width, - editable: true + editable: true, + datatype: dataItem && typeof(dataItem[field.field]) === 'number' ? 'number' : 'string' } }) } @@ -256,13 +342,15 @@ title: 'Value', dataIndex: 'Value', width: _width, - editable: true + editable: true, + datatype: dataItem && typeof(dataItem.Value) === 'number' ? 'number' : 'string' }, { title: 'Text', dataIndex: 'Text', width: _width, - editable: true + editable: true, + datatype: dataItem && typeof(dataItem.Text) === 'number' ? 'number' : 'string' }, ...fields, { @@ -292,12 +380,18 @@ title: 'ParentID', dataIndex: 'ParentID', width: '27%', - editable: true + editable: true, + datatype: dataItem && typeof(dataItem.ParentID) === 'number' ? 'number' : 'string' }) } this.setState({ - columns: columns, + columns: columns.map(col => { + if (col.dataIndex !== 'operation') { + col = {...col, ...this.getColumnSearchProps(col)} + } + return col + }), dataSource: dataSource, type: type }) @@ -344,6 +438,7 @@ editable: col.editable, dataIndex: col.dataIndex, title: col.title, + datatype: col.datatype, handleSave: this.handleSave, }) } -- Gitblit v1.8.0