@@ -2,10 +2,11 @@ import { css } from '@emotion/css';
22import { CSSProperties } from 'react' ;
33import * as React from 'react' ;
44
5- import { LinkModel } from '@grafana/data' ;
5+ import { ActionModel , GrafanaTheme2 , LinkModel } from '@grafana/data' ;
66import { selectors } from '@grafana/e2e-selectors' ;
77
8- import { linkModelToContextMenuItems } from '../../utils/dataLinks' ;
8+ import { useStyles2 } from '../../themes' ;
9+ import { actionModelToContextMenuItems , linkModelToContextMenuItems } from '../../utils/dataLinks' ;
910import { WithContextMenu } from '../ContextMenu/WithContextMenu' ;
1011import { MenuGroup , MenuItemsGroup } from '../Menu/MenuGroup' ;
1112import { MenuItem } from '../Menu/MenuItem' ;
@@ -14,15 +15,25 @@ export interface DataLinksContextMenuProps {
1415 children : ( props : DataLinksContextMenuApi ) => JSX . Element ;
1516 links : ( ) => LinkModel [ ] ;
1617 style ?: CSSProperties ;
18+ actions ?: ActionModel [ ] ;
1719}
1820
1921export interface DataLinksContextMenuApi {
2022 openMenu ?: React . MouseEventHandler < HTMLOrSVGElement > ;
2123 targetClassName ?: string ;
2224}
2325
24- export const DataLinksContextMenu = ( { children, links, style } : DataLinksContextMenuProps ) => {
25- const itemsGroup : MenuItemsGroup [ ] = [ { items : linkModelToContextMenuItems ( links ) , label : 'Data links' } ] ;
26+ export const DataLinksContextMenu = ( { children, links, actions, style } : DataLinksContextMenuProps ) => {
27+ const styles = useStyles2 ( getStyles ) ;
28+
29+ const itemsGroup : MenuItemsGroup [ ] = [
30+ { items : linkModelToContextMenuItems ( links ) , label : Boolean ( links ( ) . length ) ? 'Data links' : '' } ,
31+ ] ;
32+ const hasActions = Boolean ( actions ?. length ) ;
33+ if ( hasActions ) {
34+ itemsGroup . push ( { items : actionModelToContextMenuItems ( actions ! ) , label : 'Actions' } ) ;
35+ }
36+
2637 const linksCounter = itemsGroup [ 0 ] . items . length ;
2738 const renderMenuGroupItems = ( ) => {
2839 return itemsGroup . map ( ( group , groupIdx ) => (
@@ -36,6 +47,7 @@ export const DataLinksContextMenu = ({ children, links, style }: DataLinksContex
3647 icon = { item . icon }
3748 active = { item . active }
3849 onClick = { item . onClick }
50+ className = { styles . itemWrapper }
3951 />
4052 ) ) }
4153 </ MenuGroup >
@@ -47,7 +59,7 @@ export const DataLinksContextMenu = ({ children, links, style }: DataLinksContex
4759 cursor : 'context-menu' ,
4860 } ) ;
4961
50- if ( linksCounter > 1 ) {
62+ if ( linksCounter > 1 || hasActions ) {
5163 return (
5264 < WithContextMenu renderMenuItems = { renderMenuGroupItems } >
5365 { ( { openMenu } ) => {
@@ -71,3 +83,9 @@ export const DataLinksContextMenu = ({ children, links, style }: DataLinksContex
7183 ) ;
7284 }
7385} ;
86+
87+ const getStyles = ( theme : GrafanaTheme2 ) => ( {
88+ itemWrapper : css ( {
89+ fontSize : 12 ,
90+ } ) ,
91+ } ) ;
0 commit comments