From f99d93d506a9d617509ab5a6bfd9c305ce124879 Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Fri, 26 Mar 2021 09:11:47 -0400 Subject: [PATCH] [Maps] Remove invisible layers from querybar (#94943) --- .../public/selectors/map_selectors.test.ts | 90 ++++++++++++++++++- .../maps/public/selectors/map_selectors.ts | 18 ++-- 2 files changed, 93 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.test.ts b/x-pack/plugins/maps/public/selectors/map_selectors.test.ts index 58268b6ea9d8..a7374650d045 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.test.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.test.ts @@ -5,7 +5,8 @@ * 2.0. */ -jest.mock('../classes/layers/vector_layer', () => {}); +import { LAYER_STYLE_TYPE, LAYER_TYPE, SOURCE_TYPES } from '../../common'; + jest.mock('../classes/layers/tiled_vector_layer/tiled_vector_layer', () => {}); jest.mock('../classes/layers/blended_vector_layer/blended_vector_layer', () => {}); jest.mock('../classes/layers/heatmap_layer', () => {}); @@ -23,13 +24,23 @@ jest.mock('../kibana_services', () => ({ getMapsCapabilities() { return { save: true }; }, + getIsDarkMode() { + return false; + }, })); import { DEFAULT_MAP_STORE_STATE } from '../reducers/store'; -import { areLayersLoaded, getDataFilters, getTimeFilters } from './map_selectors'; -import { LayerDescriptor } from '../../common/descriptor_types'; +import { + areLayersLoaded, + getDataFilters, + getTimeFilters, + getQueryableUniqueIndexPatternIds, +} from './map_selectors'; + +import { LayerDescriptor, VectorLayerDescriptor } from '../../common/descriptor_types'; import { ILayer } from '../classes/layers/layer'; import { Filter } from '../../../../../src/plugins/data/public'; +import { ESSearchSource } from '../classes/sources/es_search_source'; describe('getDataFilters', () => { const mapExtent = { @@ -193,3 +204,76 @@ describe('areLayersLoaded', () => { expect(areLayersLoaded.resultFunc(layerList, waitingForMapReadyLayerList, zoom)).toBe(true); }); }); + +describe('getQueryableUniqueIndexPatternIds', () => { + function createLayerMock({ + isVisible = true, + indexPatterns = [], + }: { + isVisible?: boolean; + indexPatterns?: string[]; + }) { + return ({ + isVisible: () => { + return isVisible; + }, + getQueryableIndexPatternIds: () => { + return indexPatterns; + }, + } as unknown) as ILayer; + } + + function createWaitLayerDescriptorMock({ + indexPatternId, + visible = true, + }: { + visible?: boolean; + indexPatternId: string; + }) { + return { + type: LAYER_TYPE.VECTOR, + style: { + type: LAYER_STYLE_TYPE.VECTOR, + }, + visible, + sourceDescriptor: ESSearchSource.createDescriptor({ + type: SOURCE_TYPES.ES_SEARCH, + indexPatternId, + geoField: 'field', + }), + }; + } + + test('should only include visible', () => { + const layerList: ILayer[] = [ + createLayerMock({}), + createLayerMock({ indexPatterns: ['foo'] }), + createLayerMock({ indexPatterns: ['bar'] }), + createLayerMock({ indexPatterns: ['foobar'], isVisible: false }), + createLayerMock({ indexPatterns: ['bar'] }), + ]; + const waitingForMapReadyLayerList: VectorLayerDescriptor[] = ([] as unknown) as VectorLayerDescriptor[]; + expect( + getQueryableUniqueIndexPatternIds.resultFunc(layerList, waitingForMapReadyLayerList) + ).toEqual(['foo', 'bar']); + }); + + test('should only include visible and waitlist should take precedence', () => { + const layerList: ILayer[] = [ + createLayerMock({}), + createLayerMock({ indexPatterns: ['foo'] }), + createLayerMock({ indexPatterns: ['bar'] }), + createLayerMock({ indexPatterns: ['foobar'], isVisible: false }), + createLayerMock({ indexPatterns: ['bar'] }), + ]; + const waitingForMapReadyLayerList: VectorLayerDescriptor[] = ([ + createWaitLayerDescriptorMock({ indexPatternId: 'foo' }), + createWaitLayerDescriptorMock({ indexPatternId: 'barfoo', visible: false }), + createWaitLayerDescriptorMock({ indexPatternId: 'fbr' }), + createWaitLayerDescriptorMock({ indexPatternId: 'foo' }), + ] as unknown) as VectorLayerDescriptor[]; + expect( + getQueryableUniqueIndexPatternIds.resultFunc(layerList, waitingForMapReadyLayerList) + ).toEqual(['foo', 'fbr']); + }); +}); diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.ts b/x-pack/plugins/maps/public/selectors/map_selectors.ts index 2f87aa7d1139..a818cdd2d00f 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.ts @@ -377,16 +377,6 @@ export const getSelectedLayerJoinDescriptors = createSelector(getSelectedLayer, }); }); -// Get list of unique index patterns used by all layers -export const getUniqueIndexPatternIds = createSelector(getLayerList, (layerList) => { - const indexPatternIds: string[] = []; - layerList.forEach((layer) => { - indexPatternIds.push(...layer.getIndexPatternIds()); - }); - return _.uniq(indexPatternIds).sort(); -}); - -// Get list of unique index patterns, excluding index patterns from layers that disable applyGlobalQuery export const getQueryableUniqueIndexPatternIds = createSelector( getLayerList, getWaitingForMapReadyLayerListRaw, @@ -396,11 +386,15 @@ export const getQueryableUniqueIndexPatternIds = createSelector( if (waitingForMapReadyLayerList.length) { waitingForMapReadyLayerList.forEach((layerDescriptor) => { const layer = createLayerInstance(layerDescriptor); - indexPatternIds.push(...layer.getQueryableIndexPatternIds()); + if (layer.isVisible()) { + indexPatternIds.push(...layer.getQueryableIndexPatternIds()); + } }); } else { layerList.forEach((layer) => { - indexPatternIds.push(...layer.getQueryableIndexPatternIds()); + if (layer.isVisible()) { + indexPatternIds.push(...layer.getQueryableIndexPatternIds()); + } }); } return _.uniq(indexPatternIds);