@ -136,38 +136,40 @@ export const AddPanelWidgetUnconnected: React.FC<Props> = ({ panel, dashboard })
const copiedPanelPlugins = useMemo ( ( ) = > getCopiedPanelPlugins ( ) , [ ] ) ;
return (
< div className = { cx ( 'panel-container' , styles . wrapper ) } >
< AddPanelWidgetHandle onCancel = { onCancelAddPanel } onBack = { addPanelView ? onBack : undefined } styles = { styles } >
{ addPanelView ? 'Add panel from panel library' : 'Add panel' }
< / AddPanelWidgetHandle >
{ addPanelView ? (
< LibraryPanelsSearch onClick = { onAddLibraryPanel } variant = { LibraryPanelsSearchVariant . Tight } showPanelFilter / >
) : (
< div className = { styles . actionsWrapper } >
< div className = { styles . actionsRow } >
< div onClick = { ( ) = > onCreateNewPanel ( ) } aria - label = { selectors . pages . AddDashboard . addNewPanel } >
< Icon name = "file-blank" size = "xl" / >
Add an empty panel
< / div >
< div onClick = { onCreateNewRow } >
< Icon name = "wrap-text" size = "xl" / >
Add a new row
< / div >
< / div >
< div className = { styles . actionsRow } >
< div onClick = { ( ) = > setAddPanelView ( true ) } >
< Icon name = "book-open" size = "xl" / >
Add a panel from the panel library
< div className = { styles . wrapper } >
< div className = { cx ( 'panel-container' , styles . callToAction ) } >
< AddPanelWidgetHandle onCancel = { onCancelAddPanel } onBack = { addPanelView ? onBack : undefined } styles = { styles } >
{ addPanelView ? 'Add panel from panel library' : 'Add panel' }
< / AddPanelWidgetHandle >
{ addPanelView ? (
< LibraryPanelsSearch onClick = { onAddLibraryPanel } variant = { LibraryPanelsSearchVariant . Tight } showPanelFilter / >
) : (
< div className = { styles . actionsWrapper } >
< div className = { styles . actionsRow } >
< div onClick = { ( ) = > onCreateNewPanel ( ) } aria - label = { selectors . pages . AddDashboard . addNewPanel } >
< Icon name = "file-blank" size = "xl" / >
Add an empty panel
< / div >
< div onClick = { onCreateNewRow } >
< Icon name = "wrap-text" size = "xl" / >
Add a new row
< / div >
< / div >
{ copiedPanelPlugins . length === 1 && (
< div onClick = { ( ) = > onPasteCopiedPanel ( copiedPanelPlugins [ 0 ] ) } >
< Icon name = "clipboard-alt " size = "xl" / >
Paste panel from clipboard
< div className = { styles . actionsRow } >
< div onClick = { ( ) = > setAddPanelView ( true ) } >
< Icon name = "book-open" size = "xl" / >
Add a panel from the panel library
< / div >
) }
{ copiedPanelPlugins . length === 1 && (
< div onClick = { ( ) = > onPasteCopiedPanel ( copiedPanelPlugins [ 0 ] ) } >
< Icon name = "clipboard-alt" size = "xl" / >
Paste panel from clipboard
< / div >
) }
< / div >
< / div >
< / div >
) }
) }
< / div >
< / div >
) ;
} ;
@ -213,7 +215,12 @@ const getStyles = (theme: GrafanaTheme) => {
` ;
return {
// wrapper is used to make sure box-shadow animation isn't cut off in dashboard page
wrapper : css `
height : 100 % ;
padding - top : $ { theme . spacing . xs } ;
` ,
callToAction : css `
overflow : hidden ;
outline : 2px dotted transparent ;
outline - offset : 2px ;