Skip to content

Commit 7f9564e

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

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;
@@ -170,6 +177,44 @@ describe('filter_manager', () => {
170177
expect(fetchStub).toBeCalledTimes(0);
171178
expect(updateStub).toBeCalledTimes(1);
172179
});
180+
181+
test('set filter with no state, and force pin', async () => {
182+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
183+
f1.$state = undefined;
184+
185+
filterManager.setFilters([f1], true);
186+
expect(filterManager.getGlobalFilters()).toHaveLength(1);
187+
expect(filterManager.getAppFilters()).toHaveLength(0);
188+
});
189+
190+
test('set filter with no state, and no pin', async () => {
191+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
192+
f1.$state = undefined;
193+
194+
filterManager.setFilters([f1], false);
195+
expect(filterManager.getGlobalFilters()).toHaveLength(0);
196+
expect(filterManager.getAppFilters()).toHaveLength(1);
197+
});
198+
199+
test('set filters with default pin', async () => {
200+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
201+
f1.$state = undefined;
202+
setupMock.uiSettings.get.mockImplementationOnce(uiSettingsMock(true));
203+
204+
filterManager.setFilters([f1]);
205+
expect(filterManager.getGlobalFilters()).toHaveLength(1);
206+
expect(filterManager.getAppFilters()).toHaveLength(0);
207+
});
208+
209+
test('set filters without default pin', async () => {
210+
const f1 = getFilter(esFilters.FilterStateStore.GLOBAL_STATE, false, false, 'age', 38);
211+
f1.$state = undefined;
212+
213+
setupMock.uiSettings.get.mockImplementationOnce(uiSettingsMock(false));
214+
filterManager.setFilters([f1]);
215+
expect(filterManager.getGlobalFilters()).toHaveLength(0);
216+
expect(filterManager.getAppFilters()).toHaveLength(1);
217+
});
173218
});
174219

175220
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
@@ -121,7 +121,10 @@ export class FilterManager {
121121

122122
/* Setters */
123123

124-
public addFilters(filters: esFilters.Filter[] | esFilters.Filter, pinFilterStatus?: boolean) {
124+
public addFilters(
125+
filters: esFilters.Filter[] | esFilters.Filter,
126+
pinFilterStatus: boolean = this.uiSettings.get('filters:pinnedByDefault')
127+
) {
125128
if (!Array.isArray(filters)) {
126129
filters = [filters];
127130
}
@@ -130,12 +133,6 @@ export class FilterManager {
130133
return;
131134
}
132135

133-
if (pinFilterStatus === undefined) {
134-
pinFilterStatus = this.uiSettings.get('filters:pinnedByDefault');
135-
}
136-
137-
// Set the store of all filters. For now.
138-
// In the future, all filters should come in with filter state store already set.
139136
const store = pinFilterStatus
140137
? esFilters.FilterStateStore.GLOBAL_STATE
141138
: esFilters.FilterStateStore.APP_STATE;
@@ -154,7 +151,16 @@ export class FilterManager {
154151
this.handleStateUpdate(newFilters);
155152
}
156153

157-
public setFilters(newFilters: esFilters.Filter[]) {
154+
public setFilters(
155+
newFilters: esFilters.Filter[],
156+
pinFilterStatus: boolean = this.uiSettings.get('filters:pinnedByDefault')
157+
) {
158+
const store = pinFilterStatus
159+
? esFilters.FilterStateStore.GLOBAL_STATE
160+
: esFilters.FilterStateStore.APP_STATE;
161+
162+
FilterManager.setFiltersStore(newFilters, store);
163+
158164
const mappedFilters = mapAndFlattenFilters(newFilters);
159165
const newPartitionedFilters = FilterManager.partitionFilters(mappedFilters);
160166
const mergedFilters = this.mergeIncomingFilters(newPartitionedFilters);

0 commit comments

Comments
 (0)