From e4da07b71dddb3b01b58ecaf21ae5b7052e98b7d Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 26 八月 2020 16:01:01 +0800
Subject: [PATCH] 2020-08-26

---
 src/menu/components/chart/antv-bar/index.jsx |  695 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 510 insertions(+), 185 deletions(-)

diff --git a/src/menu/components/chart/antv-bar/index.jsx b/src/menu/components/chart/antv-bar/index.jsx
index 88bbd27..cf3b9d1 100644
--- a/src/menu/components/chart/antv-bar/index.jsx
+++ b/src/menu/components/chart/antv-bar/index.jsx
@@ -1,227 +1,552 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { InputItem, Icon, Checkbox, List, Button } from 'antd-mobile'
-// import { createForm } from 'rc-form'
+import { Chart } from '@antv/g2'
+import DataSet from '@antv/data-set'
+
+import asyncComponent from '@/utils/asyncComponent'
 
 import zhCN from '@/locales/zh-CN/mob.js'
 import enUS from '@/locales/en-US/mob.js'
-import Utils from '@/utils/utils.js'
-import ContentUpdate from '@/mob/contupdate'
-import mklogo from '@/assets/mobimg/mklogo.png'
+// import ChartCompileForm from './chartcompile'
 import './index.scss'
 
-const CheckboxItem = Checkbox.CheckboxItem
+const SettingComponent = asyncComponent(() => import('@/menu/datasourcecomponent'))
+const SearchComponent = asyncComponent(() => import('@/menu/searchcomponent'))
+const ActionComponent = asyncComponent(() => import('@/menu/actioncomponent'))
 
