grafana/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx

95 lines
2.6 KiB
TypeScript

import React from 'react';
import {
DataTransformerID,
FieldNamePickerConfigSettings,
PluginState,
SelectableValue,
StandardEditorsRegistryItem,
TransformerRegistryItem,
TransformerUIProps,
} from '@grafana/data';
import { InlineField, InlineFieldRow, InlineSwitch, Select } from '@grafana/ui';
import { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';
import { ExtractFieldsOptions, extractFieldsTransformer } from './extractFields';
import { FieldExtractorID, fieldExtractors } from './fieldExtractors';
const fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {
settings: {
width: 30,
placeholderText: 'Select field',
},
name: '',
id: '',
editor: () => null,
};
export const extractFieldsTransformerEditor: React.FC<TransformerUIProps<ExtractFieldsOptions>> = ({
input,
options,
onChange,
}) => {
const onPickSourceField = (source?: string) => {
onChange({
...options,
source,
});
};
const onFormatChange = (format?: SelectableValue<FieldExtractorID>) => {
onChange({
...options,
format: format?.value,
});
};
const onToggleReplace = () => {
onChange({
...options,
replace: !options.replace,
});
};
const format = fieldExtractors.selectOptions(options.format ? [options.format] : undefined);
return (
<div>
<InlineFieldRow>
<InlineField label={'Source'} labelWidth={16}>
<FieldNamePicker
context={{ data: input }}
value={options.source ?? ''}
onChange={onPickSourceField}
item={fieldNamePickerSettings as any}
/>
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField label={'Format'} labelWidth={16}>
<Select
value={format.current[0] as any}
options={format.options as any}
onChange={onFormatChange}
width={24}
placeholder={'Auto'}
/>
</InlineField>
</InlineFieldRow>
<InlineFieldRow>
<InlineField label={'Replace all fields'} labelWidth={16}>
<InlineSwitch value={options.replace ?? false} onChange={onToggleReplace} />
</InlineField>
</InlineFieldRow>
</div>
);
};
export const extractFieldsTransformRegistryItem: TransformerRegistryItem<ExtractFieldsOptions> = {
id: DataTransformerID.extractFields,
editor: extractFieldsTransformerEditor,
transformation: extractFieldsTransformer,
name: 'Extract fields',
description: `Parse fields from content (JSON, labels, etc)`,
state: PluginState.alpha,
};