diff --git a/packages/grafana-data/src/transformations/index.ts b/packages/grafana-data/src/transformations/index.ts index c21e8dfd428..6e294edafa0 100644 --- a/packages/grafana-data/src/transformations/index.ts +++ b/packages/grafana-data/src/transformations/index.ts @@ -5,6 +5,7 @@ export { standardTransformers } from './transformers'; export * from './fieldReducer'; export { FilterFieldsByNameTransformerOptions } from './transformers/filterByName'; export { FilterFramesByRefIdTransformerOptions } from './transformers/filterByRefId'; +export { SeriesToColumnsOptions } from './transformers/seriesToColumns'; export { ReduceTransformerOptions } from './transformers/reduce'; export { OrganizeFieldsTransformerOptions } from './transformers/organize'; export { createOrderFieldsComparer } from './transformers/order'; diff --git a/packages/grafana-data/src/transformations/transformDataFrame.ts b/packages/grafana-data/src/transformations/transformDataFrame.ts index 058ca1163fe..4e51c2f2dc1 100644 --- a/packages/grafana-data/src/transformations/transformDataFrame.ts +++ b/packages/grafana-data/src/transformations/transformDataFrame.ts @@ -13,7 +13,9 @@ export function transformDataFrame(options: DataTransformerConfig[], data: DataF return data; } - const transformer = info.transformation.transformer(config.options); + const defaultOptions = info.transformation.defaultOptions ?? {}; + const options = { ...defaultOptions, ...config.options }; + const transformer = info.transformation.transformer(options); const after = transformer(processed); // Add a key to the metadata if the data changed diff --git a/packages/grafana-data/src/transformations/transformers/filter.ts b/packages/grafana-data/src/transformations/transformers/filter.ts index fcce7766c87..7a1638d2b75 100644 --- a/packages/grafana-data/src/transformations/transformers/filter.ts +++ b/packages/grafana-data/src/transformations/transformers/filter.ts @@ -2,7 +2,6 @@ import { noopTransformer } from './noop'; import { DataFrame, Field } from '../../types/dataFrame'; import { DataTransformerID } from './ids'; import { DataTransformerInfo, MatcherConfig } from '../../types/transformations'; -import { FieldMatcherID } from '../matchers/ids'; import { getFieldMatcher, getFrameMatchers } from '../matchers'; export interface FilterOptions { @@ -14,9 +13,7 @@ export const filterFieldsTransformer: DataTransformerInfo = { id: DataTransformerID.filterFields, name: 'Filter Fields', description: 'select a subset of fields', - defaultOptions: { - include: { id: FieldMatcherID.numeric }, - }, + defaultOptions: {}, /** * Return a modified copy of the series. If the transform is not or should not diff --git a/packages/grafana-data/src/transformations/transformers/seriesToColumns.ts b/packages/grafana-data/src/transformations/transformers/seriesToColumns.ts index 91dc208860a..eb6e0093e26 100644 --- a/packages/grafana-data/src/transformations/transformers/seriesToColumns.ts +++ b/packages/grafana-data/src/transformations/transformers/seriesToColumns.ts @@ -5,14 +5,16 @@ import { filterFieldsByNameTransformer } from './filterByName'; import { ArrayVector } from '../../vector'; export interface SeriesToColumnsOptions { - byField: string; + byField?: string; } export const seriesToColumnsTransformer: DataTransformerInfo = { id: DataTransformerID.seriesToColumns, - name: 'Series as Columns', + name: 'Series as columns', description: 'Groups series by field and returns values as columns', - defaultOptions: {}, + defaultOptions: { + byField: 'Time', + }, transformer: options => (data: DataFrame[]) => { const regex = `/^(${options.byField})$/`; // not sure if I should use filterFieldsByNameTransformer to get the key field diff --git a/packages/grafana-ui/src/components/TransformersUI/OrganizeFieldsTransformerEditor.tsx b/packages/grafana-ui/src/components/TransformersUI/OrganizeFieldsTransformerEditor.tsx index 0eb596143f8..7fe7d1c2175 100644 --- a/packages/grafana-ui/src/components/TransformersUI/OrganizeFieldsTransformerEditor.tsx +++ b/packages/grafana-ui/src/components/TransformersUI/OrganizeFieldsTransformerEditor.tsx @@ -21,7 +21,7 @@ const OrganizeFieldsTransformerEditor: React.FC fieldNamesFromInput(input), [input]); + const fieldNames = useMemo(() => getAllFieldNamesFromDataFrames(input), [input]); const orderedFieldNames = useMemo(() => orderFieldNamesByIndex(fieldNames, indexByName), [fieldNames, indexByName]); const onToggleVisibility = useCallback( @@ -185,7 +185,7 @@ const orderFieldNamesByIndex = (fieldNames: string[], indexByName: Record { +export const getAllFieldNamesFromDataFrames = (input: DataFrame[]): string[] => { if (!Array.isArray(input)) { return [] as string[]; } diff --git a/packages/grafana-ui/src/components/TransformersUI/SeriesToFieldsTransformerEditor.tsx b/packages/grafana-ui/src/components/TransformersUI/SeriesToFieldsTransformerEditor.tsx new file mode 100644 index 00000000000..3206d35c924 --- /dev/null +++ b/packages/grafana-ui/src/components/TransformersUI/SeriesToFieldsTransformerEditor.tsx @@ -0,0 +1,47 @@ +import React, { useMemo, useCallback } from 'react'; +import { + DataTransformerID, + standardTransformers, + TransformerRegistyItem, + TransformerUIProps, + SeriesToColumnsOptions, + SelectableValue, +} from '@grafana/data'; +import { getAllFieldNamesFromDataFrames } from './OrganizeFieldsTransformerEditor'; +import { Select } from '../Select/Select'; + +export const SeriesToFieldsTransformerEditor: React.FC> = ({ + input, + options, + onChange, +}) => { + const fieldNames = useMemo(() => getAllFieldNamesFromDataFrames(input), [input]); + const fieldNameOptions = fieldNames.map((item: string) => ({ label: item, value: item })); + + const onSelectField = useCallback( + (value: SelectableValue) => { + onChange({ + ...options, + byField: value.value, + }); + }, + [onChange, options] + ); + + return ( +
+
+
Field
+ + {choices.length > 1 && ( -
- + )}
-
@@ -83,7 +133,7 @@ export class InspectDataTab extends PureComponent { return (
- +
); }} @@ -93,3 +143,25 @@ export class InspectDataTab extends PureComponent { ); } } + +function buildTransformationOptions() { + const transformations: Array> = [ + { + value: 'Do nothing', + label: 'None', + transformer: { + id: DataTransformerID.noop, + }, + }, + { + value: 'join by time', + label: 'Join by time', + transformer: { + id: DataTransformerID.seriesToColumns, + options: { byField: 'Time' }, + }, + }, + ]; + + return transformations; +} diff --git a/public/app/features/dashboard/components/Inspector/PanelInspector.tsx b/public/app/features/dashboard/components/Inspector/PanelInspector.tsx index d8c99961416..673238b0f95 100644 --- a/public/app/features/dashboard/components/Inspector/PanelInspector.tsx +++ b/public/app/features/dashboard/components/Inspector/PanelInspector.tsx @@ -53,8 +53,6 @@ interface State { last: PanelData; // Data from the last response data: DataFrame[]; - // The selected data frame - selectedDataFrame: number; // The Selected Tab currentTab: InspectTab; // If the datasource supports custom metadata @@ -73,7 +71,6 @@ export class PanelInspectorUnconnected extends PureComponent { isLoading: true, last: {} as PanelData, data: [], - selectedDataFrame: 0, currentTab: props.defaultTab ?? InspectTab.Data, drawerWidth: '50%', }; @@ -165,10 +162,6 @@ export class PanelInspectorUnconnected extends PureComponent { this.setState({ currentTab: item.value || InspectTab.Data }); }; - onSelectedFrameChanged = (item: SelectableValue) => { - this.setState({ selectedDataFrame: item.value || 0 }); - }; - renderMetadataInspector() { const { metaDS, data } = this.state; if (!metaDS || !metaDS.components?.MetadataInspector) { @@ -178,16 +171,8 @@ export class PanelInspectorUnconnected extends PureComponent { } renderDataTab() { - const { last, isLoading, selectedDataFrame } = this.state; - - return ( - - ); + const { last, isLoading } = this.state; + return ; } renderErrorTab(error?: DataQueryError) { diff --git a/public/app/features/dashboard/components/Inspector/QueryInspector.tsx b/public/app/features/dashboard/components/Inspector/QueryInspector.tsx index 6f542a5d169..1f125ed078b 100644 --- a/public/app/features/dashboard/components/Inspector/QueryInspector.tsx +++ b/public/app/features/dashboard/components/Inspector/QueryInspector.tsx @@ -223,6 +223,7 @@ export class QueryInspector extends PureComponent { )} +
{isLoading && }