From a2df1bad33874fc6d9f96b0ceb1a6ce97b2e7e80 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期二, 26 五月 2020 19:35:40 +0800 Subject: [PATCH] 2020-05-26 --- src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx | 323 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 300 insertions(+), 23 deletions(-) diff --git a/src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx b/src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx index 04dd273..afd1e2e 100644 --- a/src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx +++ b/src/templates/sharecomponent/chartcomponent/chartcompile/index.jsx @@ -1,9 +1,10 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { fromJS } from 'immutable' -import { Drawer, Form, Button, Col, Row, Select, Icon, Radio, Tooltip, Input, InputNumber } from 'antd' +import { Drawer, Form, Button, Col, Row, Select, Icon, Radio, Tooltip, Input, InputNumber, Cascader } from 'antd' import { getChartOptionForm } from '@/templates/zshare/formconfig' +import { minkeColorSystem, colorTransform } from '@/utils/option.js' import './index.scss' class LineChartDrawerForm extends Component { @@ -18,27 +19,72 @@ view: 'normal', visible: false, plot: null, - formlist: null + formlist: null, + datatype: null, + fieldName: null, + colorOptions: fromJS(minkeColorSystem).toJS().map(option => { + option.children = option.children.map(cell => { + let _cell = {} + _cell.label = <div className={'background ' + cell.value}>{cell.value}</div> + _cell.value = colorTransform[cell.value] + + return _cell + }) + return option + }), + shapeOptions: [ + { + value: 'line', + label: '鎶樼嚎', + children: [ + { value: 'smooth', label: 'smooth' }, + { value: 'line', label: 'line' }, + { value: 'dot', label: 'dot' }, + { value: 'dash', label: 'dash' }, + { value: 'hv', label: 'hv' }, + { value: 'vh', label: 'vh' }, + { value: 'hvh', label: 'hvh' }, + { value: 'vhv', label: 'vhv' } + ] + }, + { + value: 'bar', + label: '鏌卞舰', + children: [ + { value: 'rect', label: 'rect' }, + { value: 'hollow-rect', label: 'hollow-rect' }, + { value: 'line', label: 'line' }, + { value: 'tick', label: 'tick' }, + { value: 'funnel', label: 'funnel' }, + { value: 'pyramid', label: 'pyramid' } + ], + } + ] } showDrawer = () => { const { config, plot } = this.props + let datatype = null + if (['line', 'bar'].includes(plot.chartType)) { + datatype = plot.datatype || 'query' + } + + let fieldName = {} + config.columns.forEach(col => { + if (col.field) { + fieldName[col.field] = col.label + } + }) + this.setState({ visible: true, + view: 'normal', + datatype: datatype, + fieldName: fieldName, + enabled: plot.enabled || 'false', plot: fromJS(plot).toJS(), formlist: getChartOptionForm(plot, config.columns, config.setting) - }) - } - - onSubmit = () => { - this.props.form.validateFieldsAndScroll((err, values) => { - if (!err) { - this.setState({ - visible: false - }) - this.props.plotchange(values) - } }) } @@ -48,6 +94,7 @@ if (key === 'datatype') { this.setState({ + datatype: val, formlist: formlist.map(item => { if (['Yaxis'].includes(item.key)) { item.hidden = val === 'statistics' @@ -177,13 +224,206 @@ return fields } + getCustomFields = () => { + const { getFieldDecorator } = this.props.form + const { plot, fieldName, enabled, colorOptions, shapeOptions } = this.state + const fields = [] + + fields.push(<Col span={12} key="enabled"> + <Form.Item label="鏄惁鍚敤" style={{marginBottom: 10}}> + {getFieldDecorator('enabled', { + initialValue: plot.enabled || 'false' + })( + <Radio.Group onChange={this.enabledChange}> + <Radio value="true">鏄�</Radio> + <Radio value="false">鍚�</Radio> + </Radio.Group> + )} + </Form.Item> + </Col>) + + plot.customs.forEach((item, i) => { + fields.push(<Col span={24} key={'field' + i}> + <p className="field-title">{fieldName[item.field]}</p> + </Col>) + fields.push(<Col span={12} key={'shape' + i}> + <Form.Item label="褰㈢姸"> + {getFieldDecorator(item.field + '$shape', { + initialValue: item.$shape, + rules: [ + { + required: enabled === 'true', + message: this.props.dict['form.required.select'] + '褰㈢姸!' + } + ] + })( + <Cascader + disabled={enabled === 'false'} + options={shapeOptions} + placeholder="" + displayRender={(label, selectedOptions) => selectedOptions[0] ? selectedOptions[0].label + ' / ' + selectedOptions[1].value : ''} + /> + )} + </Form.Item> + </Col>) + fields.push(<Col span={12} key={'color' + i}> + <Form.Item label="棰滆壊"> + {getFieldDecorator(item.field + '$color', { + initialValue: item.$color, + rules: [ + { + required: enabled === 'true', + message: this.props.dict['form.required.select'] + '棰滆壊!' + } + ] + })( + <Cascader + disabled={enabled === 'false'} + options={colorOptions} + placeholder="" + getPopupContainer={() => document.getElementById('chart-custom-drawer-form')} + displayRender={(label, selectedOptions) => selectedOptions[0] ? <div style={{background: selectedOptions[1].value, width: '20px', height: '20px'}}></div> : ''} + /> + )} + </Form.Item> + </Col>) + fields.push(<Col span={12} key={'axis' + i}> + <Form.Item label="鍧愭爣杞�"> + {getFieldDecorator(item.field + '$axis', { + initialValue: item.axis + })( + <Radio.Group disabled={enabled === 'false'} onChange={this.axisChange}> + <Radio value="left">宸︿晶</Radio> + <Radio value="right">鍙充晶</Radio> + <Radio value="unset">涓嶆樉绀�</Radio> + </Radio.Group> + )} + </Form.Item> + </Col>) + fields.push(<Col span={12} key={'label' + i}> + <Form.Item label="鏍囨敞-鍊�"> + {getFieldDecorator(item.field + '$label', { + initialValue: item.label + })( + <Radio.Group disabled={enabled === 'false'}> + <Radio value="true">鏄剧ず</Radio> + <Radio value="false">闅愯棌</Radio> + </Radio.Group> + )} + </Form.Item> + </Col>) + }) + + return fields + } + + axisChange = (e) => { + const { plot } = this.state + let val = e.target.value + let fieldvalue = {} + + plot.customs.forEach(item => { + if (this.props.form.getFieldValue(item.field + '$axis') === val) { + fieldvalue[item.field + '$axis'] = 'unset' + } + }) + + this.props.form.setFieldsValue(fieldvalue) + } + + enabledChange = (e) => { + let val = e.target.value + + this.setState({enabled: val}) + } + + onSubmit = () => { + const { plot, view, datatype } = this.state + + if (view !== 'custom') { + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + let _plot = {...plot, ...values} + + if (datatype === 'query') { + if (_plot.enabled === 'true') { + if (_plot.customs.map(_cell => _cell.field).sort().toString() !== _plot.Yaxis.sort().toString()) { + _plot.customs = null + _plot.enabled = 'false' + } + } + } else { + _plot.customs = null + _plot.enabled = 'false' + } + + this.setState({ + plot: _plot, + visible: false + }) + + this.props.plotchange(_plot) + } + }) + } else { + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + let _plot = {...plot, enabled: values.enabled} + + if (_plot.enabled === 'true') { + _plot.customs = _plot.Yaxis.map(field => { + let _item = {field: field} + + _item.$shape = values[field + '$shape'] + _item.chartType = _item.$shape[0] + _item.shape = _item.$shape[1] + + _item.$color = values[field + '$color'] + _item.color = _item.$color[1] + + _item.axis = values[field + '$axis'] + + _item.label = values[field + '$label'] + + return _item + }) + } else { + _plot.customs = null + } + + this.setState({ + plot: _plot, + visible: false + }) + + this.props.plotchange(_plot) + } + }) + } + } + changeView = () => { - let _view = this.state.view === 'normal' ? 'custom' : 'normal' + const { config } = this.props + const { plot, view } = this.state + let _view = view === 'normal' ? 'custom' : 'normal' if (_view === 'custom') { this.props.form.validateFieldsAndScroll((err, values) => { if (!err) { - let _plot = {...this.state.plot, ...values} + let _plot = {...plot, ...values} + + if (_plot.enabled !== 'true') { + _plot.enabled = 'false' + _plot.customs = _plot.Yaxis.map((field, i) => { + let _item = {field: field} + _item.$shape = [_plot.chartType, _plot.shape] + _item.$color = [] + _item.axis = i === 0 ? 'left' : 'unset' + _item.label = _plot.label + + return _item + }) + } this.setState({ plot: _plot, @@ -191,12 +431,48 @@ }) } }) + } else { + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + let _values = {enabled: values.enabled} + + if (values.enabled === 'true') { + let _customs = [] + plot.Yaxis.forEach(field => { + let _item = {field: field} + + _item.$shape = values[field + '$shape'] + _item.chartType = _item.$shape[0] + _item.shape = _item.$shape[1] + + _item.$color = values[field + '$color'] + _item.color = _item.$color[1] + + _item.axis = values[field + '$axis'] + _item.label = values[field + '$label'] + + _customs.push(_item) + }) + + _values.customs = _customs + } else { + _values.customs = null + } + + let _plot = {...plot, ..._values} + + this.setState({ + plot: _plot, + view: _view, + formlist: getChartOptionForm(_plot, config.columns, config.setting) + }) + } + }) } - this.setState({view: _view}) } render() { - const { view } = this.state + const { view, datatype } = this.state const formItemLayout = { labelCol: { xs: { span: 24 }, @@ -219,17 +495,18 @@ visible={this.state.visible} bodyStyle={{ paddingBottom: 80 }} > - {view !== 'custom' ? <Form {...formItemLayout}> + {view !== 'custom' ? <Form {...formItemLayout} className="base-setting"> <Row gutter={16}>{this.getFields()}</Row> - {/* <Row gutter={16}> + {datatype === 'query' ? <Row gutter={16}> <Button onClick={this.changeView} style={{border: 0, boxShadow: 'unset',float: 'right', color: '#1890ff', marginRight: 12, cursor: 'pointer'}}>鑷畾涔夎缃�<Icon style={{marginLeft: 5}} type="right" /></Button> - </Row> */} + </Row> : null} </Form> : null} - {/* <Form {...formItemLayout}> + {view === 'custom' ? <Form {...formItemLayout} id="chart-custom-drawer-form" className="mingke-table"> + <Row gutter={16} style={{minHeight: 'calc(100vh - 180px)'}}>{this.getCustomFields()}</Row> <Row gutter={16}> - <Button onClick={this.changeView} style={{border: 0, boxShadow: 'unset',float: 'right', color: '#1890ff', marginRight: 12, cursor: 'pointer'}}>鑷畾涔夎缃�<Icon style={{marginLeft: 5}} type="right" /></Button> + <Button onClick={this.changeView} style={{border: 0, boxShadow: 'unset', color: '#1890ff', marginRight: 12, cursor: 'pointer'}}><Icon style={{marginRight: 5}} type="left" />鍩烘湰璁剧疆</Button> </Row> - </Form> */} + </Form> : null} <div style={{ position: 'absolute', -- Gitblit v1.8.0