@@ -5,7 +5,7 @@ import { LayerConfig } from '../../base/layer';
55import ViewLayer , { ViewConfig } from '../../base/view-layer' ;
66import { getComponent } from '../../components/factory' ;
77import { getGeom } from '../../geoms/factory' ;
8- import { Label , DataItem } from '../../interface/config' ;
8+ import { Label , DataItem , Tooltip } from '../../interface/config' ;
99import { LooseMap } from '../../interface/types' ;
1010import SpiderLabel from './component/label/spider-label' ;
1111import './component/label/outer-label' ;
@@ -171,6 +171,9 @@ export default class PieLayer<T extends PieLayerConfig = PieLayerConfig> extends
171171 if ( props . label ) {
172172 this . label ( ) ;
173173 }
174+ if ( props . tooltip && props . tooltip . visible ) {
175+ this . tooltip ( ) ;
176+ }
174177 this . setConfig ( 'element' , pie ) ;
175178 }
176179
@@ -189,6 +192,42 @@ export default class PieLayer<T extends PieLayerConfig = PieLayerConfig> extends
189192 super . parseEvents ( EventParser ) ;
190193 }
191194
195+ protected tooltip ( ) {
196+ const props = this . options ;
197+ if ( props . tooltip . htmlContent ) {
198+ const customHtmlContent = props . tooltip . htmlContent ;
199+ this . setConfig ( 'tooltip' , {
200+ ...this . options . tooltip ,
201+ htmlContent : ( title , items : any [ ] ) => {
202+ if ( items && items . length ) {
203+ const { angleField } = this . options ;
204+ const filteredSum = this . getFilteredSum ( ) ;
205+ return customHtmlContent (
206+ title ,
207+ items . map ( ( item ) => {
208+ const value = _ . get ( item , `point._origin.${ angleField } ` ) ;
209+ const percent = value / filteredSum ;
210+ return {
211+ ...item ,
212+ percent,
213+ } ;
214+ } )
215+ ) ;
216+ }
217+ return '<div></div>' ;
218+ } ,
219+ } as any ) ;
220+ }
221+ }
222+
223+ private getFilteredSum ( ) {
224+ const { angleField } = this . options ;
225+ const filteredData = this . view . get ( 'filteredData' ) || [ ] ;
226+ return filteredData . reduce ( ( pre , filteredDataItem ) => {
227+ return pre + filteredDataItem [ angleField ] ;
228+ } , 0 ) ;
229+ }
230+
192231 private label ( ) {
193232 const props = this . options ;
194233 const labelConfig = { ...props . label } as Label ;
@@ -203,6 +242,22 @@ export default class PieLayer<T extends PieLayerConfig = PieLayerConfig> extends
203242 // @ts -ignore
204243 labelConfig . labelLine = true ;
205244 }
245+ if ( labelConfig . formatter ) {
246+ const customFormatter = labelConfig . formatter ;
247+ labelConfig . formatter = ( text , item , index ) => {
248+ const { angleField } = this . options ;
249+ const filteredSum = this . getFilteredSum ( ) ;
250+ const percent = item . _origin [ angleField ] / filteredSum ;
251+ return customFormatter (
252+ text ,
253+ {
254+ ...item ,
255+ percent,
256+ } ,
257+ index
258+ ) ;
259+ } ;
260+ }
206261
207262 // 此处做个 hack 操作, 防止g2 controller层找不到未注册的inner,outter,和spider Label
208263 let labelType = labelConfig . type ;
0 commit comments