Skip to content

Commit a1d5e15

Browse files
committedJul 7, 2023
[Dashboard De-Angular] Fix filter and query related functional tests in functional test group 3 (opensearch-project#4495)
* fix index pattern window Signed-off-by: abbyhu2000 <abigailhu2000@gmail.com> * Fix time filter and query related functionalt test in group 3 Signed-off-by: abbyhu2000 <abigailhu2000@gmail.com> --------- Signed-off-by: abbyhu2000 <abigailhu2000@gmail.com>
1 parent 669a2f7 commit a1d5e15

File tree

9 files changed

+106
-171
lines changed

9 files changed

+106
-171
lines changed
 

‎src/plugins/dashboard/public/application/components/dashboard_editor.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const DashboardEditor = () => {
3939
savedDashboardInstance
4040
);
4141

42-
const { dashboardContainer } = useDashboardContainer(
42+
const { dashboardContainer, indexPatterns } = useDashboardContainer(
4343
services,
4444
isChromeVisible,
4545
eventEmitter,
@@ -93,6 +93,7 @@ export const DashboardEditor = () => {
9393
console.log('isDirty', dashboard.isDirty);
9494
}
9595
console.log('dashboardContainer', dashboardContainer);
96+
console.log('indexPatterns', indexPatterns);
9697

9798
return (
9899
<div>
@@ -109,6 +110,7 @@ export const DashboardEditor = () => {
109110
dashboard={dashboard}
110111
currentAppState={currentAppState}
111112
isEmbeddableRendered={isEmbeddableRendered}
113+
indexPatterns={indexPatterns}
112114
dashboardContainer={dashboardContainer}
113115
/>
114116
)}

‎src/plugins/dashboard/public/application/components/dashboard_top_nav.tsx

+7-39
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import { uniqBy } from 'lodash';
76
import React, { memo, useState, useEffect } from 'react';
87
import { Filter, IndexPattern } from 'src/plugins/data/public';
98
import { useCallback } from 'react';
@@ -13,7 +12,6 @@ import { getTopNavConfig } from '../top_nav/get_top_nav_config';
1312
import { DashboardAppStateContainer, DashboardAppState, DashboardServices } from '../../types';
1413
import { getNavActions } from '../utils/get_nav_actions';
1514
import { DashboardContainer } from '../embeddable';
16-
import { isErrorEmbeddable } from '../../embeddable_plugin';
1715
import { Dashboard } from '../../dashboard';
1816

1917
interface DashboardTopNavProps {
@@ -23,6 +21,7 @@ interface DashboardTopNavProps {
2321
dashboard: Dashboard;
2422
currentAppState: DashboardAppState;
2523
isEmbeddableRendered: boolean;
24+
indexPatterns: IndexPattern[];
2625
dashboardContainer?: DashboardContainer;
2726
}
2827

@@ -42,16 +41,14 @@ const TopNav = ({
4241
currentAppState,
4342
isEmbeddableRendered,
4443
dashboardContainer,
44+
indexPatterns,
4545
}: DashboardTopNavProps) => {
46-
const [filters, setFilters] = useState<Filter[]>([]);
4746
const [topNavMenu, setTopNavMenu] = useState<any>();
4847
const [isFullScreenMode, setIsFullScreenMode] = useState<any>();
49-
const [indexPatterns, setIndexPatterns] = useState<IndexPattern[]>();
5048

5149
const { services } = useOpenSearchDashboards<DashboardServices>();
5250
const { TopNavMenu } = services.navigation.ui;
53-
const { data, dashboardConfig, setHeaderActionMenu } = services;
54-
const { query: queryService } = data;
51+
const { dashboardConfig, setHeaderActionMenu } = services;
5552

5653
const location = useLocation();
5754
const queryParameters = new URLSearchParams(location.search);
@@ -76,10 +73,6 @@ const TopNav = ({
7673
const shouldShowNavBarComponent = (forceShow: boolean): boolean =>
7774
(forceShow || isChromeVisible) && !currentAppState?.fullScreenMode;
7875

79-
useEffect(() => {
80-
setFilters(queryService.filterManager.getFilters());
81-
}, [services, queryService]);
82-
8376
useEffect(() => {
8477
if (isEmbeddableRendered) {
8578
const navActions = getNavActions(
@@ -112,33 +105,6 @@ const TopNav = ({
112105
setIsFullScreenMode(currentAppState?.fullScreenMode);
113106
}, [currentAppState, services]);
114107

115-
useEffect(() => {
116-
const asyncSetIndexPattern = async () => {
117-
if (dashboardContainer) {
118-
let panelIndexPatterns: IndexPattern[] = [];
119-
dashboardContainer.getChildIds().forEach((id) => {
120-
const embeddableInstance = dashboardContainer.getChild(id);
121-
if (isErrorEmbeddable(embeddableInstance)) return;
122-
const embeddableIndexPatterns = (embeddableInstance.getOutput() as any).indexPatterns;
123-
if (!embeddableIndexPatterns) return;
124-
panelIndexPatterns.push(...embeddableIndexPatterns);
125-
});
126-
panelIndexPatterns = uniqBy(panelIndexPatterns, 'id');
127-
128-
if (panelIndexPatterns.length > 0) {
129-
setIndexPatterns(panelIndexPatterns);
130-
} else {
131-
const defaultIndex = await services.data.indexPatterns.getDefault();
132-
if (defaultIndex) {
133-
setIndexPatterns([defaultIndex]);
134-
}
135-
}
136-
}
137-
};
138-
139-
asyncSetIndexPattern();
140-
}, [dashboardContainer, stateContainer, currentAppState, services.data.indexPatterns]);
141-
142108
const shouldShowFilterBar = (forceHide: boolean): boolean =>
143109
!forceHide && (currentAppState.filters!.length > 0 || !currentAppState?.fullScreenMode);
144110

@@ -156,7 +122,6 @@ const TopNav = ({
156122
return (
157123
<TopNavMenu
158124
appName={'dashboard'}
159-
savedQueryId={currentAppState?.savedQuery}
160125
config={showTopNavMenu ? topNavMenu : undefined}
161126
className={isFullScreenMode ? 'osdTopNavMenu-isFullScreen' : undefined}
162127
screenTitle={currentAppState.title}
@@ -169,7 +134,10 @@ const TopNav = ({
169134
indexPatterns={indexPatterns}
170135
showSaveQuery={services.dashboardCapabilities.saveQuery as boolean}
171136
savedQuery={undefined}
172-
onSavedQueryIdChange={() => {}}
137+
onSavedQueryIdChange={(savedQueryId?: string) => {
138+
stateContainer.transitions.set('savedQuery', savedQueryId);
139+
}}
140+
savedQueryId={currentAppState?.savedQuery}
173141
onQuerySubmit={handleRefresh}
174142
setMenuMountPoint={isEmbeddedExternally ? undefined : setHeaderActionMenu}
175143
/>

‎src/plugins/dashboard/public/application/lib/save_dashboard.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { SavedObjectSaveOpts } from 'src/plugins/saved_objects/public';
3333
import { updateSavedDashboard } from './update_saved_dashboard';
3434

3535
import { DashboardAppStateContainer } from '../../types';
36+
import { Dashboard } from '../../dashboard';
3637

3738
/**
3839
* Saves the dashboard.
@@ -43,11 +44,12 @@ export function saveDashboard(
4344
timeFilter: TimefilterContract,
4445
stateContainer: DashboardAppStateContainer,
4546
savedDashboard: any,
46-
saveOptions: SavedObjectSaveOpts
47+
saveOptions: SavedObjectSaveOpts,
48+
dashboard: Dashboard
4749
): Promise<string> {
4850
const appState = stateContainer.getState();
4951

50-
updateSavedDashboard(savedDashboard, appState, timeFilter);
52+
updateSavedDashboard(savedDashboard, appState, timeFilter, dashboard);
5153

5254
return savedDashboard.save(saveOptions).then((id: string) => {
5355
if (id) {

‎src/plugins/dashboard/public/application/lib/update_saved_dashboard.ts

+23-4
Original file line numberDiff line numberDiff line change
@@ -34,31 +34,37 @@ import { FilterUtils } from './filter_utils';
3434
import { SavedObjectDashboard } from '../../saved_dashboards';
3535
import { DashboardAppState } from '../../types';
3636
import { opensearchFilters } from '../../../../data/public';
37+
import { Dashboard } from '../../dashboard';
3738

3839
export function updateSavedDashboard(
3940
savedDashboard: SavedObjectDashboard,
4041
appState: DashboardAppState,
41-
timeFilter: TimefilterContract
42+
timeFilter: TimefilterContract,
43+
dashboard: Dashboard
4244
) {
4345
savedDashboard.title = appState.title;
4446
savedDashboard.description = appState.description;
4547
savedDashboard.timeRestore = appState.timeRestore;
4648
savedDashboard.panelsJSON = JSON.stringify(appState.panels);
4749
savedDashboard.optionsJSON = JSON.stringify(appState.options);
4850

49-
savedDashboard.timeFrom = savedDashboard.timeRestore
51+
const timeFrom = savedDashboard.timeRestore
5052
? FilterUtils.convertTimeToUTCString(timeFilter.getTime().from)
5153
: undefined;
52-
savedDashboard.timeTo = savedDashboard.timeRestore
54+
const timeTo = savedDashboard.timeRestore
5355
? FilterUtils.convertTimeToUTCString(timeFilter.getTime().to)
5456
: undefined;
57+
5558
const timeRestoreObj: RefreshInterval = _.pick(timeFilter.getRefreshInterval(), [
5659
'display',
5760
'pause',
5861
'section',
5962
'value',
6063
]) as RefreshInterval;
61-
savedDashboard.refreshInterval = savedDashboard.timeRestore ? timeRestoreObj : undefined;
64+
const refreshInterval = savedDashboard.timeRestore ? timeRestoreObj : undefined;
65+
savedDashboard.timeFrom = timeFrom;
66+
savedDashboard.timeTo = timeTo;
67+
savedDashboard.refreshInterval = refreshInterval;
6268

6369
// save only unpinned filters
6470
const unpinnedFilters = appState.filters.filter(
@@ -68,4 +74,17 @@ export function updateSavedDashboard(
6874

6975
// save the queries
7076
savedDashboard.searchSource.setField('query', appState.query as Query);
77+
78+
dashboard.setState({
79+
title: appState.title,
80+
description: appState.description,
81+
timeRestore: appState.timeRestore,
82+
panels: appState.panels,
83+
options: appState.options,
84+
timeFrom,
85+
timeTo,
86+
refreshInterval,
87+
query: appState.query as Query,
88+
filters: unpinnedFilters,
89+
});
7190
}

‎src/plugins/dashboard/public/application/utils/get_nav_actions.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,13 @@ export const getNavActions = (
373373
async function save(saveOptions: SavedObjectSaveOpts) {
374374
const timefilter = queryService.timefilter.timefilter;
375375
try {
376-
const id = await saveDashboard(timefilter, stateContainer, savedDashboard, saveOptions);
376+
const id = await saveDashboard(
377+
timefilter,
378+
stateContainer,
379+
savedDashboard,
380+
saveOptions,
381+
dashboard
382+
);
377383

378384
if (id) {
379385
notifications.toasts.addSuccess({

‎src/plugins/dashboard/public/application/utils/use/use_dashboard_container.tsx

+48-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import React, { useState } from 'react';
7-
import { cloneDeep, isEqual } from 'lodash';
7+
import { cloneDeep, isEqual, uniqBy } from 'lodash';
88
import { EMPTY, Observable, Subscription, merge, of, pipe } from 'rxjs';
99
import {
1010
catchError,
@@ -62,6 +62,7 @@ export const useDashboardContainer = (
6262
appState?: DashboardAppStateContainer
6363
) => {
6464
const [dashboardContainer, setDashboardContainer] = useState<DashboardContainer>();
65+
const [indexPatterns, setIndexPatterns] = useState<IndexPattern[]>([]);
6566

6667
useEffect(() => {
6768
const getDashboardContainer = async () => {
@@ -71,7 +72,8 @@ export const useDashboardContainer = (
7172
savedDashboardInstance,
7273
services,
7374
appState,
74-
dashboard
75+
dashboard,
76+
setIndexPatterns
7577
);
7678

7779
setDashboardContainer(dashboardContainerEmbeddable);
@@ -105,14 +107,15 @@ export const useDashboardContainer = (
105107
}
106108
}, [dashboardContainer, services]);
107109

108-
return { dashboardContainer };
110+
return { dashboardContainer, indexPatterns };
109111
};
110112

111113
const createDashboardEmbeddable = (
112114
savedDash: any,
113115
dashboardServices: DashboardServices,
114116
appState: DashboardAppStateContainer,
115-
dashboard: Dashboard
117+
dashboard: Dashboard,
118+
setIndexPatterns: React.Dispatch<React.SetStateAction<IndexPattern[]>>
116119
) => {
117120
let dashboardContainer: DashboardContainer;
118121
let inputSubscription: Subscription | undefined;
@@ -240,6 +243,45 @@ const createDashboardEmbeddable = (
240243
expandedPanelId: appStateData.expandedPanelId,
241244
};
242245
};
246+
const setCurrentIndexPatterns = () => {
247+
let panelIndexPatterns: IndexPattern[] = [];
248+
dashboardContainer.getChildIds().forEach((id) => {
249+
const embeddableInstance = dashboardContainer.getChild(id);
250+
if (isErrorEmbeddable(embeddableInstance)) return;
251+
const embeddableIndexPatterns = (embeddableInstance.getOutput() as any).indexPatterns;
252+
if (!embeddableIndexPatterns) return;
253+
panelIndexPatterns.push(...embeddableIndexPatterns);
254+
});
255+
panelIndexPatterns = uniqBy(panelIndexPatterns, 'id');
256+
return panelIndexPatterns;
257+
};
258+
259+
const updateIndexPatternsOperator = pipe(
260+
filter((container: DashboardContainer) => !!container && !isErrorEmbeddable(container)),
261+
map(setCurrentIndexPatterns),
262+
distinctUntilChanged((a, b) =>
263+
deepEqual(
264+
a.map((ip) => ip.id),
265+
b.map((ip) => ip.id)
266+
)
267+
),
268+
// using switchMap for previous task cancellation
269+
switchMap((panelIndexPatterns: IndexPattern[]) => {
270+
return new Observable((observer) => {
271+
if (panelIndexPatterns && panelIndexPatterns.length > 0) {
272+
if (observer.closed) return;
273+
setIndexPatterns(panelIndexPatterns);
274+
observer.complete();
275+
} else {
276+
data.indexPatterns.getDefault().then((defaultIndexPattern) => {
277+
if (observer.closed) return;
278+
setIndexPatterns([defaultIndexPattern as IndexPattern]);
279+
observer.complete();
280+
});
281+
}
282+
});
283+
})
284+
);
243285

244286
if (dashboardFactory) {
245287
return dashboardFactory
@@ -321,7 +363,8 @@ const createDashboardEmbeddable = (
321363
)
322364
.pipe(
323365
mapTo(dashboardContainer),
324-
startWith(dashboardContainer) // to trigger initial index pattern update
366+
startWith(dashboardContainer), // to trigger initial index pattern update
367+
updateIndexPatternsOperator
325368
)
326369
.subscribe();
327370

‎src/plugins/dashboard/public/application/utils/use/use_editor_updates.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ export const useEditorUpdates = (
4343
if (changes) {
4444
dashboardContainer.updateInput(changes);
4545

46-
if (changes.filters || changes.query || changes.timeRange || changes.refreshConfig) {
46+
if (changes.timeRange || changes.refreshConfig) {
47+
if (dashboardInstance.timeRestore) {
48+
dashboard.isDirty = true;
49+
}
50+
}
51+
52+
if (changes.filters || changes.query) {
4753
dashboard.isDirty = true;
4854
}
4955
}

‎src/plugins/dashboard/public/dashboard.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class Dashboard<TDashboardParams = DashboardParams> {
7373
this.filters = cloneDeep(dashboardState.filters);
7474
}
7575

76-
async setState(state: PartialDashboardState) {
76+
setState(state: PartialDashboardState) {
7777
if (state.id) {
7878
this.id = state.id;
7979
}
@@ -109,12 +109,12 @@ export class Dashboard<TDashboardParams = DashboardParams> {
109109
if (state.searchSource) {
110110
this.searchSource = state.searchSource;
111111
}
112-
// if (state.query) {
113-
// this.query = this.getQuery(state.query);
114-
// }
115-
// if (state.filters) {
116-
// this.filters = this.getFilters(state.filters);
117-
// }
112+
if (state.query) {
113+
this.query = state.query;
114+
}
115+
if (state.filters) {
116+
this.filters = state.filters;
117+
}
118118
}
119119

120120
public setIsDirty(value: boolean) {

0 commit comments

Comments
 (0)