import React, { useMemo } from 'react'; import { PluginState, SelectableValue, TransformerRegistryItem, TransformerUIProps } from '@grafana/data'; import { Alert, HorizontalGroup, InlineField, InlineFieldRow, Select, ValuePicker } from '@grafana/ui'; import { getDistinctLabels } from '../utils'; import { joinByLabelsTransformer, JoinByLabelsTransformOptions } from './joinByLabels'; export interface Props extends TransformerUIProps {} export function JoinByLabelsTransformerEditor({ input, options, onChange }: Props) { const info = useMemo(() => { let warn: React.ReactNode = undefined; const distinct = getDistinctLabels(input); const valueOptions = Array.from(distinct).map((value) => ({ label: value, value })); let valueOption = valueOptions.find((v) => v.value === options.value); if (!valueOption && options.value) { valueOption = { label: `${options.value} (not found)`, value: options.value }; valueOptions.push(valueOption); } if (!input.length) { warn = No input (or labels) found; } else if (distinct.size === 0) { warn = The input does not contain any labels; } // Show the selected values distinct.delete(options.value); const joinOptions = Array.from(distinct).map((value) => ({ label: value, value })); let addOptions = joinOptions; const hasJoin = Boolean(options.join?.length); let addText = 'Join'; if (hasJoin) { addOptions = joinOptions.filter((v) => !options.join!.includes(v.value)); } else { addText = joinOptions.map((v) => v.value).join(', '); // all the fields } return { warn, valueOptions, valueOption, joinOptions, addOptions, addText, hasJoin, key: Date.now() }; }, [options, input]); const updateJoinValue = (idx: number, value?: string) => { if (!options.join) { return; // nothing to do } const join = options.join.slice(); if (!value) { join.splice(idx, 1); if (!join.length) { onChange({ ...options, join: undefined }); return; } } else { join[idx] = value; } // Remove duplicates and the value field const t = new Set(join); if (options.value) { t.delete(options.value); } onChange({ ...options, join: Array.from(t) }); }; const addJoin = (sel: SelectableValue) => { const v = sel?.value; if (!v) { return; } const join = options.join ? options.join.slice() : []; join.push(v); onChange({ ...options, join }); }; const labelWidth = 10; const noOptionsMessage = 'No labels found'; return (
{info.warn} o.value === v)} isClearable={true} onChange={(v) => updateJoinValue(idx, v?.value)} noOptionsMessage={noOptionsMessage} /> {Boolean(info.addOptions.length && idx === options.join!.length - 1) && ( )} )) ) : ( <> {Boolean(info.addOptions.length) && (