mirror of https://github.com/grafana/grafana
Node Graph Panel: Add options to configure units and arc colors (#51057)
* Node Graph Panel: Add options to configure units and arc colors * Add testspull/51335/head
parent
d20afa2a39
commit
16aaffe0a1
@ -0,0 +1,76 @@ |
||||
import { css } from '@emotion/css'; |
||||
import React from 'react'; |
||||
|
||||
import { Field, FieldNamePickerConfigSettings, StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data'; |
||||
import { Button, ColorPicker, useStyles2 } from '@grafana/ui'; |
||||
import { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker'; |
||||
|
||||
import { ArcOption, NodeGraphOptions } from '../types'; |
||||
|
||||
type ArcOptionsEditorProps = StandardEditorProps<ArcOption[], any, NodeGraphOptions, any>; |
||||
|
||||
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = { |
||||
settings: { filter: (field: Field) => field.name.includes('arc__') }, |
||||
} as any; |
||||
|
||||
export const ArcOptionsEditor = ({ value, onChange, context }: ArcOptionsEditorProps) => { |
||||
const styles = useStyles2(getStyles); |
||||
|
||||
const addArc = () => { |
||||
const newArc = { field: '', color: '' }; |
||||
onChange(value ? [...value, newArc] : [newArc]); |
||||
}; |
||||
|
||||
const removeArc = (idx: number) => { |
||||
const copy = value?.slice(); |
||||
copy.splice(idx, 1); |
||||
onChange(copy); |
||||
}; |
||||
|
||||
const updateField = <K extends keyof ArcOption>(idx: number, field: K, newValue: ArcOption[K]) => { |
||||
let arcs = value?.slice() ?? []; |
||||
arcs[idx][field] = newValue; |
||||
onChange(arcs); |
||||
}; |
||||
|
||||
return ( |
||||
<> |
||||
{value?.map((arc, i) => { |
||||
return ( |
||||
<div className={styles.section} key={i}> |
||||
<FieldNamePicker |
||||
context={context} |
||||
value={arc.field ?? ''} |
||||
onChange={(val) => { |
||||
updateField(i, 'field', val); |
||||
}} |
||||
item={fieldNamePickerSettings} |
||||
/> |
||||
<ColorPicker |
||||
color={arc.color || '#808080'} |
||||
onChange={(val) => { |
||||
updateField(i, 'color', val); |
||||
}} |
||||
/> |
||||
<Button size="sm" icon="minus" variant="secondary" onClick={() => removeArc(i)} title="Remove arc" /> |
||||
</div> |
||||
); |
||||
})} |
||||
<Button size={'sm'} icon="plus" onClick={addArc} variant="secondary"> |
||||
Add arc |
||||
</Button> |
||||
</> |
||||
); |
||||
}; |
||||
|
||||
const getStyles = () => { |
||||
return { |
||||
section: css` |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
gap: 0 8px; |
||||
margin-bottom: 8px; |
||||
`,
|
||||
}; |
||||
}; |
@ -1,6 +1,42 @@ |
||||
import { PanelPlugin } from '@grafana/data'; |
||||
|
||||
import { NodeGraphPanel } from './NodeGraphPanel'; |
||||
import { Options } from './types'; |
||||
import { ArcOptionsEditor } from './editor/ArcOptionsEditor'; |
||||
import { NodeGraphOptions } from './types'; |
||||
|
||||
export const plugin = new PanelPlugin<Options>(NodeGraphPanel); |
||||
export const plugin = new PanelPlugin<NodeGraphOptions>(NodeGraphPanel).setPanelOptions((builder, context) => { |
||||
builder.addNestedOptions({ |
||||
category: ['Nodes'], |
||||
path: 'nodes', |
||||
build: (builder) => { |
||||
builder.addUnitPicker({ |
||||
name: 'Main stat unit', |
||||
path: 'mainStatUnit', |
||||
}); |
||||
builder.addUnitPicker({ |
||||
name: 'Secondary stat unit', |
||||
path: 'secondaryStatUnit', |
||||
}); |
||||
builder.addCustomEditor({ |
||||
name: 'Arc sections', |
||||
path: 'arcs', |
||||
id: 'arcs', |
||||
editor: ArcOptionsEditor, |
||||
}); |
||||
}, |
||||
}); |
||||
builder.addNestedOptions({ |
||||
category: ['Edges'], |
||||
path: 'edges', |
||||
build: (builder) => { |
||||
builder.addUnitPicker({ |
||||
name: 'Main stat unit', |
||||
path: 'mainStatUnit', |
||||
}); |
||||
builder.addUnitPicker({ |
||||
name: 'Secondary stat unit', |
||||
path: 'secondaryStatUnit', |
||||
}); |
||||
}, |
||||
}); |
||||
}); |
||||
|
Loading…
Reference in new issue