barConfigForm.jsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 barConfigForm = ({ 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. {/* <Select
  28. value={chartDesigner.barConfig.xAxis}
  29. allowClear={true}
  30. placeholder='请选择...'
  31. labelInValue={true}
  32. onChange={(value) => {
  33. dispatch({ type: 'chartDesigner/setModel', name: 'barConfig', value: { ...chartDesigner.barConfig, xAxis: value } });
  34. }}
  35. >
  36. {columns.filter(c => ['ordinal', 'categorical'].indexOf(c.type)!=-1).map((c, i)=>{
  37. return (<Option key={i} value={c.name}>{c.label}</Option>)
  38. })}
  39. </Select> */}
  40. <Cascader
  41. className='barconfig-yaxis'
  42. value={[chartDesigner.barConfig.xAxis.column.value, chartDesigner.barConfig.xAxis.granularity.value]}
  43. allowClear={true}
  44. options={columns.filter(c =>['ordinal', 'categorical', 'time'].indexOf(c.type) != -1).map((c, i)=>{
  45. return {
  46. type: c.type,
  47. value: c.name,
  48. label: c.label,
  49. children: granularity[c.type]
  50. }
  51. })}
  52. onChange={(value, items) => {
  53. let column = {};
  54. let granularity = {};
  55. if(value.length > 0) {
  56. column = { type: items[0].type, value: items[0].value, label: items[0].label };
  57. }
  58. if(items.length > 1) {
  59. granularity = { value: items[1].value, label: items[1].label };
  60. }
  61. dispatch({ type: 'chartDesigner/setModel', name: 'barConfig', value: { ...chartDesigner.barConfig, xAxis: { column, granularity } } });
  62. }}
  63. displayRender={(label, selectedOptions) => {
  64. let text = '';
  65. let className = 'cascader-label';
  66. if(label.length > 0) {
  67. className += ' full-label';
  68. text += label[0];
  69. if(label.length > 1) {
  70. text += '(' + label[1] + ')';
  71. }
  72. }else {
  73. className += ' empty-label';
  74. text = '请选择...';
  75. }
  76. return <div className={className}>{text}</div>;
  77. }}
  78. >
  79. </Cascader>
  80. </FormItem>
  81. <FormItem label='纵轴' {...formItemLayout}>
  82. <Cascader
  83. className='barconfig-yaxis'
  84. value={[chartDesigner.barConfig.yAxis.column.value, chartDesigner.barConfig.yAxis.gauge.value]}
  85. allowClear={true}
  86. options={columns.filter(c =>c.type == 'scale').map((c, i)=>{
  87. return {
  88. value: c.name,
  89. label: c.label,
  90. children: gauge
  91. }
  92. })}
  93. onChange={(value, items) => {
  94. let column = {};
  95. let gauge = {};
  96. if(value.length > 0) {
  97. column = { value: items[0].value, label: items[0].label };
  98. gauge = { value: items[1].value, label: items[1].label };
  99. }
  100. dispatch({ type: 'chartDesigner/setModel', name: 'barConfig', value: { ...chartDesigner.barConfig, yAxis: { column, gauge } } });
  101. }}
  102. displayRender={(label, selectedOptions) => {
  103. let menu = selectedOptions.length > 0 ? <Menu
  104. selectedKeys={[chartDesigner.barConfig.yAxis.gauge.value]}
  105. selectable={true}
  106. >
  107. {selectedOptions[0].children.map((c, i) => {
  108. return <Menu.Item data-value={c.value} data-label={c.label} key={c.value} onClick={(e) => {
  109. let value = e.domEvent.target.getAttribute('data-value');
  110. let label = e.domEvent.target.getAttribute('data-label');
  111. dispatch({ type: 'chartDesigner/setModel', name: 'barConfig', value: {
  112. ...chartDesigner.barConfig,
  113. yAxis: {
  114. column: chartDesigner.barConfig.yAxis.column,
  115. gauge: { value, label }
  116. }
  117. }});
  118. e.domEvent.stopPropagation();
  119. }}>{c.label}</Menu.Item>
  120. })}
  121. </Menu>: [];
  122. let tag = selectedOptions.length > 0 ? <Dropdown
  123. trigger={['click']}
  124. overlay={menu}
  125. >
  126. <Tag size='small' onClick={(e) => {e.stopPropagation()}}>{label[1]}</Tag>
  127. </Dropdown>
  128. : null;
  129. return <div className={`cascader-label ${tag?'full' : 'empty'}-label`}>
  130. {tag}
  131. <span>{label[0] || '请选择...'}</span>
  132. </div>
  133. }}
  134. >
  135. </Cascader>
  136. </FormItem>
  137. </Form>
  138. );
  139. }
  140. function mapStateToProps({ present: { chartDesigner } }) {
  141. return { chartDesigner: chartDesigner }
  142. }
  143. export default connect(mapStateToProps)(barConfigForm);