[Maps] Extract lazy load bundle from map embeddable factory (#68928)

* extract lazy load bundle from map embeddables

* tslint

* update imports, path changed

* use correct import paths
This commit is contained in:
Nathan Reese 2020-06-11 15:20:15 -06:00 committed by GitHub
parent 2d1312f6d1
commit e09c0c52a3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 109 additions and 79 deletions

View file

@ -12,15 +12,10 @@ import 'mapbox-gl/dist/mapbox-gl.css';
import { Subscription } from 'rxjs';
import { Unsubscribe } from 'redux';
import { EuiLoadingSpinner } from '@elastic/eui';
import {
Embeddable,
IContainer,
EmbeddableOutput,
} from '../../../../../src/plugins/embeddable/public';
import { Embeddable, IContainer } from '../../../../../src/plugins/embeddable/public';
import { APPLY_FILTER_TRIGGER } from '../../../../../src/plugins/ui_actions/public';
import {
esFilters,
IIndexPattern,
TimeRange,
Filter,
Query,
@ -57,13 +52,9 @@ import { RenderToolTipContent } from '../classes/tooltips/tooltip_property';
import { getUiActions, getCoreI18n } from '../kibana_services';
import { LayerDescriptor } from '../../common/descriptor_types';
import { MapEmbeddableInput, MapEmbeddableConfig } from './types';
import { MapEmbeddableConfig, MapEmbeddableInput, MapEmbeddableOutput } from './types';
export { MapEmbeddableInput, MapEmbeddableConfig };
export interface MapEmbeddableOutput extends EmbeddableOutput {
indexPatterns: IIndexPattern[];
}
const GisMap = lazy(() => import('../connected_components/gis_map'));
export class MapEmbeddable extends Embeddable<MapEmbeddableInput, MapEmbeddableOutput> {
type = MAP_SAVED_OBJECT_TYPE;

View file

@ -6,71 +6,16 @@
import _ from 'lodash';
import { i18n } from '@kbn/i18n';
import { AnyAction } from 'redux';
import { IIndexPattern } from 'src/plugins/data/public';
import {
Embeddable,
EmbeddableFactoryDefinition,
IContainer,
} from '../../../../../src/plugins/embeddable/public';
import '../index.scss';
import { createMapPath, MAP_SAVED_OBJECT_TYPE, APP_ICON } from '../../common/constants';
import { LayerDescriptor } from '../../common/descriptor_types';
import { MapStore, MapStoreState } from '../reducers/store';
import { MapEmbeddableConfig, MapEmbeddableInput } from './types';
import { MapEmbeddableOutput } from './map_embeddable';
import { RenderToolTipContent } from '../classes/tooltips/tooltip_property';
import { EventHandlers } from '../reducers/non_serializable_instances';
let whenModulesLoadedPromise: Promise<boolean>;
let getMapsSavedObjectLoader: any;
let MapEmbeddable: new (
config: MapEmbeddableConfig,
initialInput: MapEmbeddableInput,
parent?: IContainer,
renderTooltipContent?: RenderToolTipContent,
eventHandlers?: EventHandlers
) => Embeddable<MapEmbeddableInput, MapEmbeddableOutput>;
let getIndexPatternService: () => {
get: (id: string) => IIndexPattern | undefined;
};
let getHttp: () => any;
let getMapsCapabilities: () => any;
let createMapStore: () => MapStore;
let addLayerWithoutDataSync: (layerDescriptor: LayerDescriptor) => AnyAction;
let getQueryableUniqueIndexPatternIds: (state: MapStoreState) => string[];
let getInitialLayers: (
layerListJSON?: string,
initialLayers?: LayerDescriptor[]
) => LayerDescriptor[];
let mergeInputWithSavedMap: any;
async function waitForMapDependencies(): Promise<boolean> {
if (typeof whenModulesLoadedPromise !== 'undefined') {
return whenModulesLoadedPromise;
}
whenModulesLoadedPromise = new Promise(async (resolve) => {
({
// @ts-ignore
getMapsSavedObjectLoader,
getQueryableUniqueIndexPatternIds,
MapEmbeddable,
getIndexPatternService,
getHttp,
getMapsCapabilities,
createMapStore,
addLayerWithoutDataSync,
getInitialLayers,
mergeInputWithSavedMap,
} = await import('./lazy'));
resolve(true);
});
return whenModulesLoadedPromise;
}
import { MapEmbeddableInput } from './types';
import { lazyLoadMapModules } from '../lazy_load_bundle';
export class MapEmbeddableFactory implements EmbeddableFactoryDefinition {
type = MAP_SAVED_OBJECT_TYPE;
@ -83,7 +28,7 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition {
};
async isEditable() {
await waitForMapDependencies();
const { getMapsCapabilities } = await lazyLoadMapModules();
return getMapsCapabilities().save as boolean;
}
@ -100,6 +45,12 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition {
async _getIndexPatterns(layerList: LayerDescriptor[]): Promise<IIndexPattern[]> {
// Need to extract layerList from store to get queryable index pattern ids
const {
addLayerWithoutDataSync,
createMapStore,
getIndexPatternService,
getQueryableUniqueIndexPatternIds,
} = await lazyLoadMapModules();
const store = createMapStore();
let queryableIndexPatternIds: string[];
try {
@ -130,6 +81,7 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition {
}
async _fetchSavedMap(savedObjectId: string) {
const { getMapsSavedObjectLoader } = await lazyLoadMapModules();
const savedObjectLoader = getMapsSavedObjectLoader();
return await savedObjectLoader.get(savedObjectId);
}
@ -139,7 +91,12 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition {
input: MapEmbeddableInput,
parent?: IContainer
) => {
await waitForMapDependencies();
const {
getInitialLayers,
getHttp,
MapEmbeddable,
mergeInputWithSavedMap,
} = await lazyLoadMapModules();
const savedMap = await this._fetchSavedMap(savedObjectId);
const layerList = getInitialLayers(savedMap.layerListJSON);
const indexPatterns = await this._getIndexPatterns(layerList);
@ -179,7 +136,7 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition {
};
create = async (input: MapEmbeddableInput, parent?: IContainer) => {
await waitForMapDependencies();
const { getInitialLayers, MapEmbeddable } = await lazyLoadMapModules();
const layerList = getInitialLayers();
const indexPatterns = await this._getIndexPatterns(layerList);

View file

@ -6,8 +6,11 @@
import { IIndexPattern } from '../../../../../src/plugins/data/common/index_patterns';
import { MapSettings } from '../reducers/map';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
import { EmbeddableInput } from '../../../../../src/plugins/embeddable/public/lib/embeddables';
import {
EmbeddableInput,
EmbeddableOutput,
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
} from '../../../../../src/plugins/embeddable/public/lib/embeddables';
import { Filter, Query, RefreshInterval, TimeRange } from '../../../../../src/plugins/data/common';
import { LayerDescriptor, MapCenterAndZoom } from '../../common/descriptor_types';
@ -36,3 +39,7 @@ export interface MapEmbeddableInput extends EmbeddableInput {
hiddenLayers?: string[];
hideFilterActions?: boolean;
}
export interface MapEmbeddableOutput extends EmbeddableOutput {
indexPatterns: IIndexPattern[];
}

View file

@ -3,7 +3,9 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { IIndexPattern, DataPublicPluginStart } from 'src/plugins/data/public';
import { DataPublicPluginStart } from 'src/plugins/data/public';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
import { IndexPatternsService } from 'src/plugins/data/public/index_patterns';
import { MapsConfigType } from '../config';
import { MapsLegacyConfigType } from '../../../../src/plugins/maps_legacy/public';
@ -14,9 +16,7 @@ export function getIndexPatternSelectComponent(): any;
export function getHttp(): any;
export function getTimeFilter(): any;
export function getToasts(): any;
export function getIndexPatternService(): {
get: (id: string) => IIndexPattern | undefined;
};
export function getIndexPatternService(): IndexPatternsService;
export function getAutocompleteService(): any;
export function getSavedObjectsClient(): any;
export function getMapsCapabilities(): any;

View file

@ -0,0 +1,75 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { AnyAction } from 'redux';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
import { IndexPatternsService } from 'src/plugins/data/public/index_patterns';
import { Embeddable, IContainer } from '../../../../../src/plugins/embeddable/public';
import { LayerDescriptor } from '../../common/descriptor_types';
import { MapStore, MapStoreState } from '../reducers/store';
import { EventHandlers } from '../reducers/non_serializable_instances';
import { RenderToolTipContent } from '../classes/tooltips/tooltip_property';
import { MapEmbeddableConfig, MapEmbeddableInput, MapEmbeddableOutput } from '../embeddable/types';
let loadModulesPromise: Promise<LazyLoadedMapModules>;
interface LazyLoadedMapModules {
getMapsSavedObjectLoader: any;
MapEmbeddable: new (
config: MapEmbeddableConfig,
initialInput: MapEmbeddableInput,
parent?: IContainer,
renderTooltipContent?: RenderToolTipContent,
eventHandlers?: EventHandlers
) => Embeddable<MapEmbeddableInput, MapEmbeddableOutput>;
getIndexPatternService: () => IndexPatternsService;
getHttp: () => any;
getMapsCapabilities: () => any;
createMapStore: () => MapStore;
addLayerWithoutDataSync: (layerDescriptor: LayerDescriptor) => AnyAction;
getQueryableUniqueIndexPatternIds: (state: MapStoreState) => string[];
getInitialLayers: (
layerListJSON?: string,
initialLayers?: LayerDescriptor[]
) => LayerDescriptor[];
mergeInputWithSavedMap: any;
}
export async function lazyLoadMapModules(): Promise<LazyLoadedMapModules> {
if (typeof loadModulesPromise !== 'undefined') {
return loadModulesPromise;
}
loadModulesPromise = new Promise(async (resolve) => {
const {
// @ts-ignore
getMapsSavedObjectLoader,
getQueryableUniqueIndexPatternIds,
MapEmbeddable,
getIndexPatternService,
getHttp,
getMapsCapabilities,
createMapStore,
addLayerWithoutDataSync,
getInitialLayers,
mergeInputWithSavedMap,
} = await import('./lazy');
resolve({
getMapsSavedObjectLoader,
getQueryableUniqueIndexPatternIds,
MapEmbeddable,
getIndexPatternService,
getHttp,
getMapsCapabilities,
createMapStore,
addLayerWithoutDataSync,
getInitialLayers,
mergeInputWithSavedMap,
});
});
return loadModulesPromise;
}

View file

@ -9,10 +9,10 @@
// @ts-ignore
export * from '../../angular/services/gis_map_saved_object_loader';
export * from '../map_embeddable';
export * from '../../embeddable/map_embeddable';
export * from '../../kibana_services';
export * from '../../reducers/store';
export * from '../../actions';
export * from '../../selectors/map_selectors';
export * from '../../angular/get_initial_layers';
export * from './../merge_input_with_saved_map';
export * from '../../embeddable/merge_input_with_saved_map';