Unverified Commit 03e0ca45 authored by niko's avatar niko Committed by GitHub
parent d25b1121
import React, { PureComponent } from 'react';
import G2 from 'g2';
import Debounce from 'lodash-decorators/debounce';
import equal from '../equal';
import styles from '../index.less';
class Bar extends PureComponent {
state = {
autoHideXLabels: false,
}
componentDidMount() {
this.renderChart(this.props.data);
window.addEventListener('resize', this.resize);
}
componentWillReceiveProps(nextProps) {
......@@ -15,17 +22,53 @@ class Bar extends PureComponent {
}
componentWillUnmount() {
window.removeEventListener('resize', this.resize);
if (this.chart) {
this.chart.destroy();
}
}
@Debounce(200)
resize = () => {
if (!this.node) {
return;
}
const canvasWidth = this.node.parentNode.clientWidth;
const { data = [], autoLabel = true } = this.props;
if (!autoLabel) {
return;
}
const minWidth = data.length * 30;
const { autoHideXLabels } = this.state;
if (canvasWidth <= minWidth) {
if (!autoHideXLabels) {
this.setState({
autoHideXLabels: true,
});
this.renderChart(data);
}
} else if (autoHideXLabels) {
this.setState({
autoHideXLabels: false,
});
this.renderChart(data);
}
}
handleRef = (n) => {
this.node = n;
}
renderChart(data) {
const { height = 0, fit = true, color = 'rgba(24, 144, 255, 0.85)', margin = [32, 0, 32, 40] } = this.props;
const { autoHideXLabels } = this.state;
const {
height = 0,
fit = true,
color = 'rgba(24, 144, 255, 0.85)',
margin = [32, 0, (autoHideXLabels ? 8 : 32), 40],
} = this.props;
if (!data || (data && data.length < 1)) {
return;
......@@ -47,9 +90,17 @@ class Bar extends PureComponent {
},
});
chart.axis('x', {
title: false,
});
if (autoHideXLabels) {
chart.axis('x', {
title: false,
tickLine: false,
labels: false,
});
} else {
chart.axis('x', {
title: false,
});
}
chart.axis('y', {
title: false,
line: false,
......
import React from 'react';
import { Card } from 'antd';
import { Card, Spin } from 'antd';
import styles from './index.less';
const ChartCard = ({ contentHeight, title, action, total, footer, children, ...rest }) => (
<Card
bodyStyle={{ padding: '20px 24px 8px 24px' }}
{...rest}
>
const ChartCard = ({ loading, contentHeight, title, action, total, footer, children, ...rest }) => {
const content = (
<div className={styles.chartCard}>
<div className={styles.meta}>
<span className={styles.title}>{title}</span>
......@@ -30,7 +27,20 @@ const ChartCard = ({ contentHeight, title, action, total, footer, children, ...r
)
}
</div>
</Card>
);
);
return (
<Card
bodyStyle={{ padding: '20px 24px 8px 24px' }}
{...rest}
>
{
loading ? (
<Spin size="large">{content}</Spin>
) : content
}
</Card>
);
};
export default ChartCard;
......@@ -114,7 +114,7 @@ class MiniArea extends PureComponent {
return (
<div className={styles.miniChart} style={{ height }}>
<div>
<div className={styles.chartContent}>
<div ref={this.handleRef} />
</div>
</div>
......
......@@ -76,7 +76,7 @@ class MiniBar extends PureComponent {
return (
<div className={styles.miniChart} style={{ height }}>
<div>
<div className={styles.chartContent}>
<div ref={this.handleRef} />
</div>
</div>
......
.miniChart {
position: relative;
width: 100%;
& > div {
.chartContent {
position: absolute;
bottom: -34px;
width: 100%;
......@@ -10,4 +10,10 @@
overflow: hidden;
}
}
.chartLoading {
position: absolute;
top: 16px;
left: 50%;
margin-left: -7px;
}
}
......@@ -60,6 +60,7 @@ Ant Design Pro 提供的业务中常用的图表类型,都是基于 [G2](https
| margin | 图表内部间距 | array | \[32, 0, 32, 40\] |
| height | 图表高度 | number | - |
| data | 数据 | array<{x, y}> | - |
| autoLabel | 在宽度不足时,自动隐藏 x 轴的 label | boolean | `true` |
### Pie
......
......@@ -27,6 +27,7 @@ for (let i = 0; i < 7; i += 1) {
}))
export default class Analysis extends Component {
state = {
loading: true,
salesType: 'all',
currentTabKey: '',
rangePickerValue: [],
......@@ -35,6 +36,10 @@ export default class Analysis extends Component {
componentDidMount() {
this.props.dispatch({
type: 'chart/fetch',
}).then(() => {
this.setState({
loading: false,
});
});
}
......@@ -89,7 +94,7 @@ export default class Analysis extends Component {
}
render() {
const { rangePickerValue, salesType, currentTabKey } = this.state;
const { rangePickerValue, salesType, currentTabKey, loading } = this.state;
const { chart } = this.props;
const {
visitData,
......@@ -221,6 +226,7 @@ export default class Analysis extends Component {
<Row gutter={24}>
<Col {...topColResponsiveProps}>
<ChartCard
loading={loading}
bordered={false}
title="总销售额"
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>}
......@@ -238,6 +244,7 @@ export default class Analysis extends Component {
</Col>
<Col {...topColResponsiveProps}>
<ChartCard
loading={loading}
bordered={false}
title="访问量"
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>}
......@@ -254,6 +261,7 @@ export default class Analysis extends Component {
</Col>
<Col {...topColResponsiveProps}>
<ChartCard
loading={loading}
bordered={false}
title="支付笔数"
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>}
......@@ -269,6 +277,7 @@ export default class Analysis extends Component {
</Col>
<Col {...topColResponsiveProps}>
<ChartCard
loading={loading}
bordered={false}
title="运营活动效果"
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>}
......@@ -291,6 +300,7 @@ export default class Analysis extends Component {
</Row>
<Card
loading={loading}
bordered={false}
bodyStyle={{ padding: 0 }}
>
......@@ -359,8 +369,9 @@ export default class Analysis extends Component {
</Card>
<Row gutter={24}>
<Col lg={12} sm={24} xs={24}>
<Col xl={12} lg={24} md={24} sm={24} xs={24}>
<Card
loading={loading}
bordered={false}
title="线上热门搜索"
extra={iconGroup}
......@@ -417,8 +428,9 @@ export default class Analysis extends Component {
/>
</Card>
</Col>
<Col lg={12} sm={24} xs={24}>
<Col xl={12} lg={24} md={24} sm={24} xs={24}>
<Card
loading={loading}
className={styles.salesCard}
bordered={false}
title="销售额类别占比"
......@@ -452,6 +464,7 @@ export default class Analysis extends Component {
</Row>
<Card
loading={loading}
className={styles.offlineCard}
bordered={false}
bodyStyle={{ padding: '0 0 32px 0' }}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment