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