Skip to content

Commit

Permalink
Retain pinned filters when loading and clearing saved queries (#54307) (
Browse files Browse the repository at this point in the history
#55473)

When we originally implemented Saved Queries we had them overwrite pinned filters on load and on clear. This caused the issue in #53258. If you have a saved query loaded in Discover for example and you navigate to a different app and then back to Discover, that saved query will get get reloaded since app state is retained when navigating back and forth between apps. If you created a pinned filter in between visits to Discover, it will get removed when the saved query is reloaded.

This issue made me reconsider our previous decision. I think pinned filters should not be affected by loading or clearing a saved query, since they are pinned they should only be removed if the user explicitly asks for it. This solves the reported issue and I also think it makes the UI more intuitive.
  • Loading branch information
Matt Bargar committed Jan 22, 2020
1 parent e883d22 commit baf0cae
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -480,18 +480,21 @@ export class DashboardAppController {
language:
localStorage.get('kibana.userQueryLanguage') || config.get('search:queryLanguage'),
},
[]
queryFilter.getGlobalFilters()
);
// Making this method sync broke the updates.
// Temporary fix, until we fix the complex state in this file.
setTimeout(queryFilter.removeAll, 0);
setTimeout(() => {
queryFilter.setFilters(queryFilter.getGlobalFilters());
}, 0);
};

