|
|
@@ -1,5 +1,5 @@
|
|
|
import React, { PureComponent } from 'react';
|
|
|
-import * as d3 from 'd3';
|
|
|
+import { select, pie, arc, event } from 'd3';
|
|
|
|
|
|
import { GrafanaThemeType } from '../../types';
|
|
|
import { Themeable } from '../../index';
|
|
|
@@ -58,9 +58,8 @@ export class Piechart extends PureComponent<Props> {
|
|
|
const outerRadius = radius - radius / 10;
|
|
|
const innerRadius = pieType === PiechartType.PIE ? 0 : radius - radius / 3;
|
|
|
|
|
|
- d3.select('.piechart-container svg').remove();
|
|
|
- const svg = d3
|
|
|
- .select('.piechart-container')
|
|
|
+ select('.piechart-container svg').remove();
|
|
|
+ const svg = select('.piechart-container')
|
|
|
.append('svg')
|
|
|
.attr('width', width)
|
|
|
.attr('height', height)
|
|
|
@@ -68,42 +67,38 @@ export class Piechart extends PureComponent<Props> {
|
|
|
.append('g')
|
|
|
.attr('transform', `translate(${width / 2},${height / 2})`);
|
|
|
|
|
|
- const arc = d3
|
|
|
- .arc()
|
|
|
+ const pieChart = pie();
|
|
|
+
|
|
|
+ const customArc = arc()
|
|
|
.outerRadius(outerRadius)
|
|
|
.innerRadius(innerRadius)
|
|
|
.padAngle(0);
|
|
|
|
|
|
- const pie = d3.pie();
|
|
|
-
|
|
|
svg
|
|
|
.selectAll('path')
|
|
|
- .data(pie(data))
|
|
|
+ .data(pieChart(data))
|
|
|
.enter()
|
|
|
.append('path')
|
|
|
- .attr('d', arc as any)
|
|
|
- .attr('fill', (d: any, idx: number) => {
|
|
|
- return colors[idx];
|
|
|
- })
|
|
|
+ .attr('d', customArc as any)
|
|
|
+ .attr('fill', (d: any, idx: number) => colors[idx])
|
|
|
.style('fill-opacity', 0.15)
|
|
|
- .style('stroke', (d: any, idx: number) => {
|
|
|
- return colors[idx];
|
|
|
- })
|
|
|
+ .style('stroke', (d: any, idx: number) => colors[idx])
|
|
|
.style('stroke-width', `${strokeWidth}px`)
|
|
|
.on('mouseover', (d: any, idx: any) => {
|
|
|
- d3.select('#tooltip')
|
|
|
+ select('#tooltip')
|
|
|
.style('opacity', 1)
|
|
|
.select('#tooltip-value')
|
|
|
// TODO: show percents
|
|
|
.text(`${names[idx]} (${data[idx]})`);
|
|
|
})
|
|
|
.on('mousemove', () => {
|
|
|
- d3.select('#tooltip')
|
|
|
- .style('top', d3.event.pageY - 10 + 'px')
|
|
|
- .style('left', d3.event.pageX + 10 + 'px');
|
|
|
+ select('#tooltip')
|
|
|
+ // TODO: right position
|
|
|
+ .style('top', `${event.pageY}px`)
|
|
|
+ .style('left', `${event.pageX}px`);
|
|
|
})
|
|
|
.on('mouseout', () => {
|
|
|
- d3.select('#tooltip').style('opacity', 0);
|
|
|
+ select('#tooltip').style('opacity', 0);
|
|
|
});
|
|
|
}
|
|
|
|