|
4 | 4 | */ |
5 | 5 |
|
6 | 6 | import React, { useCallback, useMemo, useState } from 'react'; |
7 | | -import { cloneDeep } from 'lodash'; |
| 7 | +import { cloneDeep, get } from 'lodash'; |
8 | 8 | import { useDebounce } from 'react-use'; |
9 | 9 | import { useTypedDispatch, useTypedSelector } from '../../utils/state_management'; |
10 | 10 | import { DefaultEditorAggParams } from '../../../../../vis_default_editor/public'; |
11 | 11 | import { Title } from './title'; |
12 | 12 | import { useIndexPatterns, useVisualizationType } from '../../utils/use'; |
13 | 13 | import { useOpenSearchDashboards } from '../../../../../opensearch_dashboards_react/public'; |
14 | 14 | import { WizardServices } from '../../../types'; |
15 | | -import { IAggType } from '../../../../../data/public'; |
| 15 | +import { AggParam, IAggType, IFieldParamType } from '../../../../../data/public'; |
16 | 16 | import { saveDraftAgg, editDraftAgg } from '../../utils/state_management/visualization_slice'; |
17 | 17 | import { setValidity } from '../../utils/state_management/metadata_slice'; |
18 | 18 |
|
@@ -109,6 +109,20 @@ export function SecondaryPanel() { |
109 | 109 | }} |
110 | 110 | onAggTypeChange={function (aggId: string, aggType: IAggType): void { |
111 | 111 | aggConfig.type = aggType; |
| 112 | + |
| 113 | + // Persist field if the new agg type supports the existing field |
| 114 | + const fieldParam = (aggType.params as AggParam[]).find(({ type }) => type === 'field'); |
| 115 | + if (fieldParam) { |
| 116 | + const availableFields = (fieldParam as IFieldParamType).getAvailableFields(aggConfig); |
| 117 | + const indexField = availableFields.find( |
| 118 | + ({ name }) => name === get(draftAgg, 'params.field') |
| 119 | + ); |
| 120 | + |
| 121 | + if (indexField) { |
| 122 | + aggConfig.params.field = indexField; |
| 123 | + } |
| 124 | + } |
| 125 | + |
112 | 126 | dispatch(editDraftAgg(aggConfig.serialize())); |
113 | 127 | }} |
114 | 128 | /> |
|
0 commit comments