const updateStateFromSavedQuery = (savedQuery: SavedQuery) => {
dashboardStateManager.applyFilters(
savedQuery.attributes.query,
savedQuery.attributes.filters || []
);
const savedQueryFilters = savedQuery.attributes.filters || [];
const globalFilters = queryFilter.getGlobalFilters();
const allFilters = [...globalFilters, ...savedQueryFilters];

dashboardStateManager.applyFilters(savedQuery.attributes.query, allFilters);
if (savedQuery.attributes.timefilter) {
timefilter.setTime({
from: savedQuery.attributes.timefilter.from,
Expand All @@ -504,7 +507,7 @@ export class DashboardAppController {
// Making this method sync broke the updates.
// Temporary fix, until we fix the complex state in this file.
setTimeout(() => {
queryFilter.setFilters(savedQuery.attributes.filters || []);
queryFilter.setFilters(allFilters);
}, 0);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1000,15 +1000,17 @@ function discoverController(
query: '',
language: localStorage.get('kibana.userQueryLanguage') || config.get('search:queryLanguage'),
};
filterManager.removeAll();
filterManager.setFilters(filterManager.getGlobalFilters());
$state.save();
$scope.fetch();
};

const updateStateFromSavedQuery = savedQuery => {
$state.query = savedQuery.attributes.query;
$state.save();
filterManager.setFilters(savedQuery.attributes.filters || []);
const savedQueryFilters = savedQuery.attributes.filters || [];
const globalFilters = filterManager.getGlobalFilters();
filterManager.setFilters([...globalFilters, ...savedQueryFilters]);

if (savedQuery.attributes.timefilter) {
timefilter.setTime({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ function VisualizeAppController(
language:
localStorage.get('kibana.userQueryLanguage') || uiSettings.get('search:queryLanguage'),
};
queryFilter.removeAll();
queryFilter.setFilters(queryFilter.getGlobalFilters());
$state.save();
$scope.fetch();
};
Expand All @@ -510,7 +510,9 @@ function VisualizeAppController(
$state.query = savedQuery.attributes.query;
$state.save();

queryFilter.setFilters(savedQuery.attributes.filters || []);
const savedQueryFilters = savedQuery.attributes.filters || [];
const globalFilters = queryFilter.getGlobalFilters();
queryFilter.setFilters([...globalFilters, ...savedQueryFilters]);

if (savedQuery.attributes.timefilter) {
timefilter.setTime({
Expand Down
22 changes: 18 additions & 4 deletions x-pack/legacy/plugins/lens/public/app_plugin/app.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ import { EditorFrameInstance } from '../types';
import { Storage } from '../../../../../../src/plugins/kibana_utils/public';
import { Document, SavedObjectStore } from '../persistence';
import { mount } from 'enzyme';
import { esFilters, IFieldType, IIndexPattern } from '../../../../../../src/plugins/data/public';
import {
esFilters,
FilterManager,
IFieldType,
IIndexPattern,
} from '../../../../../../src/plugins/data/public';
import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks';
const dataStartMock = dataPluginMock.createStartContract();

Expand Down Expand Up @@ -60,6 +65,10 @@ function createMockFilterManager() {
subscriber();
},
getFilters: () => filters,
getGlobalFilters: () => {
// @ts-ignore
return filters.filter(esFilters.isFilterPinned);
},
removeAll: () => {
filters = [];
subscriber();
Expand Down Expand Up @@ -821,7 +830,7 @@ describe('Lens App', () => {
);
});

it('clears all existing filters when the active saved query is cleared', () => {
it('clears all existing unpinned filters when the active saved query is cleared', () => {
const args = makeDefaultArgs();
args.editorFrame = frame;

Expand All @@ -834,8 +843,13 @@ describe('Lens App', () => {

const indexPattern = ({ id: 'index1' } as unknown) as IIndexPattern;
const field = ({ name: 'myfield' } as unknown) as IFieldType;
const pinnedField = ({ name: 'pinnedField' } as unknown) as IFieldType;

args.data.query.filterManager.setFilters([esFilters.buildExistsFilter(field, indexPattern)]);
const unpinned = esFilters.buildExistsFilter(field, indexPattern);
const pinned = esFilters.buildExistsFilter(pinnedField, indexPattern);
FilterManager.setFiltersStore([pinned], esFilters.FilterStateStore.GLOBAL_STATE);

args.data.query.filterManager.setFilters([pinned, unpinned]);
instance.update();

instance.find(TopNavMenu).prop('onClearSavedQuery')!();
Expand All @@ -844,7 +858,7 @@ describe('Lens App', () => {
expect(frame.mount).toHaveBeenLastCalledWith(
expect.any(Element),
expect.objectContaining({
filters: [],
filters: [pinned],
})
);
});
Expand Down
8 changes: 5 additions & 3 deletions x-pack/legacy/plugins/lens/public/app_plugin/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,9 @@ export function App({
setState(s => ({ ...s, savedQuery }));
}}
onSavedQueryUpdated={savedQuery => {
data.query.filterManager.setFilters(savedQuery.attributes.filters || state.filters);
const savedQueryFilters = savedQuery.attributes.filters || [];
const globalFilters = data.query.filterManager.getGlobalFilters();
data.query.filterManager.setFilters([...globalFilters, ...savedQueryFilters]);
setState(s => ({
...s,
savedQuery: { ...savedQuery }, // Shallow query for reference issues
Expand All @@ -252,11 +254,11 @@ export function App({
}));
}}
onClearSavedQuery={() => {
data.query.filterManager.removeAll();
data.query.filterManager.setFilters(data.query.filterManager.getGlobalFilters());
setState(s => ({
...s,
savedQuery: undefined,
filters: [],
filters: data.query.filterManager.getGlobalFilters(),
query: {
query: '',
language:
Expand Down
10 changes: 7 additions & 3 deletions x-pack/legacy/plugins/maps/public/angular/map_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ app.controller(
delete $scope.savedQuery;
delete $state.savedQuery;
onQueryChange({
filters: [],
filters: filterManager.getGlobalFilters(),
query: {
query: '',
language: localStorage.get('kibana.userQueryLanguage'),
Expand All @@ -162,6 +162,10 @@ app.controller(
};

function updateStateFromSavedQuery(savedQuery) {
const savedQueryFilters = savedQuery.attributes.filters || [];
const globalFilters = filterManager.getGlobalFilters();
const allFilters = [...savedQueryFilters, ...globalFilters];

if (savedQuery.attributes.timefilter) {
if (savedQuery.attributes.timefilter.refreshInterval) {
$scope.onRefreshChange({
Expand All @@ -170,13 +174,13 @@ app.controller(
});
}
onQueryChange({
filters: savedQuery.attributes.filters || [],
filters: allFilters,
query: savedQuery.attributes.query,
time: savedQuery.attributes.timefilter,
});
} else {
onQueryChange({
filters: savedQuery.attributes.filters || [],
filters: allFilters,
query: savedQuery.attributes.query,
});
}
Expand Down

0 comments on commit baf0cae

Please sign in to comment.