From afbc376b2ce909cc1572428d78138e5514eb2a61 Mon Sep 17 00:00:00 2001 From: Tobias Skarhed <1438972+tskarhed@users.noreply.github.com> Date: Tue, 9 May 2023 21:04:58 +0200 Subject: [PATCH] Nested Folders: Do not keep search state when navigating to a result item (#67749) * Reset search state when navigating to a new search item * Reset query on search select * Spread initialState * Remove unused import * Only reset query * Add test * Fix spelling * Change functionality * Only applied saved filters when searching --- .../search/state/SearchStateManager.test.ts | 25 +++++++++++++++++++ .../search/state/SearchStateManager.ts | 8 +++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/public/app/features/search/state/SearchStateManager.test.ts b/public/app/features/search/state/SearchStateManager.test.ts index 11352388e1d..78267fadde4 100644 --- a/public/app/features/search/state/SearchStateManager.test.ts +++ b/public/app/features/search/state/SearchStateManager.test.ts @@ -3,6 +3,7 @@ import { locationService } from '@grafana/runtime'; import { DashboardQueryResult, getGrafanaSearcher } from '../service'; import { SearchLayout } from '../types'; +import * as utils from '../utils'; import { getSearchStateManager } from './SearchStateManager'; @@ -44,5 +45,29 @@ describe('SearchStateManager', () => { stm.initStateFromUrl(); expect(stm.state.folderUid).toBe(undefined); }); + + it('should reset filters if state is updated and no URL params are present', () => { + const parseRouteParamsSpy = jest.spyOn(utils, 'parseRouteParams'); + // Set initial values + parseRouteParamsSpy.mockImplementation(() => ({ + query: 'hello', + sort: 'alpha-asc', + })); + const stm = getSearchStateManager(); + stm.initStateFromUrl(); + + // Verify that they have been set + expect(stm.state.query).toBe('hello'); + expect(stm.state.sort).toBe('alpha-asc'); + expect(stm.state.folderUid).toBe(undefined); + + // Changed to a view with no URL state. + parseRouteParamsSpy.mockImplementation(() => ({})); + stm.initStateFromUrl('abc'); + + expect(stm.state.query).toBe(''); + expect(stm.state.sort).toBe(undefined); + expect(stm.state.folderUid).toBe('abc'); + }); }); }); diff --git a/public/app/features/search/state/SearchStateManager.ts b/public/app/features/search/state/SearchStateManager.ts index 22b45f93cb4..180aa23920f 100644 --- a/public/app/features/search/state/SearchStateManager.ts +++ b/public/app/features/search/state/SearchStateManager.ts @@ -49,6 +49,7 @@ export class SearchStateManager extends StateManagerBase { } stateManager.setState({ + ...initialState, ...stateFromUrl, folderUid: folderUid, eventTrackingNamespace: folderUid ? 'manage_dashboards' : 'dashboard_search', @@ -63,8 +64,10 @@ export class SearchStateManager extends StateManagerBase { * Updates internal and url state, then triggers a new search */ setStateAndDoSearch(state: Partial) { + const sort = state.sort || this.state.sort || localStorage.getItem(SEARCH_SELECTED_SORT) || undefined; + // Set internal state - this.setState(state); + this.setState({ sort, ...state }); // Update url state this.updateLocation({ @@ -290,14 +293,13 @@ export function getSearchStateManager() { if (!stateManager) { const selectedLayout = localStorage.getItem(SEARCH_SELECTED_LAYOUT) as SearchLayout; const layout = selectedLayout ?? initialState.layout; - const sort = localStorage.getItem(SEARCH_SELECTED_SORT) ?? undefined; let includePanels = store.getBool(SEARCH_PANELS_LOCAL_STORAGE_KEY, true); if (includePanels) { includePanels = false; } - stateManager = new SearchStateManager({ ...initialState, layout, sort, includePanels }); + stateManager = new SearchStateManager({ ...initialState, layout, includePanels }); } return stateManager;