Skip to content

Commit 6942f3e

Browse files
authored
Fix setting filters without $store value (#56304)
Follow up on: #56213 AddFilters method had logic which ensured that $store exists in filter object, but setFilters was missing that.
1 parent 08f4b55 commit 6942f3e

File tree

2 files changed

+62
-11
lines changed

2 files changed

+62
-11
lines changed

src/plugins/data/public/query/filter_manager/filter_manager.test.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,16 @@ import { esFilters } from '../../../common';
2929
import { coreMock } from '../../../../../core/public/mocks';
3030
const setupMock = coreMock.createSetup();
3131

32-
setupMock.uiSettings.get.mockImplementation((key: string) => {
33-
return true;
34-
});
32+
const uiSettingsMock = (pinnedByDefault: boolean) => (key: string) => {
33+
switch (key) {
34+
case 'filters:pinnedByDefault':
35+
return pinnedByDefault;
36+
default:
37+
throw new Error(`Unexpected uiSettings key in FilterManager mock: ${key}`);
38+
}
39+
};
40+
41+
setupMock.uiSettings.get.mockImplementation(uiSettingsMock(true));
3542

3643
describe('filter_manager', () => {
3744
let updateSubscription: Subscription | undefined;
@@ -224,6 +231,44 @@ describe('filter_manager', () => {
224231
expect(newGlobalFilters).toHaveLength(2);
225232
expect(newAppFilters).toHaveLength(1);
226233
});
234+
235+
test('set filter with no state, and force pin', async () => {
236+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
237+
f1.$state = undefined;
238+
239+
filterManager.setFilters([f1], true);
240+
expect(filterManager.getGlobalFilters()).toHaveLength(1);
241+
expect(filterManager.getAppFilters()).toHaveLength(0);
242+
});
243+
244+
test('set filter with no state, and no pin', async () => {
245+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
246+
f1.$state = undefined;
247+
248+
filterManager.setFilters([f1], false);
249+
expect(filterManager.getGlobalFilters()).toHaveLength(0);
250+
expect(filterManager.getAppFilters()).toHaveLength(1);
251+
});
252+
253+
test('set filters with default pin', async () => {
254+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
255+
f1.$state = undefined;
256+
setupMock.uiSettings.get.mockImplementationOnce(uiSettingsMock(true));
257+
258+
filterManager.setFilters([f1]);
259+
expect(filterManager.getGlobalFilters()).toHaveLength(1);
260+
expect(filterManager.getAppFilters()).toHaveLength(0);
261+
});
262+
263+
test('set filters without default pin', async () => {
264+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
265+
f1.$state = undefined;
266+
267+
setupMock.uiSettings.get.mockImplementationOnce(uiSettingsMock(false));
268+
filterManager.setFilters([f1]);
269+
expect(filterManager.getGlobalFilters()).toHaveLength(0);
270+
expect(filterManager.getAppFilters()).toHaveLength(1);
271+
});
227272
});
228273

229274
describe('add filters', () => {

src/plugins/data/public/query/filter_manager/filter_manager.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ export class FilterManager {
124124

125125
/* Setters */
126126

127-
public addFilters(filters: esFilters.Filter[] | esFilters.Filter, pinFilterStatus?: boolean) {
127+
public addFilters(
128+
filters: esFilters.Filter[] | esFilters.Filter,
129+
pinFilterStatus: boolean = this.uiSettings.get('filters:pinnedByDefault')
130+
) {
128131
if (!Array.isArray(filters)) {
129132
filters = [filters];
130133
}
@@ -133,12 +136,6 @@ export class FilterManager {
133136
return;
134137
}
135138

136-
if (pinFilterStatus === undefined) {
137-
pinFilterStatus = this.uiSettings.get('filters:pinnedByDefault');
138-
}
139-
140-
// Set the store of all filters. For now.
141-
// In the future, all filters should come in with filter state store already set.
142139
const store = pinFilterStatus
143140
? esFilters.FilterStateStore.GLOBAL_STATE
144141
: esFilters.FilterStateStore.APP_STATE;
@@ -157,7 +154,16 @@ export class FilterManager {
157154
this.handleStateUpdate(newFilters);
158155
}
159156

160-
public setFilters(newFilters: esFilters.Filter[]) {
157+
public setFilters(
158+
newFilters: esFilters.Filter[],
159+
pinFilterStatus: boolean = this.uiSettings.get('filters:pinnedByDefault')
160+
) {
161+
const store = pinFilterStatus
162+
? esFilters.FilterStateStore.GLOBAL_STATE
163+
: esFilters.FilterStateStore.APP_STATE;
164+
165+
FilterManager.setFiltersStore(newFilters, store);
166+
161167
const mappedFilters = mapAndFlattenFilters(newFilters);
162168
const newPartitionedFilters = FilterManager.partitionFilters(mappedFilters);
163169
const mergedFilters = this.mergeIncomingFilters(newPartitionedFilters);

0 commit comments

Comments
 (0)