pieConfigForm.jsx 4.7 KB

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