|
|
@@ -1,8 +1,8 @@
|
|
|
import React from 'react'
|
|
|
import { connect } from 'dva'
|
|
|
-import { Collapse, Form, Checkbox, Select, Radio } from 'antd'
|
|
|
-import ColorPicker from '../../../common/colorPicker/index'
|
|
|
-import './bar.less'
|
|
|
+import { Input, InputNumber, Form, Checkbox, Select, Tooltip, Divider, Row, Col } from 'antd'
|
|
|
+import { deepAssign } from '../../../../utils/baseUtils'
|
|
|
+const FormItem = Form.Item;
|
|
|
|
|
|
class BarStyle extends React.Component {
|
|
|
|
|
|
@@ -13,100 +13,767 @@ class BarStyle extends React.Component {
|
|
|
labelCol: { span: 8 },
|
|
|
wrapperCol: { span: 16 },
|
|
|
},
|
|
|
- backgroundColor: '#ffffff', // 背景
|
|
|
- markTextColor: '#eeeeee', // 标签文字
|
|
|
- colors: [
|
|
|
- "#c23531",
|
|
|
- "#2f4554",
|
|
|
- "#61a0a8",
|
|
|
- "#d48265",
|
|
|
- "#91c7ae",
|
|
|
- "#749f83",
|
|
|
- "#ca8622",
|
|
|
- "#bda29a",
|
|
|
- "#6e7074",
|
|
|
- "#546570",
|
|
|
- "#c4ccd3"
|
|
|
- ], // 主题
|
|
|
}
|
|
|
}
|
|
|
|
|
|
render() {
|
|
|
- const { formItemLayout, backgroundColor, colors } = this.state;
|
|
|
+ const { formItemLayout } = this.state;
|
|
|
const { chartDesigner, dispatch } = this.props;
|
|
|
- const { styleConfig } = chartDesigner;
|
|
|
- const bar = styleConfig.bar || {};
|
|
|
+ const { styleConfig, chartOption, barConfig } = chartDesigner;
|
|
|
+ const { groupBy } = barConfig;
|
|
|
+ const barStyle = styleConfig.bar || {};
|
|
|
|
|
|
- return (
|
|
|
- <Collapse className='collapse-bar-style' defaultActiveKey={['chart', 'legend', 'color']}>
|
|
|
- <Collapse.Panel className='chart' header='基本配置' key='chart'>
|
|
|
- <Form>
|
|
|
- <Form.Item label='背景' {...formItemLayout}>
|
|
|
- <ColorPicker placeholder={'#ffffff'} value={backgroundColor} onChange={v => {
|
|
|
- this.setState({
|
|
|
- backgroundColor: v
|
|
|
- }, () => {
|
|
|
- window.clearTimeout(this.backgroundColorKey);
|
|
|
- this.backgroundColorKey = window.setTimeout(() => {
|
|
|
- dispatch({ type: 'chartDesigner/setField', name: 'styleConfig', value: {
|
|
|
- ...styleConfig,
|
|
|
- bar: { ...bar, backgroundColor: v }
|
|
|
- } });
|
|
|
- }, 200);
|
|
|
- });
|
|
|
- }}/>
|
|
|
- </Form.Item>
|
|
|
- <Form.Item label='主题' {...formItemLayout}>
|
|
|
- { colors.map((c, i) => <ColorPicker key={i} value={colors[i]} onChange={v => {
|
|
|
- colors[i] = v
|
|
|
- this.setState({
|
|
|
- colors,
|
|
|
- }, () => {
|
|
|
- window.clearTimeout(this['colors-' + i + '-key']);
|
|
|
- this['colors-' + i + '-key'] = window.setTimeout(() => {
|
|
|
- dispatch({ type: 'chartDesigner/setField', name: 'styleConfig', value: {
|
|
|
- ...styleConfig,
|
|
|
- bar: { ...bar, colors: colors }
|
|
|
- } });
|
|
|
- }, 200);
|
|
|
- });
|
|
|
- }}/>) }
|
|
|
- <div class="colors-control"><a onClick={() => {
|
|
|
-
|
|
|
- }}>增加</a><a>减少</a></div>
|
|
|
- </Form.Item>
|
|
|
- </Form>
|
|
|
- </Collapse.Panel>
|
|
|
- <Collapse.Panel header='图例' key='legend'>
|
|
|
- <Form>
|
|
|
- <Form.Item label='显示' {...formItemLayout}>
|
|
|
- <Checkbox onChange={(e) => {
|
|
|
- // const checked = e.target.checked;
|
|
|
- // dispatch({ type: 'chartDesigner/setField', name: 'styleConfig', value: { ...styleConfig, table: { ...table, bordered: checked }} });
|
|
|
- }}/>
|
|
|
- </Form.Item>
|
|
|
- <Form.Item label='位置' {...formItemLayout}>
|
|
|
- <Select>
|
|
|
- <Select.Option value='top'>顶部</Select.Option>
|
|
|
- <Select.Option value='left'>左侧</Select.Option>
|
|
|
- <Select.Option value='bottom'>右侧</Select.Option>
|
|
|
- <Select.Option value='right'>底部</Select.Option>
|
|
|
- </Select>
|
|
|
- </Form.Item>
|
|
|
- </Form>
|
|
|
- </Collapse.Panel>
|
|
|
- <Collapse.Panel header='颜色' key='color'>
|
|
|
- <Form>
|
|
|
- <Form.Item label='交替色' {...formItemLayout}>
|
|
|
- <Radio.Group>
|
|
|
- <Radio value={1}>行交替</Radio>
|
|
|
- <Radio value={2}>列交替</Radio>
|
|
|
- </Radio.Group>
|
|
|
- </Form.Item>
|
|
|
- </Form>
|
|
|
- </Collapse.Panel>
|
|
|
- </Collapse>
|
|
|
- )
|
|
|
+ return <Form>
|
|
|
+ <Divider>图域</Divider>
|
|
|
+ <Form.Item label='位置' {...formItemLayout}>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>上边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ key={`bar-grid-position-top-${barStyle.gridPosition ? barStyle.gridPosition['top'] : null}`}
|
|
|
+ defaultValue={barStyle.gridPosition ? barStyle.gridPosition['top'] : null}
|
|
|
+ placeholder={50}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendVisible = chartOption.legend.show,
|
|
|
+ legendOrient = chartOption.legend.orient,
|
|
|
+ legendTop = chartOption.legend.top;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { gridPosition: { top: value} } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { grid: {
|
|
|
+ top: (value && value !== 'auto') ? ( // 已设置图域上边距
|
|
|
+ value
|
|
|
+ ) : ( // 未设置图域上边距或设置自适应
|
|
|
+ (legendVisible) ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'horizontal' ? ( //图例排布方向为水平
|
|
|
+ legendTop === 'auto' ? 50 // 已知图例上边距未设置
|
|
|
+ : ( // 图例上边距已设置
|
|
|
+ (legendTop+'').endsWith('%') ? (10 + Number(legendTop.replace('%', '')) + '%') // 图例上边距为百分比,图域左边距增加10%
|
|
|
+ : (50 + Number(legendTop))// 图例上边距为数字,图域上边距增加50
|
|
|
+ )
|
|
|
+ ) : 50
|
|
|
+ ) : 50 // 图例隐藏
|
|
|
+ ),
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>下边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ key={`bar-grid-position-bottom-${barStyle.gridPosition ? barStyle.gridPosition['bottom'] : null}`}
|
|
|
+ defaultValue={barStyle.gridPosition ? barStyle.gridPosition['bottom'] : null}
|
|
|
+ placeholder={50}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendVisible = chartOption.legend.show,
|
|
|
+ legendOrient = chartOption.legend.orient,
|
|
|
+ legendTop = chartOption.legend.top,
|
|
|
+ legendBottom = chartOption.legend.bottom;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { gridPosition: { bottom: value} } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { grid: {
|
|
|
+ bottom: (value && value !== 'auto') ? ( // 已设置图域下边距
|
|
|
+ value
|
|
|
+ ) : ( // 未设置图域下边距或设置自适应
|
|
|
+ (legendVisible) ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'horizontal' ? ( //图例排布方向为水平
|
|
|
+ legendTop === 'auto' ? ( // 图例上边距未设置
|
|
|
+ legendBottom === 'auto' ? 50 // 已知图例下边距未设置
|
|
|
+ : ( // 图例下边距已设置
|
|
|
+ (legendBottom + '').endsWith('%') ? (10 + Number(legendBottom.replace('%', '')) + '%') // 图例下边距为百分比,图域下边距增加10%
|
|
|
+ : (50 + Number(legendBottom))// 图例下边距为数字,图域下边距增加50
|
|
|
+ )
|
|
|
+ ) : 50
|
|
|
+ ) : 50
|
|
|
+ ) : 50 // 图例隐藏
|
|
|
+ ),
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>左边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ key={`bar-grid-position-left-${barStyle.gridPosition ? barStyle.gridPosition['left'] : null}`}
|
|
|
+ defaultValue={barStyle.gridPosition ? barStyle.gridPosition['left'] : null}
|
|
|
+ placeholder='5%'
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendVisible = chartOption.legend.show,
|
|
|
+ legendOrient = chartOption.legend.orient,
|
|
|
+ legendLeft = chartOption.legend.left,
|
|
|
+ legendRight = chartOption.legend.right;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { gridPosition: { left: value} } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { grid: {
|
|
|
+ left: (value && value !== 'auto') ? ( // 已设置图域左边距
|
|
|
+ value
|
|
|
+ ) : ( // 未设置图域左边距或设置自适应
|
|
|
+ (legendVisible) ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'vertical' ? ( //图例排布方向为垂直
|
|
|
+ legendLeft === 'auto' ? ( // 已知图例左边距未设置
|
|
|
+ legendRight === 'auto' ? '10%' // 图例右边距也未设置,将靠左对齐,图域左边距增加
|
|
|
+ : '5%' // 图例右边距已设置
|
|
|
+ ) : ( // 图例左边距已设置
|
|
|
+ (legendLeft + '').endsWith('%') ? (10 + Number(legendLeft.replace('%', '')) + '%') // 图例左边距为百分比,图域左边距增加10%
|
|
|
+ : (100 + Number(legendLeft))// 图例左边距为数字,图域左边距增加100
|
|
|
+ )
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%' // 图例隐藏
|
|
|
+ ),
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>右边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ key={`bar-grid-position-right-${barStyle.gridPosition ? barStyle.gridPosition['right'] : null}`}
|
|
|
+ defaultValue={barStyle.gridPosition ? barStyle.gridPosition['right'] : null}
|
|
|
+ placeholder='5%'
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendVisible = chartOption.legend.show,
|
|
|
+ legendOrient = chartOption.legend.orient,
|
|
|
+ legendTop = chartOption.legend.top,
|
|
|
+ legendRight = chartOption.legend.right;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { gridPosition: { right: value} } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { grid: {
|
|
|
+ right: (value !== '' && value !== 'auto') ? ( // 已设置图域右边距
|
|
|
+ value
|
|
|
+ ) : ( // 未设置图域右边距或设置自适应
|
|
|
+ (legendVisible) ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'vertical' ? ( //图例排布方向为垂直
|
|
|
+ legendTop === 'auto' ? ( // 图例左边距未设置
|
|
|
+ legendRight === 'auto' ? '5%' // 已知图例右边距未设置
|
|
|
+ : ( // 图例右边距已设置
|
|
|
+ (legendRight + '').endsWith('%') ? (10 + Number(legendRight.replace('%', '')) + '%') // 图例右边距为百分比,图域右边距增加10%
|
|
|
+ : (100 + Number(legendRight))// 图例右边距为数字,图域右边距增加100
|
|
|
+ )
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%' // 图例隐藏
|
|
|
+ )
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </Form.Item>
|
|
|
+ <Divider>柱条</Divider>
|
|
|
+ <FormItem label={<Tooltip title="柱条的最大宽度,支持设置成绝对数值或相对于类目宽度的百分比">柱条最大宽度</Tooltip>} {...formItemLayout}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.barMaxWidth ? barStyle.barMaxWidth : null}
|
|
|
+ placeholder='50%'
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ barMaxWidth: value || '50%'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { barMaxWidth: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="柱条最小高度,可用于防止某数据项的值过小而影响交互">柱条最小高度</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.barMinHeight === '' || barStyle.barMinHeight === null || barStyle.barMinHeight === undefined) ? null : barStyle.barMinHeight}
|
|
|
+ placeholder={0}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ barMinHeight: value || 0
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { barMinHeight: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="柱间距离,为相对柱子宽度的百分比。如果想要分组的柱子重叠而不使用数据堆叠,可以设置为 '-100%'">柱间距离</Tooltip>} {...formItemLayout}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.barGap ? barStyle.barGap : null}
|
|
|
+ placeholder={'30%'}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ barGap: value || '30%'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { barGap: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <Divider>标注</Divider>
|
|
|
+ <FormItem label='显示' {...formItemLayout}>
|
|
|
+ <Checkbox
|
|
|
+ checked={!!barStyle.labelVisible}
|
|
|
+ onChange={e => {
|
|
|
+ let checked = e.target.checked;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ label: { normal: { show: checked } },
|
|
|
+ labelLine: { normal: { show: checked } }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { labelVisible: checked } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ {!!barStyle.labelVisible && <FormItem label={<Tooltip title="{a}:系列名 {b}:数据名 {c}:数据值">格式化</Tooltip>} {...formItemLayout}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.labelFormatter ? barStyle.labelFormatter : null}
|
|
|
+ placeholder={'{c}'}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ label: {
|
|
|
+ normal: { formatter: (value === '' || value === null || value === undefined) ? '{c}' : value }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { labelFormatter: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>}
|
|
|
+ {!!barStyle.labelVisible && <Form.Item label='位置' {...formItemLayout}>
|
|
|
+ <Select
|
|
|
+ defaultValue={barStyle.labelPosition || 'inside'}
|
|
|
+ onChange={(value, item) => {
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ label: { normal: { position: value } }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { labelPosition: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Select.Option value='top'>外上</Select.Option>
|
|
|
+ <Select.Option value='left'>外左</Select.Option>
|
|
|
+ <Select.Option value='right'>外右</Select.Option>
|
|
|
+ <Select.Option value='bottom'>外下</Select.Option>
|
|
|
+ <Select.Option value='inside'>内中</Select.Option>
|
|
|
+ <Select.Option value='insideLeft'>内左</Select.Option>
|
|
|
+ <Select.Option value='insideRight'>内右</Select.Option>
|
|
|
+ <Select.Option value='insideTop'>内上</Select.Option>
|
|
|
+ <Select.Option value='insideBottom'>内下</Select.Option>
|
|
|
+ <Select.Option value='insideTopLeft'>内上左</Select.Option>
|
|
|
+ <Select.Option value='insideBottomLeft'>内下左</Select.Option>
|
|
|
+ <Select.Option value='insideTopRight'>内上右</Select.Option>
|
|
|
+ <Select.Option value='insideBottomRight'>内下右</Select.Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>}
|
|
|
+ {!!barStyle.labelVisible && <FormItem label={<Tooltip title="标注相对设置位置方向的距离">位置距离</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.labelDistance === '' || barStyle.labelDistance === null || barStyle.labelDistance === undefined) ? null : barStyle.labelDistance}
|
|
|
+ placeholder={5}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ label: {
|
|
|
+ normal: { distance: (value === '' || value === null || value === undefined) ? 5 : Number(value) }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { labelDistance: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>}
|
|
|
+ {!!barStyle.labelVisible && <FormItem label={<Tooltip title="标注旋转度数,正值是逆时针">旋转</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.labelRotate === '' || barStyle.labelRotate === null || barStyle.labelRotate === undefined) ? null : barStyle.labelRotate}
|
|
|
+ placeholder={0}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ label: {
|
|
|
+ normal: { rotate: (value === '' || value === null || value === undefined) ? 0 : Number(value) }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { labelRotate: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>}
|
|
|
+ <Divider>横轴名称</Divider>
|
|
|
+ <FormItem label={<Tooltip title="名称相对横轴显示位置">位置</Tooltip>} {...formItemLayout}>
|
|
|
+ <Select
|
|
|
+ defaultValue={barStyle.xNameLocation || 'end'}
|
|
|
+ onChange={(value, item) => {
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xNameLocation: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ nameLocation: (value === '' || value === null || value === undefined) ? 'end' : value
|
|
|
+ }} }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Select.Option value='start'>头部</Select.Option>
|
|
|
+ <Select.Option value='center'>中间</Select.Option>
|
|
|
+ <Select.Option value='end'>尾部</Select.Option>
|
|
|
+ </Select>
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="横轴名称与横轴之间的距离">位置距离</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.xNameGap === '' || barStyle.xNameGap === null || barStyle.xNameGap === undefined) ? null : barStyle.xNameGap}
|
|
|
+ placeholder={15}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xNameGap: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ nameGap: (value === '' || value === null || value === undefined) ? 'end' : Number(value)
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="横轴名称旋转度数,正值是逆时针">旋转</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.xNameRotate === '' || barStyle.xNameRotate === null || barStyle.xNameRotate === undefined) ? null : barStyle.xNameRotate}
|
|
|
+ placeholder={0}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xNameRotate: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ nameRotate: (value === '' || value === null || value === undefined) ? 0 : Number(value)
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <Divider>横轴标签</Divider>
|
|
|
+ <FormItem label={<Tooltip title="当横轴标签文本全部显示会相互覆盖时可以隐藏部分标签文本">隐藏重叠标签</Tooltip>} {...formItemLayout}>
|
|
|
+ <Checkbox
|
|
|
+ checked={barStyle.xLabelHiddenCover === undefined ? true : barStyle.xLabelHiddenCover}
|
|
|
+ onChange={e => {
|
|
|
+ let checked = e.target.checked;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xLabelHiddenCover: checked } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ axisLabel: {
|
|
|
+ interval: checked ? 'auto' : 0
|
|
|
+ }
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ {/* <FormItem label={<Tooltip title="使横轴那些超长的标签文本不要占用太多空间">最大长度</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.xLabelMaxLength === '' || barStyle.xLabelMaxLength === null || barStyle.xLabelMaxLength === undefined) ? null : barStyle.xLabelMaxLength}
|
|
|
+ placeholder={8}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xLabelMaxLength: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ axisLabel: {
|
|
|
+ margin: (value === '' || value === null || value === undefined) ? 8 : Number(value)
|
|
|
+ }
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem> */}
|
|
|
+ <FormItem label={<Tooltip title="横轴标签与横轴之间的距离">位置距离</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.xLabelMargin === '' || barStyle.xLabelMargin === null || barStyle.xLabelMargin === undefined) ? null : barStyle.xLabelMargin}
|
|
|
+ placeholder={8}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xLabelMargin: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ axisLabel: {
|
|
|
+ margin: (value === '' || value === null || value === undefined) ? 8 : Number(value)
|
|
|
+ }
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="横轴标签旋转度数,正值是逆时针">旋转</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.xLabelRotate === '' || barStyle.xLabelRotate === null || barStyle.xLabelRotate === undefined) ? null : barStyle.xLabelRotate}
|
|
|
+ placeholder={0}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { xLabelRotate: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { xAxis: { 0: {
|
|
|
+ axisLabel: {
|
|
|
+ rotate: (value === '' || value === null || value === undefined) ? 0 : Number(value)
|
|
|
+ }
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <Divider>纵轴名称</Divider>
|
|
|
+ <FormItem label={<Tooltip title="名称相对纵轴显示位置">位置</Tooltip>} {...formItemLayout}>
|
|
|
+ <Select
|
|
|
+ defaultValue={barStyle.yNameLocation || 'end'}
|
|
|
+ onChange={(value, item) => {
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { yNameLocation: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { yAxis: { 0: {
|
|
|
+ nameLocation: (value === '' || value === null || value === undefined) ? 'end' : value,
|
|
|
+ }} }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Select.Option value='start'>头部</Select.Option>
|
|
|
+ <Select.Option value='center'>中间</Select.Option>
|
|
|
+ <Select.Option value='end'>尾部</Select.Option>
|
|
|
+ </Select>
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="纵轴名称与纵轴之间的距离">位置距离</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.yNameGap === '' || barStyle.yNameGap === null || barStyle.yNameGap === undefined) ? null : barStyle.yNameGap}
|
|
|
+ placeholder={15}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { yNameGap: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { yAxis: { 0: {
|
|
|
+ nameGap: (value === '' || value === null || value === undefined) ? 'end' : Number(value)
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ <FormItem label={<Tooltip title="纵轴名称旋转度数,正值是逆时针">旋转</Tooltip>} {...formItemLayout}>
|
|
|
+ <InputNumber
|
|
|
+ defaultValue={(barStyle.yNameRotate === '' || barStyle.yNameRotate === null || barStyle.yNameRotate === undefined) ? null : barStyle.yNameRotate}
|
|
|
+ placeholder={0}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { yNameRotate: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { yAxis: { 0: {
|
|
|
+ nameRotate: (value === '' || value === null || value === undefined) ? 0 : Number(value)
|
|
|
+ } } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>
|
|
|
+ {!!groupBy && !!groupBy.key && <Divider>数据堆叠</Divider>}
|
|
|
+ {!!groupBy && !!groupBy.key && <FormItem label='数据堆叠' {...formItemLayout}>
|
|
|
+ <Checkbox
|
|
|
+ checked={!!barStyle.stack}
|
|
|
+ onChange={e => {
|
|
|
+ let checked = e.target.checked;
|
|
|
+ let seriesArr = [];
|
|
|
+ for(let i = 0; i < chartOption.series.length; i++) {
|
|
|
+ seriesArr.push({
|
|
|
+ stack: checked
|
|
|
+ });
|
|
|
+ }
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { stack: checked } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { series: seriesArr }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </FormItem>}
|
|
|
+ {!!groupBy && !!groupBy.key && <Divider>图例</Divider>}
|
|
|
+ {!!groupBy && !!groupBy.key && <Row>
|
|
|
+ <Col span={!!barStyle.legendHidden ? 24 : 12}>
|
|
|
+ <Form.Item label='隐藏' labelCol={{ span: !!barStyle.legendHidden ? 8 : 16 }} wrapperCol={{ span: !!barStyle.legendHidden ? 16 : 8 }}>
|
|
|
+ <Checkbox
|
|
|
+ checked={!!barStyle.legendHidden}
|
|
|
+ onChange={e => {
|
|
|
+ let checked = e.target.checked;
|
|
|
+ let legendOrient = barStyle.legendOrient || 'vertical',
|
|
|
+ legendLeft = barStyle.legendPosition ? barStyle.legendPosition.left || 'auto' : 'auto',
|
|
|
+ legendRight = barStyle.legendPosition ? barStyle.legendPosition.right || '5%' : '5%',
|
|
|
+ legendTop = barStyle.legendPosition ? barStyle.legendPosition.top || 50 : 50,
|
|
|
+ legendBottom = barStyle.legendPosition ? barStyle.legendPosition.bottom || 50 : 50,
|
|
|
+ gridPositionLeft = checked ? '5%' : ( // 隐藏图例直接将图域左边距设为5%
|
|
|
+ legendOrient === 'vertical' ? ( // 图例排布方向为垂直
|
|
|
+ legendLeft === 'auto' ? ( // 已知图例左边距未设置
|
|
|
+ legendRight === 'auto' ? '10%' // 图例右边距也未设置,将靠左对齐,图域左边距增加
|
|
|
+ : '5%' // 图例右边距已设置
|
|
|
+ ) : ( // 图例左边距已设置
|
|
|
+ (legendLeft + '').endsWith('%') ? (10 + Number(legendLeft.replace('%', '')) + '%') // 图例左边距为百分比,图域左边距增加10%
|
|
|
+ : (100 + Number(legendLeft))// 图例左边距为数字,图域左边距增加100
|
|
|
+ )
|
|
|
+ ) : '5%'
|
|
|
+ ),
|
|
|
+ gridPositionRight = checked ? '5%' : ( // 隐藏图例直接将图域右边距设为5%
|
|
|
+ legendOrient === 'vertical' ? ( // 图例排布方向为垂直
|
|
|
+ legendLeft === 'auto' ? (
|
|
|
+ legendRight === 'auto' ? '5%' // 已知图例右边距未设置
|
|
|
+ : ( // 图例右边距已设置
|
|
|
+ (legendRight + '').endsWith('%') ? (10 + Number(legendRight.replace('%', '')) + '%') // 图例右边距为百分比,图域右边距增加10%
|
|
|
+ : (100 + Number(legendRight))// 图例右边距为数字,图域右边距增加100
|
|
|
+ )
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%'
|
|
|
+ ),
|
|
|
+ gridPositionTop = checked ? 50: ( // 图例未隐藏
|
|
|
+ legendOrient === 'horizontal' ? ( // 图例排布方向为水平
|
|
|
+ legendTop === 'auto' ? ( // 已知图例上边距未设置
|
|
|
+ legendBottom === 'auto' ? 50 // 图例下边距也未设置,将靠上对齐,图域上边距保持50
|
|
|
+ : 50 // 图例下边距已设置
|
|
|
+ ) : ( // 图例上边距已设置
|
|
|
+ (legendTop + '').endsWith('%') ? (10 + Number(legendTop.replace('%', '')) + '%') // 图例上边距为百分比,图域上边距增加10%
|
|
|
+ : (50 + Number(legendTop))// 图例上边距为数字,图域上边距增加50
|
|
|
+ )
|
|
|
+ ) : 50
|
|
|
+ ),
|
|
|
+ gridPositionBottom = checked ? 50 : ( // 图例未隐藏
|
|
|
+ legendOrient === 'horizontal' ? ( // 图例排布方向为水平
|
|
|
+ legendTop === 'auto' ? ( // 图例上边距未设置
|
|
|
+ legendBottom === 'auto' ? 50 // 已知图例下边距未设置
|
|
|
+ : ( // 图例下边距已设置
|
|
|
+ (legendBottom + '').endsWith('%') ? (10 + Number(legendBottom.replace('%', '')) + '%') // 图例下边距为百分比,图域下边距增加10%
|
|
|
+ : (50 + Number(legendBottom))// 图例下边距为数字,图域下边距增加50
|
|
|
+ )
|
|
|
+ ) : 50
|
|
|
+ ) : 50
|
|
|
+ );
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendHidden: checked, gridPosition: {
|
|
|
+ left: gridPositionLeft,
|
|
|
+ right: gridPositionRight,
|
|
|
+ top: gridPositionTop,
|
|
|
+ bottom: gridPositionBottom,
|
|
|
+ } } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: { show: !checked }, grid: {
|
|
|
+ left: gridPositionLeft,
|
|
|
+ right: gridPositionRight,
|
|
|
+ top: gridPositionTop,
|
|
|
+ bottom: gridPositionBottom,
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ {!!groupBy && !!groupBy.key && !barStyle.legendHidden && <Col span={12}>
|
|
|
+ <Form.Item label='分页' labelCol={{ span: 16 }} wrapperCol={{ span: 8 }}>
|
|
|
+ <Checkbox
|
|
|
+ checked={!!barStyle.legendInPagination}
|
|
|
+ onChange={e => {
|
|
|
+ let checked = e.target.checked;
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendInPagination: checked } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: { type: checked ? 'scroll' : 'plain' } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Form.Item>
|
|
|
+ </Col>}
|
|
|
+ </Row>}
|
|
|
+ {!!groupBy && !!groupBy.key && !barStyle.legendHidden && <Form.Item label='排布方向' {...formItemLayout}>
|
|
|
+ <Select
|
|
|
+ defaultValue={barStyle.legendOrient || 'vertical'}
|
|
|
+ onChange={(value, item) => {
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendOrient: value } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: { orient: value } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Select.Option value='vertical'>纵向排布</Select.Option>
|
|
|
+ <Select.Option value='horizontal'>横向排布</Select.Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>}
|
|
|
+ {!!groupBy && !!groupBy.key && !barStyle.legendHidden && <Form.Item label='位置' {...formItemLayout}>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>上边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.legendPosition ? barStyle.legendPosition['top'] : null}
|
|
|
+ placeholder={50}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendHidden = barStyle.legendHidden,
|
|
|
+ legendOrient = barStyle.legendOrient || 'vertical',
|
|
|
+ legendTop = (value === '' || value === null || value === undefined) ? 50 : value,
|
|
|
+ legendBottom = barStyle.legendPosition ? barStyle.legendPosition.bottom || 50 : 50,
|
|
|
+ gridPositionTop = !legendHidden ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'horizontal' ? ( // 图例排布方向为水平
|
|
|
+ legendTop === 'auto' ? ( // 已知图例上边距未设置
|
|
|
+ legendBottom === 'auto' ? 50 // 图例下边距也未设置,将靠上对齐,图域上边距保持50
|
|
|
+ : 50 // 图例下边距已设置
|
|
|
+ ) : ( // 图例上边距已设置
|
|
|
+ (legendTop + '').endsWith('%') ? (10 + Number(legendTop.replace('%', '')) + '%') // 图例上边距为百分比,图域上边距增加10%
|
|
|
+ : (50 + Number(legendTop))// 图例上边距为数字,图域上边距增加50
|
|
|
+ )
|
|
|
+ ) : 50
|
|
|
+ ) : 50 // 图例隐藏
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendPosition: { top: value}, gridPosition: { top: gridPositionTop } } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: {
|
|
|
+ top: legendTop,
|
|
|
+ }, grid: {
|
|
|
+ top: gridPositionTop
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>下边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.legendPosition ? barStyle.legendPosition['bottom'] : null}
|
|
|
+ placeholder={50}
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendHidden = barStyle.legendHidden,
|
|
|
+ legendOrient = barStyle.legendOrient || 'vertical',
|
|
|
+ legendTop = barStyle.legendPosition ? barStyle.legendPosition.top || 50 : 50,
|
|
|
+ legendBottom = (value === '' || value === null || value === undefined) ? 50 : value,
|
|
|
+ gridPositionBottom = !legendHidden ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'horizontal' ? ( // 图例排布方向为水平
|
|
|
+ legendTop === 'auto' ? ( // 图例上边距未设置
|
|
|
+ legendBottom === 'auto' ? 50 // 已知图例下边距未设置
|
|
|
+ : ( // 图例下边距已设置
|
|
|
+ (legendBottom + '').endsWith('%') ? (10 + Number(legendBottom.replace('%', '')) + '%') // 图例下边距为百分比,图域下边距增加10%
|
|
|
+ : (50 + Number(legendBottom))// 图例下边距为数字,图域下边距增加50
|
|
|
+ )
|
|
|
+ ) : 50
|
|
|
+ ) : 50
|
|
|
+ ) : 50 // 图例隐藏
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendPosition: { bottom: value}, gridPosition: { bottom: gridPositionBottom } } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: {
|
|
|
+ bottom: legendBottom
|
|
|
+ }, grid: {
|
|
|
+ bottom: gridPositionBottom
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>左边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.legendPosition ? barStyle.legendPosition['left'] : null}
|
|
|
+ placeholder='auto'
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendHidden = barStyle.legendHidden,
|
|
|
+ legendOrient = barStyle.legendOrient || 'vertical',
|
|
|
+ legendLeft = (value === '' || value === null || value === undefined) ? 'auto' : value,
|
|
|
+ legendRight = barStyle.legendPosition ? barStyle.legendPosition.right || '5%' : '5%',
|
|
|
+ gridPositionLeft = !legendHidden ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'vertical' ? ( // 图例排布方向为垂直
|
|
|
+ legendLeft === 'auto' ? ( // 已知图例左边距未设置
|
|
|
+ legendRight === 'auto' ? '10%' // 图例右边距也未设置,将靠左对齐,图域左边距增加
|
|
|
+ : '5%' // 图例右边距已设置
|
|
|
+ ) : ( // 图例左边距已设置
|
|
|
+ (legendLeft + '').endsWith('%') ? (10 + Number(legendLeft.replace('%', '')) + '%') // 图例左边距为百分比,图域左边距增加10%
|
|
|
+ : (100 + Number(legendLeft))// 图例左边距为数字,图域左边距增加100
|
|
|
+ )
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%' // 图例隐藏
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendPosition: { left: value }, gridPosition: { left: gridPositionLeft } } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: {
|
|
|
+ left: legendLeft
|
|
|
+ }, grid: {
|
|
|
+ left: gridPositionLeft
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row>
|
|
|
+ <Col span={8}>右边距:</Col>
|
|
|
+ <Col span={16}>
|
|
|
+ <Input
|
|
|
+ defaultValue={barStyle.legendPosition ? barStyle.legendPosition['right'] : null}
|
|
|
+ placeholder='5%'
|
|
|
+ onBlur={e => {
|
|
|
+ let value = e.target.value;
|
|
|
+ let legendHidden = barStyle.legendHidden,
|
|
|
+ legendOrient = barStyle.legendOrient || 'vertical',
|
|
|
+ legendLeft = barStyle.legendPosition ? barStyle.legendPosition.left || 'auto' : 'auto',
|
|
|
+ legendRight = (value === '' || value === null || value === undefined) ? '5%' : value,
|
|
|
+ gridPositionRight = !legendHidden ? ( // 图例未隐藏
|
|
|
+ legendOrient === 'vertical' ? ( // 图例排布方向为垂直
|
|
|
+ legendLeft === 'auto' ? ( // 图例左边距未设置
|
|
|
+ legendRight === 'auto' ? '5%' // 已知图例右边距未设置
|
|
|
+ : ( // 图例右边距已设置
|
|
|
+ (legendRight + '').endsWith('%') ? (10 + Number(legendRight.replace('%', '')) + '%') // 图例右边距为百分比,图域右边距增加10%
|
|
|
+ : (100 + Number(legendRight))// 图例右边距为数字,图域右边距增加100
|
|
|
+ )
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%'
|
|
|
+ ) : '5%' // 图例隐藏
|
|
|
+ dispatch({ type: 'chartDesigner/setFields', fields: [
|
|
|
+ { name: 'styleConfig', value: deepAssign(styleConfig, { bar: { legendPosition: { right: value}, gridPosition: { right: gridPositionRight } } }) },
|
|
|
+ { name: 'chartOption', value: deepAssign(chartOption, { legend: {
|
|
|
+ right: legendRight
|
|
|
+ }, grid: {
|
|
|
+ right: gridPositionRight
|
|
|
+ } }) },
|
|
|
+ ] });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </Form.Item>}
|
|
|
+ </Form>
|
|
|
}
|
|
|
}
|
|
|
|