mirror of https://github.com/grafana/grafana
Trace View: Copy Trace ID action button (#64416)
* Added button to trace view to copy trace ID * Added dummy Export buttonpull/64602/head
parent
6cbc956b5c
commit
1667ea118f
@ -0,0 +1,59 @@ |
||||
import { css } from '@emotion/css'; |
||||
import React from 'react'; |
||||
|
||||
import { GrafanaTheme2, IconName } from '@grafana/data'; |
||||
import { Button, useStyles2 } from '@grafana/ui'; |
||||
|
||||
export const getStyles = (theme: GrafanaTheme2) => { |
||||
return { |
||||
ActionButton: css` |
||||
label: ActionButton; |
||||
overflow: hidden; |
||||
position: relative; |
||||
width: 110px; |
||||
justify-content: center; |
||||
&:after { |
||||
content: ''; |
||||
background: ${theme.colors.primary.main}; |
||||
display: block; |
||||
position: absolute; |
||||
right: 0; |
||||
width: 100%; |
||||
height: 100%; |
||||
opacity: 0; |
||||
transition: all 0.8s; |
||||
} |
||||
&:active:after { |
||||
margin: 0; |
||||
opacity: 0.3; |
||||
transition: 0s; |
||||
} |
||||
`,
|
||||
}; |
||||
}; |
||||
|
||||
export type ActionButtonProps = { |
||||
onClick: () => void; |
||||
ariaLabel: string; |
||||
label: string; |
||||
icon: IconName; |
||||
}; |
||||
|
||||
export default function ActionButton(props: ActionButtonProps) { |
||||
const { onClick, ariaLabel, label, icon } = props; |
||||
const styles = useStyles2(getStyles); |
||||
|
||||
return ( |
||||
<Button |
||||
className={styles.ActionButton} |
||||
variant="secondary" |
||||
fill={'outline'} |
||||
type="button" |
||||
icon={icon} |
||||
aria-label={ariaLabel} |
||||
onClick={onClick} |
||||
> |
||||
{label} |
||||
</Button> |
||||
); |
||||
} |
@ -0,0 +1,51 @@ |
||||
import { css } from '@emotion/css'; |
||||
import React, { useState } from 'react'; |
||||
|
||||
import { useStyles2 } from '@grafana/ui'; |
||||
|
||||
import ActionButton from './ActionButton'; |
||||
|
||||
export const getStyles = () => { |
||||
return { |
||||
TracePageActions: css` |
||||
label: TracePageActions; |
||||
display: flex; |
||||
gap: 4px; |
||||
`,
|
||||
}; |
||||
}; |
||||
|
||||
export type TracePageActionsProps = { |
||||
traceId: string; |
||||
}; |
||||
|
||||
export default function TracePageActions(props: TracePageActionsProps) { |
||||
const { traceId } = props; |
||||
const styles = useStyles2(getStyles); |
||||
const [copyTraceIdClicked, setCopyTraceIdClicked] = useState(false); |
||||
|
||||
const copyTraceId = () => { |
||||
navigator.clipboard.writeText(traceId); |
||||
setCopyTraceIdClicked(true); |
||||
setTimeout(() => { |
||||
setCopyTraceIdClicked(false); |
||||
}, 5000); |
||||
}; |
||||
|
||||
return ( |
||||
<div className={styles.TracePageActions}> |
||||
<ActionButton |
||||
onClick={copyTraceId} |
||||
ariaLabel={'Copy Trace ID'} |
||||
label={copyTraceIdClicked ? 'Copied!' : 'Trace ID'} |
||||
icon={'copy'} |
||||
/> |
||||
<ActionButton |
||||
onClick={() => alert('not implemented')} |
||||
ariaLabel={'Export Trace'} |
||||
label={'Export'} |
||||
icon={'save'} |
||||
/> |
||||
</div> |
||||
); |
||||
} |
Loading…
Reference in new issue