|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
import React, { useState } from 'react'; |
|
|
|
|
import { css } from 'emotion'; |
|
|
|
|
import { Forms, useTheme } from '@grafana/ui'; |
|
|
|
|
import { Forms, useTheme, stylesFactory } from '@grafana/ui'; |
|
|
|
|
import { GrafanaTheme } from '@grafana/data'; |
|
|
|
|
|
|
|
|
|
interface PanelTitleProps { |
|
|
|
|
value: string; |
|
|
|
@ -10,26 +11,30 @@ interface PanelTitleProps { |
|
|
|
|
export const PanelTitle: React.FC<PanelTitleProps> = ({ value, onChange }) => { |
|
|
|
|
const [isEditing, setIsEditing] = useState(false); |
|
|
|
|
const theme = useTheme(); |
|
|
|
|
const styles = getStyles(theme); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<> |
|
|
|
|
<div className={styles.wrapper}> |
|
|
|
|
{isEditing ? ( |
|
|
|
|
<Forms.Input |
|
|
|
|
value={value || ''} |
|
|
|
|
ref={elem => elem && elem.focus()} |
|
|
|
|
onChange={e => onChange(e.currentTarget.value)} |
|
|
|
|
onBlur={() => setIsEditing(false)} |
|
|
|
|
placeholder="Panel Title" |
|
|
|
|
/> |
|
|
|
|
) : ( |
|
|
|
|
<span |
|
|
|
|
className={css` |
|
|
|
|
font-size: ${theme.typography.size.lg}; |
|
|
|
|
margin-left: ${theme.spacing.sm}; |
|
|
|
|
`}
|
|
|
|
|
onClick={() => setIsEditing(true)} |
|
|
|
|
> |
|
|
|
|
{value} |
|
|
|
|
</span> |
|
|
|
|
<span onClick={() => setIsEditing(true)}>{value}</span> |
|
|
|
|
)} |
|
|
|
|
</> |
|
|
|
|
</div> |
|
|
|
|
); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const getStyles = stylesFactory((theme: GrafanaTheme) => { |
|
|
|
|
return { |
|
|
|
|
wrapper: css` |
|
|
|
|
font-size: ${theme.typography.size.lg}; |
|
|
|
|
padding-left: ${theme.spacing.md}; |
|
|
|
|
`,
|
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|