import { css, cx } from '@emotion/css'; import { Fragment, useState } from 'react'; import { usePrevious } from 'react-use'; import { getFrameDisplayName, StandardEditorProps, // getFieldDisplayName, FrameMatcherID, FieldMatcherID, FieldNamePickerBaseNameMode, FieldType, GrafanaTheme2, } from '@grafana/data'; import { Button, Field, IconButton, Select, useStyles2 } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker'; import { LayerName } from 'app/core/components/Layers/LayerName'; import { Options, SeriesMapping, XYSeriesConfig } from './panelcfg.gen'; export const SeriesEditor = ({ value: seriesCfg, onChange, context, }: StandardEditorProps) => { const style = useStyles2(getStyles); // reset opts when mapping changes (no way to do this in panel opts builder?) const mapping = context.options?.mapping; const prevMapping = usePrevious(mapping); const mappingChanged = prevMapping != null && mapping !== prevMapping; const defaultFrame = { frame: { matcher: { id: FrameMatcherID.byIndex, options: 0 } } }; const [selectedIdx, setSelectedIdx] = useState(0); if (mappingChanged || seriesCfg == null) { seriesCfg = [{ ...defaultFrame }]; onChange([...seriesCfg]); if (selectedIdx > 0) { setSelectedIdx(0); } } const addSeries = () => { seriesCfg = seriesCfg.concat({ ...defaultFrame }); setSelectedIdx(seriesCfg.length - 1); onChange([...seriesCfg]); }; const deleteSeries = (index: number) => { seriesCfg = seriesCfg.filter((s, i) => i !== index); setSelectedIdx(0); onChange([...seriesCfg]); }; const series = seriesCfg[selectedIdx]; const formKey = `${mapping}${selectedIdx}`; const baseNameMode = mapping === SeriesMapping.Manual ? FieldNamePickerBaseNameMode.ExcludeBaseNames : context.data.length === 1 ? FieldNamePickerBaseNameMode.IncludeAll : FieldNamePickerBaseNameMode.OnlyBaseNames; context.data.forEach((frame, frameIndex) => { frame.fields.forEach((field, fieldIndex) => { field.state = { ...field.state, origin: { frameIndex, fieldIndex, }, }; }); }); return ( <> {mapping === SeriesMapping.Manual && ( <>
{seriesCfg.map((series, index) => { return (
setSelectedIdx(index)} role="button" aria-label={`Select series ${index + 1}`} tabIndex={0} onKeyPress={(e) => { if (e.key === 'Enter') { setSelectedIdx(index); } }} > { series.name = { fixed: v === '' || v === `Series ${index + 1}` ? undefined : v, }; onChange([...seriesCfg]); }} /> deleteSeries(index)} tooltip="Delete series" />
); })}
)} {selectedIdx >= 0 && series != null && (