| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import React from 'react'
- import { Form, Select, Tag, Cascader, Dropdown, Menu } from 'antd'
- import { connect } from 'dva'
- import GAUGE from './gauge.json'
- const FormItem = Form.Item
- const { Option } = Select
- const ScatterConfigForm = ({ autoRefresh, chartDesigner, dispatch, formItemLayout }) => {
-
- const columns = chartDesigner.columns;
- return (
- <Form hideRequiredMark={true}>
- <FormItem label='横轴' {...formItemLayout}>
- <Cascader
- value={[chartDesigner.scatterConfig.xAxis.column.value, chartDesigner.scatterConfig.xAxis.granularity.value]}
- allowClear={true}
- showSearch={{
- filter: (inputValue, path) => {
- let p0 = path[0].label.toLowerCase();
- let v = inputValue.toLowerCase();
- return p0.indexOf(v) !== -1;
- },
- sort: (a, b, inputValue) => {
- return a[0].label.localeCompare(b[0].label,"zh");
- },
- render: (inputValue, path) => {
- const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
- let v = inputValue.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
- let label0 = (path[0].label.split(new RegExp(`(${v})`, 'i')).map((fragment, i) => {
- return (
- fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === v.toLowerCase() ?
- <span key={i} style={{fontWeight: 'bold', color: 'red'}} className="highlight">{fragment}</span> :
- fragment
- )
- }))
- return <div>{label0}>{path[1].label}</div>
- }
- }}
- options={columns.filter(c =>['scale', 'ordinal'].indexOf(c.type) !== -1).map((c, i)=>{
- return {
- type: c.type,
- value: c.name,
- label: c.label
- }
- })}
- onChange={(value, items) => {
- let column = {};
- let granularity = {};
- console.log('items', items)
- console.log('value', value)
- if(items.length > 0) {
- column = { type: items[0].type, value: items[0].value, label: items[0].label };
- }
- if(items.length > 1) {
- granularity = { value: items[1].value, label: items[1].label };
- }
- dispatch({ type: 'chartDesigner/changeField', name: 'scatterConfig', value: { ...chartDesigner.scatterConfig, xAxis: { column, granularity } }, autoRefresh });
- }}
- displayRender={(label, selectedOptions) => {
- let text = '';
- let className = 'cascader-label';
- if(label.length > 0) {
- className += ' full-label';
- text += label[0];
- if(label.length > 1) {
- text += '(' + label[1] + ')';
- }
- }else {
- className += ' empty-label';
- text = '请选择...';
- }
- return <div className={className}>{text}</div>;
- }}
- >
- </Cascader>
- </FormItem>
- <FormItem label='纵轴' {...formItemLayout}>
- <Cascader
- className='gauge-item'
- value={[chartDesigner.scatterConfig.yAxis.column.value, chartDesigner.scatterConfig.yAxis.gauge.value]}
- allowClear={true}
- showSearch={{
- filter: (inputValue, path) => {
- let p0 = path[0].label.toLowerCase();
- let v = inputValue.toLowerCase();
- return p0.indexOf(v) !== -1;
- },
- sort: (a, b, inputValue) => {
- return a[0].label.localeCompare(b[0].label,"zh");
- },
- render: (inputValue, path) => {
- const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
- let v = inputValue.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
- let label0 = (path[0].label.split(new RegExp(`(${v})`, 'i')).map((fragment, i) => {
- return (
- fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === v.toLowerCase() ?
- <span key={i} style={{fontWeight: 'bold', color: 'red'}} className="highlight">{fragment}</span> :
- fragment
- )
- }))
- return <div>{label0}>{path[1].label}</div>
- }
- }}
- options={columns.map((c, i)=>{
- return {
- type: c.type,
- value: c.name,
- label: c.label,
- children: GAUGE[chartDesigner.baseConfig.viewType].map(g => {
- if(g.columnType.indexOf(c.type) !== -1) {
- return g;
- }else {
- return null;
- }
- }).filter( g => g!==null)
- }
- })}
- onChange={(value, items) => {
- let column = {};
- let gauge = {};
- if(value.length > 0) {
- column = { type: items[0].type, value: items[0].value, label: items[0].label };
- gauge = { value: items[1].value, label: items[1].label };
- }
- dispatch({ type: 'chartDesigner/changeField', name: 'scatterConfig', value: { ...chartDesigner.scatterConfig, yAxis: { column, gauge } }, autoRefresh });
- }}
- displayRender={(label, selectedOptions) => {
- let menu = selectedOptions.length > 0 ? <Menu
- selectedKeys={[chartDesigner.scatterConfig.yAxis.gauge.value]}
- selectable={true}
- >
- {selectedOptions[0].children.map((c, i) => {
- return <Menu.Item data-value={c.value} data-label={c.label} key={c.value} onClick={(e) => {
- let value = e.domEvent.target.getAttribute('data-value');
- let label = e.domEvent.target.getAttribute('data-label');
- dispatch({ type: 'chartDesigner/changeField', name: 'scatterConfig', value: {
- ...chartDesigner.scatterConfig,
- yAxis: {
- column: chartDesigner.scatterConfig.yAxis.column,
- gauge: { value, label }
- }
- }, autoRefresh });
- e.domEvent.stopPropagation();
- }}>{c.label}</Menu.Item>
- })}
- </Menu>: [];
- let tag = selectedOptions.length > 0 ? <Dropdown
- trigger={['click']}
- overlay={menu}
- >
- <Tag size='small' onClick={(e) => {e.stopPropagation()}}>{label[1]}</Tag>
- </Dropdown>
- : null;
- return <div className={`cascader-label ${tag?'full' : 'empty'}-label`}>
- {tag}
- <span>{label[0] || '请选择...'}</span>
- </div>
- }}
- >
- </Cascader>
- </FormItem>
- <FormItem label='分组' {...formItemLayout}>
- <Select
- maxTagCount={1}
- labelInValue={true}
- allowClear={true}
- showSearch
- filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
- placeholder='请选择...'
- onChange={(value) => {
- const column = value ? columns.find(c => c.name === value.key) : null;
- const groupBy = column ? { ...value, type: column.type } : undefined;
- dispatch({ type: 'chartDesigner/changeField', name: 'scatterConfig', value: { ...chartDesigner.scatterConfig, groupBy }, autoRefresh });
- }}
- value={chartDesigner.scatterConfig.groupBy}
- >
- {columns.filter(c => c.groupable).map((c, i)=>{
- return (<Option key={i} value={c.name}>{c.label}</Option>)
- })}
- </Select>
- </FormItem>
- </Form>
- );
- }
- function mapStateToProps({ present: { chartDesigner } }) {
- return { chartDesigner: chartDesigner }
- }
- export default connect(mapStateToProps)(ScatterConfigForm);
|