From 176d7b3b48ab145bd1dedd54ca5590f7ba767c9e Mon Sep 17 00:00:00 2001 From: Ashwin P Chandran Date: Tue, 6 Sep 2022 16:35:29 -0700 Subject: [PATCH] Persists index field on agg type change if possible (#2227) Signed-off-by: Ashwin Pc Signed-off-by: Sergey V. Osipov --- .../components/data_tab/secondary_panel.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/plugins/wizard/public/application/components/data_tab/secondary_panel.tsx b/src/plugins/wizard/public/application/components/data_tab/secondary_panel.tsx index 60a1585a793..6fa6789d508 100644 --- a/src/plugins/wizard/public/application/components/data_tab/secondary_panel.tsx +++ b/src/plugins/wizard/public/application/components/data_tab/secondary_panel.tsx @@ -4,7 +4,7 @@ */ import React, { useCallback, useMemo, useState } from 'react'; -import { cloneDeep } from 'lodash'; +import { cloneDeep, get } from 'lodash'; import { useDebounce } from 'react-use'; import { useTypedDispatch, useTypedSelector } from '../../utils/state_management'; import { DefaultEditorAggParams } from '../../../../../vis_default_editor/public'; @@ -12,7 +12,7 @@ import { Title } from './title'; import { useIndexPatterns, useVisualizationType } from '../../utils/use'; import { useOpenSearchDashboards } from '../../../../../opensearch_dashboards_react/public'; import { WizardServices } from '../../../types'; -import { IAggType } from '../../../../../data/public'; +import { AggParam, IAggType, IFieldParamType } from '../../../../../data/public'; import { saveDraftAgg, editDraftAgg } from '../../utils/state_management/visualization_slice'; import { setValidity } from '../../utils/state_management/metadata_slice'; @@ -109,6 +109,20 @@ export function SecondaryPanel() { }} onAggTypeChange={function (aggId: string, aggType: IAggType): void { aggConfig.type = aggType; + + // Persist field if the new agg type supports the existing field + const fieldParam = (aggType.params as AggParam[]).find(({ type }) => type === 'field'); + if (fieldParam) { + const availableFields = (fieldParam as IFieldParamType).getAvailableFields(aggConfig); + const indexField = availableFields.find( + ({ name }) => name === get(draftAgg, 'params.field') + ); + + if (indexField) { + aggConfig.params.field = indexField; + } + } + dispatch(editDraftAgg(aggConfig.serialize())); }} />