@@ -12,6 +12,7 @@ import {
1212 spanLogic ,
1313 determineVisible ,
1414 flatChildren ,
15+ getMaxDepth ,
1516} from '../utils' ;
1617import type { ILabelNodes , ILabelNode , IEnhancedChart , IEnhancedChartDataSet } from '../model' ;
1718import type { HierarchicalScale } from '../scale' ;
@@ -258,7 +259,8 @@ function handleClickEvents(
258259 _event : unknown ,
259260 elem : { offset : number ; index : number } ,
260261 offsetDelta : number ,
261- inRange : ( v : number ) => boolean
262+ inRange : ( v : number ) => boolean ,
263+ reverse : boolean = false
262264) {
263265 const cc = chart as unknown as IEnhancedChart ;
264266 let { offset } = elem ;
@@ -270,8 +272,10 @@ function handleClickEvents(
270272 return ;
271273 }
272274 const parents = parentsOf ( label , flat ) ;
275+ const maxDepth = getMaxDepth ( ( cc . data . rootNodes || [ ] ) as Array < ILabelNode > ) ;
276+ if ( reverse ) offset += maxDepth * offsetDelta ;
273277
274- for ( let i = 1 ; i < parents . length ; i += 1 , offset += offsetDelta ) {
278+ for ( let i = 1 ; i < parents . length ; i += 1 , reverse ? ( offset -= offsetDelta ) : ( offset += offsetDelta ) ) {
275279 if ( ! inRange ( offset ) ) {
276280 // eslint-disable-next-line no-continue
277281 continue ;
@@ -352,6 +356,7 @@ const hierarchicalPlugin: Plugin = {
352356 const isStatic = scale . options . static ;
353357
354358 const scaleLabel = scale . options . title ;
359+ const scaleReverse = scale . options . reverseOrder ;
355360 const scaleLabelFontColor = valueOrDefault ( scaleLabel . color , defaults . color as Color ) ;
356361 const scaleLabelFont = toFont ( scaleLabel . font as Partial < FontSpec > ) ;
357362
@@ -403,11 +408,14 @@ const hierarchicalPlugin: Plugin = {
403408 ctx . fillStyle = scaleLabelFontColor ! ; // render in correct color
404409 ctx . font = scaleLabelFont . string ;
405410
406- const renderHorLevel = ( node : ILabelNode ) => {
411+ const renderHorLevel = ( node : ILabelNode , maxDepth : number = 0 ) => {
407412 if ( node . children . length === 0 ) {
408413 return false ;
409414 }
410- const offset = node . level * boxRow ;
415+ let offset = node . level * boxRow ;
416+ if ( scaleReverse ) {
417+ offset = maxDepth * boxRow - node . level * boxRow ;
418+ }
411419
412420 if ( ! node . expand ) {
413421 if ( visibleNodes . has ( node ) ) {
@@ -475,11 +483,14 @@ const hierarchicalPlugin: Plugin = {
475483 return true ;
476484 } ;
477485
478- const renderVertLevel = ( node : ILabelNode ) => {
486+ const renderVertLevel = ( node : ILabelNode , maxDepth : number = 0 ) => {
479487 if ( node . children . length === 0 ) {
480488 return false ;
481489 }
482- const offset = node . level * boxRow * - 1 ;
490+ let offset = node . level * boxRow * - 1 ;
491+ if ( scaleReverse ) {
492+ offset = ( maxDepth * boxRow - node . level * boxRow ) * - 1 ;
493+ }
483494
484495 if ( ! node . expand ) {
485496 if ( visibleNodes . has ( node ) ) {
@@ -544,17 +555,18 @@ const hierarchicalPlugin: Plugin = {
544555 return true ;
545556 } ;
546557
558+ const maxLevel = getMaxDepth ( roots as Array < ILabelNode > ) ;
547559 if ( hor ) {
548560 ctx . textAlign = 'center' ;
549561 ctx . textBaseline = renderLabel === 'above' ? 'bottom' : 'top' ;
550562 ctx . translate ( scale . left , scale . bottom + scale . options . padding ) ;
551- roots . forEach ( ( n ) => preOrderTraversal ( n , renderHorLevel ) ) ;
563+ roots . forEach ( ( n ) => preOrderTraversal ( n , ( m ) => renderHorLevel ( m , maxLevel ) ) ) ;
552564 } else {
553565 ctx . textAlign = 'right' ;
554566 ctx . textBaseline = 'middle' ;
555567 ctx . translate ( scale . left - scale . options . padding , scale . top ) ;
556568
557- roots . forEach ( ( n ) => preOrderTraversal ( n , renderVertLevel ) ) ;
569+ roots . forEach ( ( k ) => preOrderTraversal ( k , ( l ) => renderVertLevel ( l , maxLevel ) ) ) ;
558570 }
559571
560572 ctx . restore ( ) ;
@@ -578,12 +590,12 @@ const hierarchicalPlugin: Plugin = {
578590 }
579591
580592 const boxRow = scale . options . hierarchyBoxLineHeight ;
581-
593+ const reverse = scale . options . reverseOrder ;
582594 const inRange = hor
583595 ? ( o : number ) => clickEvent . y >= o && clickEvent . y <= o + boxRow
584596 : ( o : number ) => clickEvent . x <= o && clickEvent . x >= o - boxRow ;
585597 const offsetDelta = hor ? boxRow : - boxRow ;
586- handleClickEvents ( chart , event , elem , offsetDelta , inRange ) ;
598+ handleClickEvents ( chart , event , elem , offsetDelta , inRange , reverse ) ;
587599 } ,
588600} ;
589601
0 commit comments