diff --git a/packages/grafana-data/src/transformations/transformers/organize.test.ts b/packages/grafana-data/src/transformations/transformers/organize.test.ts index 712d9c17c15..34a73672dc6 100644 --- a/packages/grafana-data/src/transformations/transformers/organize.test.ts +++ b/packages/grafana-data/src/transformations/transformers/organize.test.ts @@ -70,6 +70,33 @@ describe('OrganizeFields Transformer', () => { ]); }); }); + + it('should order and filter (inclusion) according to config', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.organize, + options: { + excludeByName: {}, + indexByName: {}, + includeByName: { + time: true, + }, + renameByName: {}, + }, + }; + + await expect(transformDataFrame([cfg], [data])).toEmitValuesWith((received) => { + const data = received[0]; + const organized = data[0]; + expect(organized.fields).toEqual([ + { + config: {}, + name: 'time', + type: FieldType.time, + values: [3000, 4000, 5000, 6000], + }, + ]); + }); + }); }); describe('when inconsistent data is received', () => { diff --git a/packages/grafana-data/src/transformations/transformers/organize.ts b/packages/grafana-data/src/transformations/transformers/organize.ts index 3eb8b04e709..dfda3a779b4 100644 --- a/packages/grafana-data/src/transformations/transformers/organize.ts +++ b/packages/grafana-data/src/transformations/transformers/organize.ts @@ -9,6 +9,7 @@ export interface OrganizeFieldsTransformerOptions extends OrderFieldsTransformerOptions, RenameFieldsTransformerOptions { excludeByName: Record; + includeByName?: Record; } export const organizeFieldsTransformer: DataTransformerInfo = { @@ -19,6 +20,7 @@ export const organizeFieldsTransformer: DataTransformerInfo { return data.length > 1 @@ -33,6 +35,7 @@ export const organizeFieldsTransformer: DataTransformerInfo {} const OrganizeFieldsTransformerEditor = ({ options, input, onChange }: OrganizeFieldsTransformerEditorProps) => { - const { indexByName, excludeByName, renameByName } = options; + const { indexByName, excludeByName, renameByName, includeByName } = options; const fieldNames = useAllFieldNamesFromDataFrames(input); const orderedFieldNames = useMemo(() => orderFieldNamesByIndex(fieldNames, indexByName), [fieldNames, indexByName]); + const filterType = includeByName && Object.keys(includeByName).length > 0 ? 'include' : 'exclude'; const onToggleVisibility = useCallback( (field: string, shouldExclude: boolean) => { @@ -38,6 +39,20 @@ const OrganizeFieldsTransformerEditor = ({ options, input, onChange }: OrganizeF [onChange, options, excludeByName] ); + const onToggleVisibilityInclude = useCallback( + (field: string, shouldInclude: boolean) => { + const pendingState = { + ...options, + includeByName: { + ...includeByName, + [field]: !shouldInclude, + }, + }; + onChange(pendingState); + }, + [onChange, options, includeByName] + ); + const onDragEnd = useCallback( (result: DropResult) => { if (!result || !result.destination) { @@ -88,14 +103,18 @@ const OrganizeFieldsTransformerEditor = ({ options, input, onChange }: OrganizeF {(provided) => (
{orderedFieldNames.map((fieldName, index) => { + const isIncludeFilter = includeByName && fieldName in includeByName ? includeByName[fieldName] : false; + const isVisible = filterType === 'include' ? isIncludeFilter : !excludeByName[fieldName]; + const onToggleFunction = filterType === 'include' ? onToggleVisibilityInclude : onToggleVisibility; + return ( );