mirror of https://github.com/grafana/grafana
parent
bd23d48660
commit
d6bddf3c68
@ -0,0 +1,185 @@ |
|||||||
|
import { css } from '@emotion/css'; |
||||||
|
import React, { PureComponent } from 'react'; |
||||||
|
|
||||||
|
import { GrafanaTheme2 } from '@grafana/data'; |
||||||
|
import { stylesFactory } from '@grafana/ui'; |
||||||
|
import { config } from 'app/core/config'; |
||||||
|
import { DimensionContext } from 'app/features/dimensions/context'; |
||||||
|
import { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor'; |
||||||
|
import { TextDimensionEditor } from 'app/features/dimensions/editors/TextDimensionEditor'; |
||||||
|
|
||||||
|
import { CanvasElementItem, CanvasElementProps, defaultBgColor, defaultTextColor } from '../element'; |
||||||
|
import { Align, VAlign, EllipseConfig, EllipseData } from '../types'; |
||||||
|
|
||||||
|
class EllipseDisplay extends PureComponent<CanvasElementProps<EllipseConfig, EllipseData>> { |
||||||
|
render() { |
||||||
|
const { data } = this.props; |
||||||
|
const styles = getStyles(config.theme2, data); |
||||||
|
return ( |
||||||
|
<div className={styles.container}> |
||||||
|
<span className={styles.span}>{data?.text}</span> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
const getStyles = stylesFactory((theme: GrafanaTheme2, data) => ({ |
||||||
|
container: css` |
||||||
|
display: table; |
||||||
|
position: absolute; |
||||||
|
top: 50%; |
||||||
|
transform: translateY(-50%); |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
background-color: ${data?.backgroundColor}; |
||||||
|
border: ${data?.width}px solid ${data?.borderColor}; |
||||||
|
border-radius: 50%; |
||||||
|
`,
|
||||||
|
span: css` |
||||||
|
display: table-cell; |
||||||
|
vertical-align: ${data?.valign}; |
||||||
|
text-align: ${data?.align}; |
||||||
|
font-size: ${data?.size}px; |
||||||
|
color: ${data?.color}; |
||||||
|
`,
|
||||||
|
})); |
||||||
|
|
||||||
|
export const ellipseItem: CanvasElementItem<EllipseConfig, EllipseData> = { |
||||||
|
id: 'ellipse', |
||||||
|
name: 'Ellipse', |
||||||
|
description: 'Ellipse', |
||||||
|
|
||||||
|
display: EllipseDisplay, |
||||||
|
|
||||||
|
defaultSize: { |
||||||
|
width: 160, |
||||||
|
height: 160, |
||||||
|
}, |
||||||
|
|
||||||
|
getNewOptions: (options) => ({ |
||||||
|
...options, |
||||||
|
config: { |
||||||
|
backgroundColor: { |
||||||
|
fixed: defaultBgColor, |
||||||
|
}, |
||||||
|
borderColor: { |
||||||
|
fixed: 'transparent', |
||||||
|
}, |
||||||
|
width: 1, |
||||||
|
align: Align.Center, |
||||||
|
valign: VAlign.Middle, |
||||||
|
color: { |
||||||
|
fixed: defaultTextColor, |
||||||
|
}, |
||||||
|
}, |
||||||
|
background: { |
||||||
|
color: { |
||||||
|
fixed: 'transparent', |
||||||
|
}, |
||||||
|
}, |
||||||
|
}), |
||||||
|
|
||||||
|
prepareData: (ctx: DimensionContext, cfg: EllipseConfig) => { |
||||||
|
const data: EllipseData = { |
||||||
|
width: cfg.width, |
||||||
|
text: cfg.text ? ctx.getText(cfg.text).value() : '', |
||||||
|
align: cfg.align ?? Align.Center, |
||||||
|
valign: cfg.valign ?? VAlign.Middle, |
||||||
|
size: cfg.size, |
||||||
|
}; |
||||||
|
|
||||||
|
if (cfg.backgroundColor) { |
||||||
|
data.backgroundColor = ctx.getColor(cfg.backgroundColor).value(); |
||||||
|
} |
||||||
|
if (cfg.borderColor) { |
||||||
|
data.borderColor = ctx.getColor(cfg.borderColor).value(); |
||||||
|
} |
||||||
|
if (cfg.color) { |
||||||
|
data.color = ctx.getColor(cfg.color).value(); |
||||||
|
} |
||||||
|
|
||||||
|
return data; |
||||||
|
}, |
||||||
|
|
||||||
|
// Heatmap overlay options
|
||||||
|
registerOptionsUI: (builder) => { |
||||||
|
const category = ['Ellipse']; |
||||||
|
builder |
||||||
|
.addCustomEditor({ |
||||||
|
category, |
||||||
|
id: 'textSelector', |
||||||
|
path: 'config.text', |
||||||
|
name: 'Text', |
||||||
|
editor: TextDimensionEditor, |
||||||
|
}) |
||||||
|
.addCustomEditor({ |
||||||
|
category, |
||||||
|
id: 'config.color', |
||||||
|
path: 'config.color', |
||||||
|
name: 'Text color', |
||||||
|
editor: ColorDimensionEditor, |
||||||
|
settings: {}, |
||||||
|
defaultValue: {}, |
||||||
|
}) |
||||||
|
.addRadio({ |
||||||
|
category, |
||||||
|
path: 'config.align', |
||||||
|
name: 'Align text', |
||||||
|
settings: { |
||||||
|
options: [ |
||||||
|
{ value: Align.Left, label: 'Left' }, |
||||||
|
{ value: Align.Center, label: 'Center' }, |
||||||
|
{ value: Align.Right, label: 'Right' }, |
||||||
|
], |
||||||
|
}, |
||||||
|
defaultValue: Align.Left, |
||||||
|
}) |
||||||
|
.addCustomEditor({ |
||||||
|
category, |
||||||
|
id: 'config.borderColor', |
||||||
|
path: 'config.borderColor', |
||||||
|
name: 'Ellipse border color', |
||||||
|
editor: ColorDimensionEditor, |
||||||
|
settings: {}, |
||||||
|
defaultValue: {}, |
||||||
|
}) |
||||||
|
.addNumberInput({ |
||||||
|
category, |
||||||
|
path: 'config.width', |
||||||
|
name: 'Ellipse border width', |
||||||
|
settings: { |
||||||
|
placeholder: 'Auto', |
||||||
|
}, |
||||||
|
}) |
||||||
|
.addCustomEditor({ |
||||||
|
category, |
||||||
|
id: 'config.backgroundColor', |
||||||
|
path: 'config.backgroundColor', |
||||||
|
name: 'Ellipse background color', |
||||||
|
editor: ColorDimensionEditor, |
||||||
|
settings: {}, |
||||||
|
defaultValue: {}, |
||||||
|
}) |
||||||
|
.addRadio({ |
||||||
|
category, |
||||||
|
path: 'config.valign', |
||||||
|
name: 'Vertical align', |
||||||
|
settings: { |
||||||
|
options: [ |
||||||
|
{ value: VAlign.Top, label: 'Top' }, |
||||||
|
{ value: VAlign.Middle, label: 'Middle' }, |
||||||
|
{ value: VAlign.Bottom, label: 'Bottom' }, |
||||||
|
], |
||||||
|
}, |
||||||
|
defaultValue: VAlign.Middle, |
||||||
|
}) |
||||||
|
.addNumberInput({ |
||||||
|
category, |
||||||
|
path: 'config.size', |
||||||
|
name: 'Text size', |
||||||
|
settings: { |
||||||
|
placeholder: 'Auto', |
||||||
|
}, |
||||||
|
}); |
||||||
|
}, |
||||||
|
}; |
Loading…
Reference in new issue