Skip to content

Commit 0102a32

Browse files
[Data Explorer][Discover 2.0] Fix issues when change index pattern (#4875) (#4885)
* allow side nav show only selected index pattern fields when switch * allow reset column state when switch index pattern Issue Resolve: #4840 #4846 (cherry picked from commit 9958799) Signed-off-by: ananzh <ananzh@amazon.com> Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent f269920 commit 0102a32

File tree

4 files changed

+84
-15
lines changed

4 files changed

+84
-15
lines changed

src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,5 @@ export function getIndexPatternFieldList(
3636
fieldCounts?: Record<string, number>
3737
) {
3838
if (!indexPattern || !fieldCounts) return [];
39-
40-
const fieldNamesInDocs = Object.keys(fieldCounts);
41-
const fieldNamesInIndexPattern = indexPattern.fields.getAll().map((fld) => fld.name);
42-
const unknownTypes: IndexPatternField[] = [];
43-
44-
difference(fieldNamesInDocs, fieldNamesInIndexPattern).forEach((unknownFieldName) => {
45-
unknownTypes.push({
46-
displayName: String(unknownFieldName),
47-
name: String(unknownFieldName),
48-
type: 'unknown',
49-
} as IndexPatternField);
50-
});
51-
52-
return [...indexPattern.fields.getAll(), ...unknownTypes];
39+
return [...indexPattern.fields.getAll()];
5340
}

src/plugins/discover/public/application/view_components/canvas/index.tsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import React, { useEffect, useState } from 'react';
6+
import React, { useEffect, useState, useRef } from 'react';
77
import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiCallOut, EuiLink } from '@elastic/eui';
88
import { TopNav } from './top_nav';
99
import { ViewProps } from '../../../../../data_explorer/public';
@@ -14,10 +14,26 @@ import { ResultStatus, SearchData } from '../utils/use_search';
1414
import { DiscoverNoResults } from '../../components/no_results/no_results';
1515
import { DiscoverUninitialized } from '../../components/uninitialized/uninitialized';
1616
import { LoadingSpinner } from '../../components/loading_spinner/loading_spinner';
17+
import { setColumns, useDispatch, useSelector } from '../../utils/state_management';
18+
import { DiscoverViewServices } from '../../../build_services';
19+
import { useOpenSearchDashboards } from '../../../../../opensearch_dashboards_react/public';
20+
import { filterColumns } from '../utils/filter_columns';
21+
import { DEFAULT_COLUMNS_SETTING } from '../../../../common';
1722

1823
// eslint-disable-next-line import/no-default-export
1924
export default function DiscoverCanvas({ setHeaderActionMenu, history }: ViewProps) {
2025
const { data$, refetch$, indexPattern } = useDiscoverContext();
26+
const {
27+
services: { uiSettings },
28+
} = useOpenSearchDashboards<DiscoverViewServices>();
29+
const { columns } = useSelector((state) => state.discover);
30+
const filteredColumns = filterColumns(
31+
columns,
32+
indexPattern,
33+
uiSettings.get(DEFAULT_COLUMNS_SETTING)
34+
);
35+
const dispatch = useDispatch();
36+
const prevIndexPattern = useRef(indexPattern);
2137

2238
const [fetchState, setFetchState] = useState<SearchData>({
2339
status: data$.getValue().status,
@@ -69,6 +85,13 @@ export default function DiscoverCanvas({ setHeaderActionMenu, history }: ViewPro
6985
};
7086
}, [data$, fetchState]);
7187

88+
useEffect(() => {
89+
if (indexPattern !== prevIndexPattern.current) {
90+
dispatch(setColumns({ columns: filteredColumns }));
91+
prevIndexPattern.current = indexPattern;
92+
}
93+
}, [dispatch, filteredColumns, indexPattern]);
94+
7295
const timeField = indexPattern?.timeFieldName ? indexPattern.timeFieldName : undefined;
7396

7497
return (
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import { filterColumns } from './filter_columns';
7+
import { IndexPattern } from '../../../opensearch_dashboards_services';
8+
9+
describe('filterColumns', () => {
10+
const indexPatternMock = {
11+
fields: {
12+
getAll: () => [{ name: 'a' }, { name: 'c' }, { name: 'd' }],
13+
},
14+
} as IndexPattern;
15+
const defaultColumns = ['_defaultColumn'];
16+
17+
it('should return columns that exist in the index pattern fields', () => {
18+
const columns = ['a', 'b'];
19+
const result = filterColumns(columns, indexPatternMock, defaultColumns);
20+
expect(result).toEqual(['a']);
21+
});
22+
23+
it('should return defaultColumns if no columns exist in the index pattern fields', () => {
24+
const columns = ['b', 'e'];
25+
const result = filterColumns(columns, indexPatternMock, defaultColumns);
26+
expect(result).toEqual(defaultColumns);
27+
});
28+
29+
it('should return defaultColumns if no columns and indexPattern is null', () => {
30+
const columns = ['b', 'e'];
31+
const result = filterColumns(columns, null, defaultColumns);
32+
expect(result).toEqual(defaultColumns);
33+
});
34+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import { IndexPattern } from '../../../opensearch_dashboards_services';
7+
8+
/**
9+
* Helper function to filter columns based on the fields of the index pattern.
10+
* This function is used when we switch between index patterns. We want to keep the columns that are
11+
* still available in the new index pattern and remove the ones that are not.
12+
* If the resulting array is empty, it provides a fallback to the default column.
13+
* @param columns Array of column names
14+
* @param indexPattern Index pattern object
15+
* @param defaultColumns Array of default columns
16+
*/
17+
export function filterColumns(
18+
columns: string[],
19+
indexPattern: IndexPattern,
20+
defaultColumns: string[]
21+
) {
22+
const fieldsName = indexPattern?.fields.getAll().map((fld) => fld.name) || [];
23+
const filteredColumns = columns.filter((column) => fieldsName.includes(column));
24+
return filteredColumns.length > 0 ? filteredColumns : defaultColumns;
25+
}

0 commit comments

Comments
 (0)