Skip to content

Commit 040dcdf

Browse files
committed
better filter comparision in state syncing utils
1 parent ba10b9d commit 040dcdf

File tree

2 files changed

+114
-4
lines changed

2 files changed

+114
-4
lines changed

src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,97 @@ describe('connect_to_app_state', () => {
463463
});
464464
});
465465
});
466+
467+
describe('filters with different state', () => {
468+
let queryServiceStart: QueryStart;
469+
let filterManager: FilterManager;
470+
let state: BaseStateContainer<QueryState>;
471+
let stateSub: Subscription;
472+
let stateChangeTriggered = jest.fn();
473+
let filterManagerChangeSub: Subscription;
474+
let filterManagerChangeTriggered = jest.fn();
475+
476+
let filter: Filter;
477+
478+
beforeEach(() => {
479+
const queryService = new QueryService();
480+
queryService.setup({
481+
uiSettings: setupMock.uiSettings,
482+
storage: new Storage(new StubBrowserStorage()),
483+
});
484+
queryServiceStart = queryService.start(startMock.savedObjects);
485+
filterManager = queryServiceStart.filterManager;
486+
487+
state = createStateContainer({});
488+
stateChangeTriggered = jest.fn();
489+
stateSub = state.state$.subscribe(stateChangeTriggered);
490+
491+
filterManagerChangeTriggered = jest.fn();
492+
filterManagerChangeSub = filterManager.getUpdates$().subscribe(filterManagerChangeTriggered);
493+
494+
filter = getFilter(FilterStateStore.GLOBAL_STATE, true, true, 'key1', 'value1');
495+
});
496+
497+
// applies filter state changes, changes only internal $state.store value
498+
function runChanges() {
499+
filter = { ...filter, $state: { store: FilterStateStore.GLOBAL_STATE } };
500+
501+
state.set({
502+
filters: [filter],
503+
});
504+
505+
filter = { ...filter, $state: { store: FilterStateStore.APP_STATE } };
506+
507+
state.set({
508+
filters: [filter],
509+
});
510+
511+
filter = { ...filter };
512+
delete filter.$state;
513+
514+
state.set({
515+
filters: [filter],
516+
});
517+
}
518+
519+
test('when syncing all filters, changes to filter.state$ should be taken into account', () => {
520+
const stop = connectToQueryState(queryServiceStart, state, {
521+
filters: true,
522+
});
523+
524+
runChanges();
525+
526+
expect(filterManagerChangeTriggered).toBeCalledTimes(3);
527+
528+
stop();
529+
});
530+
531+
test('when syncing app state filters, changes to filter.state$ should be ignored', () => {
532+
const stop = connectToQueryState(queryServiceStart, state, {
533+
filters: FilterStateStore.APP_STATE,
534+
});
535+
536+
runChanges();
537+
538+
expect(filterManagerChangeTriggered).toBeCalledTimes(1);
539+
540+
stop();
541+
});
542+
543+
test('when syncing global state filters, changes to filter.state$ should be ignored', () => {
544+
const stop = connectToQueryState(queryServiceStart, state, {
545+
filters: FilterStateStore.GLOBAL_STATE,
546+
});
547+
548+
runChanges();
549+
550+
expect(filterManagerChangeTriggered).toBeCalledTimes(1);
551+
552+
stop();
553+
});
554+
555+
afterEach(() => {
556+
stateSub.unsubscribe();
557+
filterManagerChangeSub.unsubscribe();
558+
});
559+
});

src/plugins/data/public/query/state_sync/connect_to_query_state.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,21 @@ export const connectToQueryState = <S extends QueryState>(
9191
} else if (syncConfig.filters === FilterStateStore.GLOBAL_STATE) {
9292
if (
9393
!initialState.filters ||
94-
!compareFilters(initialState.filters, filterManager.getGlobalFilters(), COMPARE_ALL_OPTIONS)
94+
!compareFilters(initialState.filters, filterManager.getGlobalFilters(), {
95+
...COMPARE_ALL_OPTIONS,
96+
state: false,
97+
})
9598
) {
9699
initialState.filters = filterManager.getGlobalFilters();
97100
initialDirty = true;
98101
}
99102
} else if (syncConfig.filters === FilterStateStore.APP_STATE) {
100103
if (
101104
!initialState.filters ||
102-
!compareFilters(initialState.filters, filterManager.getAppFilters(), COMPARE_ALL_OPTIONS)
105+
!compareFilters(initialState.filters, filterManager.getAppFilters(), {
106+
...COMPARE_ALL_OPTIONS,
107+
state: false,
108+
})
103109
) {
104110
initialState.filters = filterManager.getAppFilters();
105111
initialDirty = true;
@@ -173,11 +179,21 @@ export const connectToQueryState = <S extends QueryState>(
173179
filterManager.setFilters(_.cloneDeep(filters));
174180
}
175181
} else if (syncConfig.filters === FilterStateStore.APP_STATE) {
176-
if (!compareFilters(filters, filterManager.getAppFilters(), COMPARE_ALL_OPTIONS)) {
182+
if (
183+
!compareFilters(filters, filterManager.getAppFilters(), {
184+
...COMPARE_ALL_OPTIONS,
185+
state: false,
186+
})
187+
) {
177188
filterManager.setAppFilters(_.cloneDeep(filters));
178189
}
179190
} else if (syncConfig.filters === FilterStateStore.GLOBAL_STATE) {
180-
if (!compareFilters(filters, filterManager.getGlobalFilters(), COMPARE_ALL_OPTIONS)) {
191+
if (
192+
!compareFilters(filters, filterManager.getGlobalFilters(), {
193+
...COMPARE_ALL_OPTIONS,
194+
state: false,
195+
})
196+
) {
181197
filterManager.setGlobalFilters(_.cloneDeep(filters));
182198
}
183199
}

0 commit comments

Comments
 (0)