Files
grafana/public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx
Jev Forsberg a99485ba33 Transformations: Build help content for all standard transformers (#74052)
* baldm0mma/transformation_info_modal

* baldm0mma/transformation_info_modal/ add getDisplayContent

* baldm0mma/transformation_info_modal/ reamove OperationRowHelp

* baldm0mma/transformation_info_modal/ update prepMarkdown

* baldm0mma/transformation_help_modal/ add example mkdwn

* baldm0mma/transformation_help_modal/ add examples anno

* baldm0mma/transformation_info_modal/ add calFieldHelper

* baldm0mma/transformation_info_modal/ remove file

* baldm0mma/transformation_info_modal/ add CalculateFieldHelper

* baldm0mma/transformation_info_modal/ add TransformationEditorHelperModal

* baldm0mma/transformation_info_modal/ add getHelperContent

* baldm0mma/transformation_info_modal/ move TransformationEditorHelperModal

* baldm0mma/transformation_info_modal/ add ReactElement

* baldm0mma/transformations_info_modal

* baldm0mma/transformation_info_modal/ update props for TransformationEditorHelperModal

* baldm0mma/transformation_info_modal/ test

* test

* baldm0mma/transformation_info_modal/ reset vscode auth

* baldm0mma/transformation_info_modal/ update getHelperContent

* baldm0mma/transformations_info_modal/ add items for rebuilding markdown to react component

* test

* test

* baldm0mma/transformations_info_modal/ remove comment in TransformationOperationRow

* test

* baldm0mma/transformation_info_modal/ add element to typing

* baldm0mma/transformation_info_modal/ update getHelperContent with help component

* baldm0mma/transformation_info_modal/ update modal title

* baldm0mma/transformation_info_modal/ move logic to tranforms

* baldm0mma/transformation_info_modal/ remove unused comments

* baldm0mma/transformation_info_modal/ update standard reg

* baldm0mma/trfansformation_info_modal/ remove context styling

* baldm0mma/transformation_info_modal/ add content for CalculateFieldHelper

* baldm0mma/transformation_info_modal/ add ConcatenateHelper

* baldm0mma/transformations_info_modal/ add ConcatenateHelper

* baldm0mma/transformation_info_modal/ add ConfigFromQueryHelper

* baldm0mma/transformations/info_modal/ add ConvertFieldTypeHelper

* baldm0mma/transformation_info_modal/ add CreateHeatmapHelp

* baldm0mma/transformation_info_modal/ add ExtractFieldsHelper

* baldm0mma/transformation_info_modal/ add FilterFieldsByNameHelper

* baldm0mma/transformation_info_modal/ add FilterFieldsByNameHelper

* baldm0mma/transformation_info_modal/ add OperationRowHelp to parse markdown

* baldm0mma/transformation_info_modal/ remove commented out markdown

* baldm0mma/transformations_info_modal/ remove comment

* baldm0mma/transformation_info_modal/ update configFromQueryTransformRegistryItem

* baldm0mma/transformation_info_modal/ update ConcatenateHelper

* baldm0mma/transformation_info_modal/ update ConvertFieldTypeHelper

* baldm0mma/transformation_info_modal/ update ExtractFieldsHelper

* baldm0mma/transformation_info_modal/ update FieldLookupHelper

* baldm0mma/transformation_info_modal/ update TransformationEditorHelperModal with determineContentDisplay()

* baldm0mma/transformation_info_modal/ add FilterByRefIdHelper

* baldm0mma/transformation_info_modal/ add FilterByValueHelper

* baldm0mma/transformation_info_modal/ update file ext

* baldm0mma/transformation_info_modal/ add GroupByHelper

* baldm0mma/transformation_info_modal/ add HistogramHelper

* baldm0mma/transformation_info_modal/ add JoinByFieldHelper

* baldm0mma/transformation_info_modal/ add JoinByLabelsHelper

* baldm0mma/transformations_info_modal/ add LabelsToFieldsHelper

* baldm0mma/transformation_info_modal/ add LimitHelper

* baldm0mma/transformation_info_modal/ add MergeHelper

* baldm0mma/transformation_info_modal/ add PartitionByValuesHelper

* baldm0mma/transformation_info_modal/ add ReduceHelper

* baldm0mma/transformation_info_modal/ add RenameByRegexHelper

* baldm0mma/transformation_info_modal/ add SeriesToRowsHelper

* baldm0mma/transformation_info_modal/ add SortByHelper

* baldm0mma/transformations_info_modal/ add spatial

* baldm0mma/transformation_info_modal/ update to markdown

* baldm0mma/transformation_info_modal/ remove comments

* baldm0mma/transformation_info_modal/ update boarder with theme

* baldm0mma/transformation_info_modal/ add test suite

* baldm0mma/transformation_info_modal/ update tests

* baldm0mma/transformation_info_modal/ update test to run on all transformations

* baldm0mma/transformation_info_modaol/ add TimeSeriesTableHelper

* baldm0mma/transformation_info_modal/ update concatenateHelper

* baldm0mma/transformation_info_modal/ update calculateFieldHelper

* baldmomma/transformation_info_modal/ update naming

* baldm0mma/transformation_info_modal/ update getLinkToDocs location

* baldm0mma/transformation_info_modal/ update docs

* baldm0mma/transformation_info_modal/ update language

* baldm0mma/transformation_info_modal/ rename test

* baldm0mma/transformation_info_modal/ update naming 2

* baldm0mma/transformation_info_modal/ update to helper

* baldm0mma/transformation_info_modal/ update docs

* Apply suggestions from @imatwawana

Co-authored-by: Isabel <76437239+imatwawana@users.noreply.github.com>

* baldm0mma/transformation_info_modal/ update convertFieldTypeHelper capitalization

* Hack around with generating Markdown from transformations helpers (#75677)

```console
$ cd docs
$ make sources/panels-visualizations/query-transform-data/transform-data/index.md
$ make docs
```

Browse to http://localhost:3003/docs/grafana/latest/panels-visualizations/query-transform-data/transform-data/

Signed-off-by: Jack Baldry <jack.baldry@grafana.com>

* baldm0mma/transformation_info_modal/ add calculateFieldHelper

* baldm0mma/transformation_info_modal/ update concatenate

* baldm0mma/transformation_info_modal/ add fieldLookup

* baldm0mma/transformation_info_modal/ add filterFieldsByName

* baldm0mma/transformation_info_modal/ add joinByField

* baldm0mma/transformation_info_modal/ update renameByRegex

* baldm0mma/transformation_info_modal/ update getHelperContent

* baldm0mma/transformation_info_modal/ update calculateFieldTransformRegistryItem

* baldm0mma/transformation_info_modal/ update concatenateTransformRegistryItem

* baldm0mma/transformation_info_modal/ update configFromDataTransformer

* baldm0mma/transformation_info_modal/ update extractFieldsTransformRegistryItem

* baldm0mma/transformation_info_modal/ update formatTimeTransformerRegistryItem

* baldm0mma/transformation_info_modal/ update heatmapTransformRegistryItem

* baldm0mma/transformation_info_modal/ update mergeTransformerRegistryItem

* baldm0mma/transformation_info_modal/ update timeSeriesTableTransformRegistryItem

* baldm0mma/transformation_info_modal/ update doc builder

* baldm0mma/transformation_info_modal/ update docs

* baldm0mma/transformation_info_modal/ remove console log

* baldm0mma/transformation_info_modal/ update console log

* baldm0mma/transformation_info_modal/ update gitignore

* baldm0mma/transformation_info_modal/ update calculateField

* baldm0mma/transformation_info_modal/ add links

* baldm0mma/transformation_info_modal/ update template

* baldm0mma/transformation_info_modal/ update template with images

* baldm0mma/transformation_info_modal/ build markdown

* baldm0mma/transformations_info_modal/update with links

* baldm0mma/transformation_info_modal/ update links

* baldm0mma/transformation_info_modal/ apdate FormatTimeTransfomerEditor

* baldm0mma/transformation_indo_modal/ update HeatmapTransformerEditor

* baldm0mma/transformation_indo_modal/ update ConfigFromQueryTransformerEditor

* baldm0mma/transformation_indo_modal/ update CalculateFieldTransformerEditor

* baldm0mma/transformation_indo_modal/ update ConcatenateTransformerEditor

* baldm0mma/transformation_indo_modal/ update FilterByNameTransformerEditor

* baldm0mma/transformation_indo_modal/ update FilterByRefIdTransformerEditor

* baldm0mma/transformation_indo_modal/ update GroupByTransformerEditor

* baldm0mma/transformation_indo_modal/ update GroupingToMatrixTransformerEditor get helper

* baldm0mma/transformation_indo_modal/ update SeriesToFieldsTransformerEditor get helper

* baldm0mma/transformation_indo_modal/ update LabelsAsFieldsTransformerEditor

* baldm0mma/transformation_info_modal/ update MergeTransformerEditor

* baldm0mma/transformation_info_modal/ update OrganizeFieldsTransformerEditor

* baldm0mma/transformation_info_modal/ update ReduceTransformerEditor

* baldm0mma/transformation_info_modal/ update RenameByRegexTransformerEditor

* baldm0mma/transformation_info_modal/ update SeriesToRowsTransformerEditor

* baldm0mma/transformation_info_modal/ update SortByTransformerEditor

* baldm0mma/transformation_info_modal/ update extractFieldsTransformerEditor

* baldm0mma/transformation_info_modal/ update FilterByValueTransformerEditor

* baldm0mma/transformation_info_modal/ update JoinByLabelsTransformerEditor

* baldm0mma/transformation_info_modal/ update FieldLookupTransformerEditor

* baldm0mma/transformation_info_modal/ update PartitionByValuesEditor

* baldm0mma/transformation_info_modal/ update PrepareTimeSeriesEditor

* baldm0mma/transformation_info_modal/ update RowsToFieldsTransformerEditor

* baldm0mma/transformation_info_modal/ update spatialTransformRegistryItem

* baldm0mma/transformation_info_modal/ update timeSeriesTableTransformRegistryItem

* baldm0mma/transformation_info_modal/ update to helperDocs

* baldm0mma/transformation_info_modal/ update built markdown

* baldm0mma/transformation_info_modal/ run prettier

* baldm0mma/transformation_info_modal/ update comments in getTransformationContent

* baldm0mma/transformation_info_modal/ add removeMarkdownAnchorLinks

* baldm0mma/transformation_info_modal/ update annos in getTransformationContent

* baldm0mma/transformation_info_modal/ add requisite url prefix to markdown images

* baldm0mma/transformation_info_modal/ add cleanMarkdownOfUnwantedSyntax

* baldm0mma/transformation_info_modal/ update annos in content.ts

* baldm0mma/transformation_info_modal/ update e2e tests with always-visiable trabnsformation

* baldm0mma/transformation_info_modal/ remove note

* baldm0mma/transformation_info_modal/ add annotation in getTransformationContent

* baldm0mma/transformation_info_modal/ update e2e test naming

---------

Signed-off-by: Jack Baldry <jack.baldry@grafana.com>
Co-authored-by: Isabel <76437239+imatwawana@users.noreply.github.com>
Co-authored-by: Jack Baldry <jack.baldry@grafana.com>
2023-11-07 09:29:45 -07:00

169 lines
5.3 KiB
TypeScript

import React, { useMemo } from 'react';
import {
PluginState,
SelectableValue,
TransformerRegistryItem,
TransformerUIProps,
TransformerCategory,
} from '@grafana/data';
import { Alert, HorizontalGroup, InlineField, InlineFieldRow, Select, ValuePicker } from '@grafana/ui';
import { getTransformationContent } from '../docs/getTransformationContent';
import { getDistinctLabels } from '../utils';
import { joinByLabelsTransformer, JoinByLabelsTransformOptions } from './joinByLabels';
export interface Props extends TransformerUIProps<JoinByLabelsTransformOptions> {}
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 = <Alert title="No input found">No input (or labels) found</Alert>;
} else if (distinct.size === 0) {
warn = <Alert title="No labels found">The input does not contain any labels</Alert>;
}
// 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<string>) => {
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 (
<div>
{info.warn}
<InlineFieldRow>
<InlineField
error="required"
invalid={!Boolean(options.value?.length)}
label={'Value'}
labelWidth={labelWidth}
tooltip="Select the label indicating the values name"
>
<Select
options={info.valueOptions}
value={info.valueOption}
onChange={(v) => onChange({ ...options, value: v.value! })}
noOptionsMessage={noOptionsMessage}
/>
</InlineField>
</InlineFieldRow>
{info.hasJoin ? (
options.join!.map((v, idx) => (
<InlineFieldRow key={v + idx}>
<InlineField
label={'Join'}
labelWidth={labelWidth}
error="Unable to join by the value label"
invalid={v === options.value}
>
<HorizontalGroup>
<Select
options={info.joinOptions}
value={info.joinOptions.find((o) => o.value === v)}
isClearable={true}
onChange={(v) => updateJoinValue(idx, v?.value)}
noOptionsMessage={noOptionsMessage}
/>
{Boolean(info.addOptions.length && idx === options.join!.length - 1) && (
<ValuePicker
icon="plus"
label={''}
options={info.addOptions}
onChange={addJoin}
variant="secondary"
/>
)}
</HorizontalGroup>
</InlineField>
</InlineFieldRow>
))
) : (
<>
{Boolean(info.addOptions.length) && (
<InlineFieldRow>
<InlineField label={'Join'} labelWidth={labelWidth}>
<Select
options={info.addOptions}
placeholder={info.addText}
onChange={addJoin}
noOptionsMessage={noOptionsMessage}
/>
</InlineField>
</InlineFieldRow>
)}
</>
)}
</div>
);
}
export const joinByLabelsTransformRegistryItem: TransformerRegistryItem<JoinByLabelsTransformOptions> = {
id: joinByLabelsTransformer.id,
editor: JoinByLabelsTransformerEditor,
transformation: joinByLabelsTransformer,
name: joinByLabelsTransformer.name,
description: joinByLabelsTransformer.description,
state: PluginState.beta,
categories: new Set([TransformerCategory.Combine]),
help: getTransformationContent(joinByLabelsTransformer.id).helperDocs,
};