-class MobLogin extends Component {
+class antvBarLineChart extends Component {
   static propTpyes = {
+    config: PropTypes.object,
     card: PropTypes.object,
     editId: PropTypes.any,
     triggerEdit: PropTypes.func,
     updateConfig: PropTypes.func,
-    onDoubleClick: PropTypes.func
   }
 
   state = {
     dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    rember: true,
-    param: {
-      type: 'login',
-      subtype: 'mob-login-1',
-      box: { uuid: Utils.getuuid(), eleType: 'box', style: {color: '#ffffff', backgroundImage: 'linear-gradient(#378DBE, #46C29E, #48A9D6)'}},
-      logo: { uuid: Utils.getuuid(), eleType: 'img', content: mklogo, style: {marginTop: '17vh', marginBottom: '15px'} },
-      title: { uuid: Utils.getuuid(), eleType: 'text', content: '鏄庣鍟嗕笟鏅鸿兘寮�鏀惧钩鍙�', style: {fontSize: '20px', fontWeight: 'bold', color: '#ffffff', textAlign: 'center', marginTop: '15px', marginBottom: '30px'}},
-      login: { uuid: Utils.getuuid(), eleType: 'button', content: '鐧诲綍', style: {fontSize: '18px', color: '#ffffff', textAlign: 'center', lineHeight: 2.4, borderRadius: '25px', marginBottom: '15vh'}},
-      copyright: { uuid: Utils.getuuid(), eleType: 'textarea', content: 'Copyright漏2017  鎵�鏈夌浉鍏崇増鏉冨綊  鍖椾含鏄庣鏅崕淇℃伅鎶�鏈湁闄愬叕鍙�', style: {fontSize: '12px', color: '#ffffff', textAlign: 'center'} }
-    }
+    card: null,
+    visible: true
   }
 
   UNSAFE_componentWillMount () {
-    const { card } = this.props
+    const { card, config } = this.props
 
+    console.log(config)
     if (card.isNew) {
-      // this.props.updateConfig({...param, ...card})
+      let _card = {
+        uuid: card.uuid,
+        type: card.type,
+        subtype: card.subtype,
+        setting: {span: 12, height: 400},
+        columns: [],
+        scripts: [],
+        search: [],
+        action: [],
+        plot: {type: card.type, Xaxis: '', Yaxis: null}
+      }
+      this.setState({
+        card: _card
+      })
+      this.props.updateConfig(_card)
+    } else {
+      this.setState({
+        card: fromJS(card).toJS()
+      })
     }
+  }
+
+  componentDidMount () {
+    this.viewrender()
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    if (!is(fromJS(this.props.plot), fromJS(nextProps.plot))) {
+      this.setState({}, () => {
+        this.viewrender()
+      })
+    }
+  }
+
+  getdata = (X_axis, Y_axis) => {
+    let data = []
+    let xdata = ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩']
+    let point = 7
+
+    for (let i = 0; i < point; i++) {
+      let item = {}
+
+      item[X_axis] = xdata[i]
+
+      if (typeof(Y_axis) === 'string') {
+        item[Y_axis] = Math.floor(Math.random() * 5 * (i + 1)) + i
+      } else {
+        Y_axis.forEach(y => {
+          item[y] = Math.floor(Math.random() * 5 * (i + 1)) + i
+        })
+      }
+
+      data.push(item)
+    }
+
+    return data
+  }
+
+  viewrender = () => {
+    const { card } = this.state
+
+    if (card.plot.type === 'line') {
+      this.linerender()
+    } else if (card.plot.type === 'bar') {
+      this.barrender()
+    }
+  }
+
+  linerender = () => {
+    const { plot, config } = this.props
+
+    let transfield = {}
+    config.columns.forEach(col => {
+      if (col.field) {
+        transfield[col.field] = col.label
+      }
+    })
+
+    let X_axis = plot.Xaxis || 'x'
+    let Y_axis = plot.Yaxis || ['y']
+
+    let data = this.getdata(X_axis, Y_axis)
+
+    if (plot.enabled !== 'true') {
+      const ds = new DataSet()
+      const dv = ds.createView().source(data)
+
+      dv.transform({
+        type: 'fold',
+        fields: [...Y_axis],
+        key: 'key',
+        value: 'value'
+      })
+
+      if (plot.Xaxis) {
+        dv.transform({
+          type: 'map',
+          callback(row) {
+            row.key = transfield[row.key]
+            return row
+          },
+        })
+      }
+
+      const chart = new Chart({
+        container: plot.uuid,
+        autoFit: true,
+        height: plot.height || 400
+      })
+  
+      chart.data(dv.rows)
+  
+      if (plot.coordinate !== 'polar') {
+        chart.scale(X_axis, {
+          range: [0, 1]
+        })
+      }
+      chart.scale('value', {
+        nice: true
+      })
+  
+      if (!plot.legend || plot.legend === 'hidden') {
+        chart.legend(false)
+      } else {
+        chart.legend({
+          position: plot.legend
+        })
+      }
+  
+      if (plot.tooltip !== 'true') {
+        chart.tooltip(false)
+      } else {
+        chart.tooltip({
+          shared: true
+        })
+      }
+  
+      if (plot.transpose === 'true') {
+        chart.coordinate().transpose()
+      }
+  
+      if (plot.coordinate === 'polar') {
+        chart.coordinate('polar', {
+          innerRadius: 0.1,
+          radius: 0.8
+        })
+      }
+  
+      let _chart = chart
+        .line()
+        .position(`${X_axis}*value`)
+        .color('key')
+        .shape(plot.shape || 'smooth')
+  
+      if (plot.label === 'true') {
+        _chart.label('value')
+      }
+
+      if (plot.point === 'true') {
+        chart
+          .point()
+          .position(`${X_axis}*value`)
+          .color('key')
+          .size(3)
+          .shape('circle')
+      }
+      chart.render()
+    } else {
+      this.customrender(data, transfield)
+    }
+  }
+
+  customrender = (data, transfield) => {
+    const { plot } = this.props
+
+    let barfields = []
+    let fields = []
+    let legends = []
+
+    plot.customs.forEach(item => {
+      item.name = transfield[item.field] || item.field
+      if (item.axis === 'left') {
+        item.index = 0
+      } else if (item.axis === 'right') {
+        item.index = 1
+      } else {
+        item.index = 2
+      }
+
+      if (item.chartType === 'bar') {
+        barfields.push(item.field)
+        fields.unshift(item)
+      } else {
+        fields.push(item)
+      }
+
+      legends.push({
+        value: item.name,
+        name: item.name,
+        marker: { symbol: item.chartType === 'bar' ? 'square' : 'hyphen', style: { stroke: item.color,fill: item.color, r: 5, lineWidth: 2 } }
+      })
+    })
+
+    fields.sort((a, b) => a.index - b.index)
+
+    const ds = new DataSet()
+    const dv = ds.createView().source(data)
+    dv.transform({
+      type: 'map',
+      callback(row) {
+        fields.forEach(line => {
+          row[line.name] = row[line.field]
+        })
+        return row
+      }
+    })
+
+    const chart = new Chart({
+      container: plot.uuid,
+      autoFit: true,
+      height: plot.height || 400
+    })
+
+    chart.data(dv.rows)
+
+    if (plot.coordinate !== 'polar' && barfields.length === 0) {
+      chart.scale(plot.Xaxis, {
+        range: [0, 1]
+      })
+    }
+
+    if (!plot.legend || plot.legend === 'hidden') {
+      chart.legend(false)
+    } else {
+      chart.legend({
+        custom: true,
+        position: plot.legend,
+        items: legends,
+      })
+    }
+
+    if (plot.tooltip !== 'true') {
+      chart.tooltip(false)
+    } else {
+      chart.tooltip({
+        shared: true
+      })
+    }
+
+    if (plot.transpose === 'true') {
+      chart.coordinate().transpose()
+    }
+
+    if (plot.coordinate === 'polar') {
+      chart.coordinate('polar', {
+        innerRadius: 0.1,
+        radius: 0.8
+      })
+    }
+
+    chart.scale({
+      nice: true
+    })
+
+    fields.forEach((item, i) => {
+      if (i === 0) {
+        chart.axis(item.name, {
+          grid: {},
+          title: {},
+          label: {}
+        })
+      } else if (i === 1 && item.axis !== 'unset') {
+        chart.axis(item.name, {
+          grid: null,
+          title: {},
+          label: {}
+        })
+      } else {
+        chart.axis(item.name, {
+          grid: null,
+          title: null,
+          label: null
+        })
+      }
+      
+      if (item.chartType === 'bar') {
+        let _chart = chart
+          .interval()
+          .position(`${plot.Xaxis}*${item.name}`)
+          .color(item.color)
+          .shape(item.shape)
+
+        if (item.label === 'true') {
+          _chart.label(item.name)
+        }
+      } else if (item.chartType === 'line') {
+        let _chart = chart
+          .line()
+          .position(`${plot.Xaxis}*${item.name}`)
+          .color(item.color)
+          .shape(item.shape)
+
+        if (item.label === 'true') {
+          _chart.label(item.name)
+        }
+
+        if (plot.point === 'true') {
+          chart
+            .point()
+            .position(`${plot.Xaxis}*${item.name}`)
+            .color(item.color)
+            .size(3)
+            .shape('circle')
+        }
+      }
+    })
+
+    chart.render()
+  }
+
+  barrender = () => {
+    const { card } = this.state
+
+    let plot = {...card.plot, height: card.setting.height - 70}
+
+    let transfield = {}
+    card.columns.forEach(col => {
+      if (col.field) {
+        transfield[col.field] = col.label
+      }
+    })
+    let X_axis = plot.Xaxis || 'x'
+    let Y_axis = plot.Yaxis || ['y']
+
+    let data = this.getdata(X_axis, Y_axis)
+    console.log(plot)
+    console.log(data)
+    
+    if (plot.enabled !== 'true') {
+      const ds = new DataSet()
+      const dv = ds.createView().source(data)
+  
+      dv.transform({
+        type: 'fold',
+        fields: [...Y_axis],
+        key: 'key',
+        value: 'value'
+      })
+  
+      if (plot.Xaxis) {
+        dv.transform({
+          type: 'map',
+          callback(row) {
+            row.key = transfield[row.key]
+            return row
+          },
+        })
+      }
+      
+      const chart = new Chart({
+        container: card.uuid,
+        autoFit: true,
+        height: plot.height || 400
+      })
+  
+      console.log(dv.rows)
+      chart.data(dv.rows)
+  
+      chart.scale('value', {
+        nice: true
+      })
+  
+      if (!plot.legend || plot.legend === 'hidden') {
+        chart.legend(false)
+      } else {
+        chart.legend({
+          position: plot.legend
+        })
+      }
+  
+      if (plot.tooltip !== 'true') {
+        chart.tooltip(false)
+      } else {
+        chart.tooltip({
+          shared: true
+        })
+      }
+  
+      if (plot.transpose === 'true') {
+        chart.coordinate().transpose()
+      }
+  
+      if (plot.coordinate === 'polar') {
+        chart.coordinate('polar', {
+          innerRadius: 0.1,
+          radius: 0.8
+        })
+      }
+  
+      if (plot.adjust !== 'stack') {
+        let _chart = chart
+          .interval()
+          .position(`${X_axis}*value`)
+          .color('key')
+          .adjust([
+            {
+              type: 'dodge',
+              marginRatio: 0
+            }
+          ])
+          .shape(plot.shape || 'rect')
+  
+        if (plot.label === 'true') {
+          _chart.label('value')
+        }
+      } else if (plot.adjust === 'stack') {
+        let _chart = chart
+          .interval()
+          .position(`${X_axis}*value`)
+          .color('key')
+          .adjust('stack')
+          .shape(plot.shape || 'rect')
+  
+        if (plot.label === 'true') {
+          _chart.label('value')
+        }
+      }
+  
+      chart.render()
+    } else {
+      this.customrender(data, transfield)
+    }
+  }
+
+  plotChange = (_plot) => {
+    const { config } = this.props
+
+    if (_plot.datatype === 'statistics') {
+      _plot.Yaxis = [_plot.InfoValue]
+    }
+    
+    let _charts = fromJS(config.charts).toJS()
+
+    _charts = _charts.map(item => {
+      if (item.uuid === _plot.uuid) {
+        if (!is(fromJS(item), fromJS(_plot))) {
+          let _element = document.getElementById(_plot.uuid)
+          if (_element) {
+            _element.innerHTML = ''
+          }
+        }
+        return _plot
+      }
+      return item
+    })
+
+    this.props.plotchange({...config, charts: _charts})
   }
 
   shouldComponentUpdate (nextProps, nextState) {
     return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
   }
 
-  onChange = (e) => {
-    const { rember } = this.state
-    e.stopPropagation()
-
+  updateComponent = (component) => {
     this.setState({
-      rember: !rember
+      card: component
     })
+    this.props.updateConfig(component)
   }
 
-  onChangeLang = (value) => {
-    this.setState({
-      lang: value
-    })
-  }
-
-  editLogo = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.logo.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.logo.uuid,
-      items: ['margin']
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editTitle = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.title.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.title.uuid,
-      items: ['font', 'margin'],
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editMsg = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.copyright.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.copyright.uuid,
-      items: ['font'],
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editLogin = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.login.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.login.uuid,
-      items: ['font', 'background', 'border', 'margin']
-    }
-    this.props.triggerEdit(element)
-  }
-
-  editBox = (e) => {
-    const { card } = this.props
-    e.stopPropagation()
-    let element = {
-      ...fromJS(card.box.style).toJS(),
-      componentId: card.uuid,
-      uuid: card.box.uuid,
-      items: ['font', 'padding', 'background'],
-    }
-    this.props.triggerEdit(element)
-  }
-
-  updateContent = (card) => {
-    Object.keys(card).forEach(key => {
-      if (card[key] === null) {
-        delete card[key]
-      }
-    })
-    this.props.updateConfig(card)
-  }
-
-  render () {
-    const { card, editId } = this.props
-    // const { getFieldProps } = this.props.form
-    const { rember } = this.state
-
-    if (!card.box) return null
-
-    let logoStyle = card.logo && card.logo.style ? fromJS(card.logo.style).toJS() : null
-    if (logoStyle && logoStyle.marginTop && /vh$/ig.test(logoStyle.marginTop)) {
-      let percent = parseInt(logoStyle.marginTop)
-      logoStyle.marginTop = `calc(${(percent / 100) * 615}px)`
-    }
-    if (logoStyle && logoStyle.marginBottom && /vh$/ig.test(logoStyle.marginBottom)) {
-      let percent = parseInt(logoStyle.marginBottom)
-      logoStyle.marginBottom = `calc(${(percent / 100) * 625}px)`
-    }
-
-    let titleStyle = card.title && card.title.style ? fromJS(card.title.style).toJS() : null
-    if (titleStyle && titleStyle.marginTop && /vh$/ig.test(titleStyle.marginTop)) {
-      let percent = parseInt(titleStyle.marginTop)
-      titleStyle.marginTop = `calc(${(percent / 100) * 615}px)`
-    }
-    if (titleStyle && titleStyle.marginBottom && /vh$/ig.test(titleStyle.marginBottom)) {
-      let percent = parseInt(titleStyle.marginBottom)
-      titleStyle.marginBottom = `calc(${(percent / 100) * 615}px)`
-    }
-    
-    let loginStyle = fromJS(card.login.style).toJS()
-    if (loginStyle.marginTop && /vh$/ig.test(loginStyle.marginTop)) {
-      let percent = parseInt(loginStyle.marginTop)
-      loginStyle.marginTop = `calc(${(percent / 100) * 615}px)`
-    }
-    if (loginStyle.marginBottom && /vh$/ig.test(loginStyle.marginBottom)) {
-      let percent = parseInt(loginStyle.marginBottom)
-      loginStyle.marginBottom = `calc(${(percent / 100) * 615}px)`
-    }
+  render() {
+    const { card } = this.state
+    const { config } = this.props
 
     return (
-      <div className="mob-login-1" onClick={this.editBox} style={card.box.style}>
-        {card.logo ? <div className={'logo ' + (editId === card.logo.uuid ? 'editing' : '')} style={logoStyle} onClick={this.editLogo}>
-          <ContentUpdate element={card.logo} updateContent={(ele) => this.updateContent({...card, logo: ele})}/>
-          <img src={card.logo.content} alt=""/>
-        </div> : null}
-        {card.title ? <div className={'plat-name ' + (editId === card.title.uuid ? 'editing' : '')} style={titleStyle} onClick={this.editTitle}>
-          <ContentUpdate element={card.title} updateContent={(ele) => this.updateContent({...card, title: ele})}/>
-          {card.title.content}
-        </div> : null}
-        <InputItem
-          placeholder={"UserName"}
-          prefixListCls="mk-login-item am-list"
-          disabled={true}
-        >
-          <Icon type="check-circle-o" />
-        </InputItem>
-        <InputItem
-          placeholder="Password"
-          prefixListCls="mk-login-item am-list"
-          type={'password'}
-          disabled={true}
-        >
-          <Icon type="check-circle" />
-        </InputItem>
-        <div className="other-setting">
-          <CheckboxItem checked={rember} onChange={this.onChange}>
-            <span onClick={this.onChange}>璁颁綇瀵嗙爜</span>
-          </CheckboxItem>
-          {/* <Picker data={langs} value={lang} cols={1} onChange={this.onChangeLang} className="forss">
-            <List.Item>{lang}</List.Item>
-          </Picker> */}
-          <List.Item className="lang">涓枃绠�浣�</List.Item>
-          <div className="clear-both"></div>
+      <div className="line-chart-edit-box" style={{height: card.setting.height || 400}}>
+        <SettingComponent
+          config={{...card, tables: config.tables}}
+          MenuID={config.uuid}
+          tableFields={config.tableFields || []}
+          permFuncField={config.permFuncField || []}
+          updateConfig={this.updateComponent}
+        />
+        <div className="chart-header">
+          <span className="chart-title">{card.setting.title || ''}</span>
+          <SearchComponent
+            menu={{MenuID: config.uuid, MenuName: config.MenuName}}
+            config={card}
+            sysRoles={config.sysRoles}
+            optionLibs={null}
+            updatesearch={this.updateComponent}
+          />
         </div>
-        <Button 
-          type="primary"
-          className={'login ' + (editId === card.login.uuid ? 'editing' : '')} 
-          onDoubleClick={() => this.props.doubleClickCard(card.login)}
-          style={loginStyle}
-          onClick={this.editLogin}
-        >
-          <ContentUpdate element={card.login} deletable={false} updateContent={(ele) => this.updateContent({...card, login: ele})}/>
-          {card.login.content}
-        </Button>
-        {card.copyright ? <div className={'company-msg ' + (editId === card.copyright.uuid ? 'editing' : '')} style={card.copyright.style} onClick={this.editMsg}>
-          <ContentUpdate element={card.copyright} updateContent={(ele) => this.updateContent({...card, copyright: ele})}/>
-          {card.copyright.content}
-        </div> : null}
+        <ActionComponent
+          menu={{ MenuID: config.uuid, MenuName: config.MenuName, MenuNo: config.MenuNo, fstMenuList: config.fstMenuList }}
+          config={card}
+          tabs={[]}
+          usefulFields={config.permFuncField || []}
+          // setSubConfig={(_btn) => this.setSubConfig(_btn, 'button')}
+          updateaction={this.updateComponent}
+        />
+        <div className="canvas" id={card.uuid}></div>
+        {/* <ChartCompileForm
+          plot={plot}
+          type={plot.chartType}
+          config={this.props.config}
+          dict={this.state.dict}
+          plotchange={this.plotChange}
+        /> */}
       </div>
     )
   }
 }
 
-// export default createForm()(MobLogin)
-export default MobLogin
\ No newline at end of file
+export default antvBarLineChart
\ No newline at end of file

--
Gitblit v1.8.0