Commit 4cd91ff9 by corpglory-dev

Render svg instead of canvas

parent d2843879
...@@ -26,7 +26,7 @@ export interface Props extends Themeable { ...@@ -26,7 +26,7 @@ export interface Props extends Themeable {
} }
export class Piechart extends PureComponent<Props> { export class Piechart extends PureComponent<Props> {
canvasElement: any; containerElement: any;
static defaultProps = { static defaultProps = {
pieType: 'pie', pieType: 'pie',
...@@ -50,46 +50,51 @@ export class Piechart extends PureComponent<Props> { ...@@ -50,46 +50,51 @@ export class Piechart extends PureComponent<Props> {
const data = datapoints.map(datapoint => datapoint.value); const data = datapoints.map(datapoint => datapoint.value);
const colors = datapoints.map(datapoint => datapoint.color); const colors = datapoints.map(datapoint => datapoint.color);
const width = this.canvasElement.width; const width = this.containerElement.offsetWidth;
const height = this.canvasElement.height; const height = this.containerElement.offsetHeight;
const radius = Math.min(width, height) / 2; const radius = Math.min(width, height) / 2;
const innerRadius = pieType === PiechartType.PIE ? 0 : radius; const innerRadius = pieType === PiechartType.PIE ? 0 : radius;
const context = this.canvasElement.getContext('2d'); d3.select('.piechart-container svg').remove();
context.translate(width / 2, height / 2); const svg = d3.select('.piechart-container')
context.globalAlpha = 0.5; .append('svg')
.attr('width', width)
const pie = d3.pie(); .attr('height', height)
.attr('class', 'shadow')
.append('g')
.attr('transform', `translate(${width / 2},${height / 2})`);
const arcs = pie(data);
const arc = d3 const arc = d3
.arc() .arc()
.outerRadius(radius - 10) .outerRadius(radius - 10)
.innerRadius(innerRadius) .innerRadius(innerRadius)
.padAngle(0.03) .padAngle(0);
.context(context);
const pie = d3.pie();
arcs.forEach((d, idx) => {
context.beginPath(); svg.selectAll('path')
arc(d as any); .data(pie(data))
context.fillStyle = colors[idx]; .enter()
context.fill(); .append('path')
}); .attr('d', arc as any)
.attr('fill', (d: any, i: any) => {
context.globalAlpha = 1; return colors[i];
context.beginPath(); })
arcs.forEach(arc as any); .style('fill-opacity', 0.15)
context.lineWidth = strokeWidth; .style('stroke', (d: any, i: any) => {
context.stroke(); return colors[i];
})
.style('stroke-width', `${strokeWidth}px`);
} }
render() { render() {
const { height, width } = this.props; const { height, width } = this.props;
return ( return (
<div className="piechart-panel"> <div className='piechart-panel'>
<div <div
ref={element => (this.containerElement = element)}
className='piechart-container'
style={{ style={{
height: `${height * 0.9}px`, height: `${height * 0.9}px`,
width: `${Math.min(width, height * 1.3)}px`, width: `${Math.min(width, height * 1.3)}px`,
...@@ -97,7 +102,6 @@ export class Piechart extends PureComponent<Props> { ...@@ -97,7 +102,6 @@ export class Piechart extends PureComponent<Props> {
margin: 'auto', margin: 'auto',
}} }}
> >
<canvas ref={element => (this.canvasElement = element)} />
</div> </div>
</div> </div>
); );
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
canvas { svg {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
......
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