1616 * limitations under the License.
1717 */
1818
19+ import { CheckOutlined } from '@ant-design/icons' ;
1920import { Dropdown , Menu } from 'antd' ;
2021import useI18NPrefix from 'app/hooks/useI18NPrefix' ;
2122import { DrillMode } from 'app/models/ChartDrillOption' ;
2223import ChartDrillContext from 'app/pages/ChartWorkbenchPage/contexts/ChartDrillContext' ;
24+ import classnames from 'classnames' ;
2325import { FC , memo , useContext , useMemo } from 'react' ;
2426import styled from 'styled-components/macro' ;
27+ import { FONT_WEIGHT_MEDIUM , SPACE_SM } from 'styles/StyleConstants' ;
2528
2629const ChartDrillContextMenu : FC < { } > = memo ( ( { children } ) => {
2730 const t = useI18NPrefix ( `viz.palette.drill` ) ;
2831 const { drillOption, onDrillOptionChange } = useContext ( ChartDrillContext ) ;
2932
33+ const currentDrillLevel = drillOption ?. getCurrentDrillLevel ( ) ;
34+
3035 const contextMenu = useMemo ( ( ) => {
3136 return (
32- < Menu
33- style = { { width : 200 } }
37+ < StyledChartDrillMenu
3438 onClick = { ( { key } ) => {
3539 if ( ! drillOption ) {
3640 return ;
3741 }
38- if ( key === 'enable' ) {
39- if ( ! drillOption ?. isSelectedDrill ) {
40- drillOption ?. toggleSelectedDrill ( true ) ;
41- onDrillOptionChange ?.( drillOption ) ;
42- }
43- } else if ( key === 'disable' ) {
44- if ( drillOption ?. isSelectedDrill ) {
45- drillOption ?. toggleSelectedDrill ( false ) ;
46- onDrillOptionChange ?.( drillOption ) ;
47- }
42+ if ( key === 'selectDrillStatus' ) {
43+ drillOption ?. toggleSelectedDrill ( ! drillOption ?. isSelectedDrill ) ;
44+ onDrillOptionChange ?.( drillOption ) ;
4845 } else if ( key === DrillMode . Drill ) {
4946 drillOption ?. drillDown ( ) ;
5047 onDrillOptionChange ?.( drillOption ) ;
@@ -57,34 +54,32 @@ const ChartDrillContextMenu: FC<{}> = memo(({ children }) => {
5754 }
5855 } }
5956 >
60- < Menu . Item key = { 'rollUp' } > { t ( 'rollUp' ) } </ Menu . Item >
61- < Menu . Item
62- disabled = { drillOption ?. mode === DrillMode . Expand }
63- key = { DrillMode . Drill }
64- >
65- { t ( 'showNextLevel' ) }
66- </ Menu . Item >
67- < Menu . Item
68- disabled = { drillOption ?. mode === DrillMode . Drill }
69- key = { DrillMode . Expand }
70- >
71- { t ( 'expandNextLevel' ) }
72- </ Menu . Item >
73- < Menu . SubMenu
74- disabled = { drillOption ?. mode === DrillMode . Expand }
75- key = "selectDrillStatus"
76- title = { t ( 'selectDrillStatus' ) }
77- >
78- < Menu . Item key = "enable" disabled = { drillOption ?. isSelectedDrill } >
79- { t ( 'enable' ) }
80- </ Menu . Item >
81- < Menu . Item key = "disable" disabled = { ! drillOption ?. isSelectedDrill } >
82- { t ( 'disable' ) }
57+ { ! ! currentDrillLevel && (
58+ < Menu . Item key = { 'rollUp' } > { t ( 'rollUp' ) } </ Menu . Item >
59+ ) }
60+ { drillOption ?. mode !== DrillMode . Expand && (
61+ < Menu . Item key = { DrillMode . Drill } > { t ( 'showNextLevel' ) } </ Menu . Item >
62+ ) }
63+ { drillOption ?. mode !== DrillMode . Drill && (
64+ < Menu . Item key = { DrillMode . Expand } > { t ( 'expandNextLevel' ) } </ Menu . Item >
65+ ) }
66+ { drillOption ?. mode !== DrillMode . Expand && (
67+ < Menu . Item key = "selectDrillStatus" >
68+ < MenuSwitch
69+ className = { classnames ( { on : ! ! drillOption ?. isSelectedDrill } ) }
70+ >
71+ < p >
72+ { drillOption ?. isSelectedDrill
73+ ? t ( 'selectDrillOn' )
74+ : t ( 'selectDrillOff' ) }
75+ </ p >
76+ < CheckOutlined className = "icon" />
77+ </ MenuSwitch >
8378 </ Menu . Item >
84- </ Menu . SubMenu >
85- </ Menu >
79+ ) }
80+ </ StyledChartDrillMenu >
8681 ) ;
87- } , [ drillOption , t , onDrillOptionChange ] ) ;
82+ } , [ drillOption , currentDrillLevel , t , onDrillOptionChange ] ) ;
8883
8984 return (
9085 < StyledChartDrill className = "chart-drill-menu-container" >
@@ -107,3 +102,33 @@ const StyledChartDrill = styled.div`
107102 position: relative;
108103 width: 100%;
109104` ;
105+
106+ const StyledChartDrillMenu = styled ( Menu ) `
107+ min-width: 200px;
108+ ` ;
109+
110+ const MenuSwitch = styled . div `
111+ display: flex;
112+ align-items: center;
113+
114+ p {
115+ flex: 1;
116+ }
117+
118+ .icon {
119+ display: none;
120+ }
121+
122+ &.on {
123+ p {
124+ font-weight: ${ FONT_WEIGHT_MEDIUM } ;
125+ }
126+
127+ .icon {
128+ display: block;
129+ flex-shrink: 0;
130+ padding-left: ${ SPACE_SM } ;
131+ color: ${ p => p . theme . success } ;
132+ }
133+ }
134+ ` ;
0 commit comments