lineConfigForm.jsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import React from 'react'
  2. import { Form, Select, Tag, Cascader, Dropdown, Menu } from 'antd'
  3. import { connect } from 'dva'
  4. import '../../../models/chartDesigner'
  5. import GAUGE from './gauge.json'
  6. const FormItem = Form.Item
  7. const { Option } = Select
  8. const LineConfigForm = ({ chartDesigner, dispatch, formItemLayout }) => {
  9. const columns = chartDesigner.columns;
  10. return (
  11. <Form hideRequiredMark={true}>
  12. <FormItem label='横轴' {...formItemLayout}>
  13. <Cascader
  14. value={[chartDesigner.lineConfig.xAxis.column.value, chartDesigner.lineConfig.xAxis.granularity.value]}
  15. allowClear={true}
  16. options={columns.filter(c =>['time'].indexOf(c.type) !== -1).map((c, i)=>{
  17. return {
  18. type: c.type,
  19. value: c.name,
  20. label: c.label
  21. }
  22. })}
  23. onChange={(value, items) => {
  24. let column = {};
  25. let granularity = {};
  26. console.log('items', items)
  27. console.log('value', value)
  28. if(items.length > 0) {
  29. column = { type: items[0].type, value: items[0].value, label: items[0].label };
  30. }
  31. if(items.length > 1) {
  32. granularity = { value: items[1].value, label: items[1].label };
  33. }
  34. dispatch({ type: 'chartDesigner/changeField', name: 'lineConfig', value: { ...chartDesigner.lineConfig, xAxis: { column, granularity } } });
  35. }}
  36. displayRender={(label, selectedOptions) => {
  37. let text = '';
  38. let className = 'cascader-label';
  39. if(label.length > 0) {
  40. className += ' full-label';
  41. text += label[0];
  42. if(label.length > 1) {
  43. text += '(' + label[1] + ')';
  44. }
  45. }else {
  46. className += ' empty-label';
  47. text = '请选择...';
  48. }
  49. return <div className={className}>{text}</div>;
  50. }}
  51. >
  52. </Cascader>
  53. </FormItem>
  54. <FormItem label='纵轴' {...formItemLayout}>
  55. <Cascader
  56. className='gauge-item'
  57. value={[chartDesigner.lineConfig.yAxis.column.value, chartDesigner.lineConfig.yAxis.gauge.value]}
  58. allowClear={true}
  59. options={columns.map((c, i)=>{
  60. return {
  61. value: c.name,
  62. label: c.label,
  63. children: GAUGE[chartDesigner.baseConfig.viewType].map(g => {
  64. if(g.columnType.indexOf(c.type) !== -1) {
  65. return g;
  66. }else {
  67. return null;
  68. }
  69. }).filter( g => g!==null)
  70. }
  71. })}
  72. onChange={(value, items) => {
  73. let column = {};
  74. let gauge = {};
  75. if(value.length > 0) {
  76. column = { type: items[0].type, value: items[0].value, label: items[0].label };
  77. gauge = { value: items[1].value, label: items[1].label };
  78. }
  79. dispatch({ type: 'chartDesigner/changeField', name: 'lineConfig', value: { ...chartDesigner.lineConfig, yAxis: { column, gauge } } });
  80. }}
  81. displayRender={(label, selectedOptions) => {
  82. let menu = selectedOptions.length > 0 ? <Menu
  83. selectedKeys={[chartDesigner.lineConfig.yAxis.gauge.value]}
  84. selectable={true}
  85. >
  86. {selectedOptions[0].children.map((c, i) => {
  87. return <Menu.Item data-value={c.value} data-label={c.label} key={c.value} onClick={(e) => {
  88. let value = e.domEvent.target.getAttribute('data-value');
  89. let label = e.domEvent.target.getAttribute('data-label');
  90. dispatch({ type: 'chartDesigner/changeField', name: 'lineConfig', value: {
  91. ...chartDesigner.lineConfig,
  92. yAxis: {
  93. column: chartDesigner.lineConfig.yAxis.column,
  94. gauge: { value, label }
  95. }
  96. }});
  97. e.domEvent.stopPropagation();
  98. }}>{c.label}</Menu.Item>
  99. })}
  100. </Menu>: [];
  101. let tag = selectedOptions.length > 0 ? <Dropdown
  102. trigger={['click']}
  103. overlay={menu}
  104. >
  105. <Tag size='small' onClick={(e) => {e.stopPropagation()}}>{label[1]}</Tag>
  106. </Dropdown>
  107. : null;
  108. return <div className={`cascader-label ${tag?'full' : 'empty'}-label`}>
  109. {tag}
  110. <span>{label[0] || '请选择...'}</span>
  111. </div>
  112. }}
  113. >
  114. </Cascader>
  115. </FormItem>
  116. <FormItem label='分组' {...formItemLayout}>
  117. <Select
  118. maxTagCount={1}
  119. labelInValue={true}
  120. allowClear={true}
  121. placeholder='请选择...'
  122. onChange={(value) => {
  123. // value = value.splice(-1);
  124. dispatch({ type: 'chartDesigner/changeField', name: 'lineConfig', value: { ...chartDesigner.lineConfig, groupBy: value } });
  125. }}
  126. value={chartDesigner.lineConfig.groupBy}
  127. >
  128. {columns.filter(c => c.type === 'categorical').map((c, i)=>{
  129. return (<Option key={i} value={c.name}>{c.label}</Option>)
  130. })}
  131. </Select>
  132. </FormItem>
  133. </Form>
  134. );
  135. }
  136. function mapStateToProps({ present: { chartDesigner } }) {
  137. return { chartDesigner: chartDesigner }
  138. }
  139. export default connect(mapStateToProps)(LineConfigForm);