From 92801d5fa1d6bfafad653710b45d4f624e17d0f1 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 14 Jul 2021 02:24:12 -0700 Subject: [PATCH] Transformations: add 'prepare time series' transformer (#36737) * adding transformer that will stretch a data frame from wide to long. * added a UI for the stretch frames transformer. * refactored according to feedback. * removed unused dep. * making sure it is being displayed. * minor adjustments. * move stretch to prepare * improved readability of tests. * refactored to use a function component syntax. Co-authored-by: Marcus Andersson --- .../src/transformations/transformers/ids.ts | 1 + .../PrepareTimeSeriesEditor.tsx | 94 ++++++++ .../prepareTimeSeries.test.ts | 214 ++++++++++++++++++ .../prepareTimeSeries/prepareTimeSeries.ts | 93 ++++++++ public/app/core/utils/standardTransformers.ts | 2 + 5 files changed, 404 insertions(+) create mode 100644 public/app/core/components/TransformersUI/prepareTimeSeries/PrepareTimeSeriesEditor.tsx create mode 100644 public/app/core/components/TransformersUI/prepareTimeSeries/prepareTimeSeries.test.ts create mode 100644 public/app/core/components/TransformersUI/prepareTimeSeries/prepareTimeSeries.ts diff --git a/packages/grafana-data/src/transformations/transformers/ids.ts b/packages/grafana-data/src/transformations/transformers/ids.ts index 9018302f605..a09e2075e22 100644 --- a/packages/grafana-data/src/transformations/transformers/ids.ts +++ b/packages/grafana-data/src/transformations/transformers/ids.ts @@ -25,4 +25,5 @@ export enum DataTransformerID { histogram = 'histogram', configFromData = 'configFromData', rowsToFields = 'rowsToFields', + prepareTimeSeries = 'prepareTimeSeries', } diff --git a/public/app/core/components/TransformersUI/prepareTimeSeries/PrepareTimeSeriesEditor.tsx b/public/app/core/components/TransformersUI/prepareTimeSeries/PrepareTimeSeriesEditor.tsx new file mode 100644 index 00000000000..e4f24118804 --- /dev/null +++ b/public/app/core/components/TransformersUI/prepareTimeSeries/PrepareTimeSeriesEditor.tsx @@ -0,0 +1,94 @@ +import React, { useCallback } from 'react'; +import { GrafanaTheme2, SelectableValue, TransformerRegistryItem, TransformerUIProps } from '@grafana/data'; +import { prepareTimeSeriesTransformer, PrepareTimeSeriesOptions, timeSeriesFormat } from './prepareTimeSeries'; +import { InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui'; +import { css } from '@emotion/css'; + +const wideInfo = { + label: 'Wide time series', + value: timeSeriesFormat.TimeSeriesWide, + description: 'Creates a single frame joined by time', + info: ( + + ), +}; + +const manyInfo = { + label: 'Multi-frame time series', + value: timeSeriesFormat.TimeSeriesMany, + description: 'Creates a new frame for each time/number pair', + info: ( + + ), +}; + +const formats: Array> = [wideInfo, manyInfo]; + +export function PrepareTimeSeriesEditor(props: TransformerUIProps): React.ReactElement { + const { options, onChange } = props; + const styles = useStyles2(getStyles); + + const onSelectFormat = useCallback( + (value: SelectableValue) => { + onChange({ + ...options, + format: value.value!, + }); + }, + [onChange, options] + ); + + return ( + <> + + +