[Maps] update LayerWizard previewLayer to take layerDescriptor instead of ISource (#64461)

* more changes

* remove unused state argument

* revert change to make diff easier to follow

* migrate pew pew source to new previewLayer

* remove createDefaultLayer from ISource

* migrate EMS boundaries layer wizard

* convert ems tms layer wizard to previewLayer

* convert kibana base map to preview layer

* convert all other sources to previewLayer

* tslint clean-up

* remaining ts lint errors

* i18n clean up

* review feedback

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
Nathan Reese 2020-04-27 08:50:47 -06:00 committed by GitHub
parent dfb6a308cf
commit 399df75821
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 727 additions and 910 deletions

View file

@ -5,27 +5,18 @@
*/
import _ from 'lodash';
// Import each layer type, even those not used, to init in registry
import '../layers/sources/wms_source';
import '../layers/sources/ems_file_source';
import '../layers/sources/es_search_source';
import '../layers/sources/es_pew_pew_source/es_pew_pew_source';
import '../layers/sources/es_pew_pew_source';
import '../layers/sources/kibana_regionmap_source';
import '../layers/sources/es_geo_grid_source';
import '../layers/sources/xyz_tms_source';
import { KibanaTilemapSource } from '../layers/sources/kibana_tilemap_source';
import { TileLayer } from '../layers/tile_layer';
import { EMSTMSSource } from '../layers/sources/ems_tms_source';
import { VectorTileLayer } from '../layers/vector_tile_layer';
import { getInjectedVarFunc } from '../kibana_services';
import { getKibanaTileMap } from '../meta';
export function getInitialLayers(layerListJSON, initialLayers = []) {
@ -35,18 +26,18 @@ export function getInitialLayers(layerListJSON, initialLayers = []) {
const tilemapSourceFromKibana = getKibanaTileMap();
if (_.get(tilemapSourceFromKibana, 'url')) {
const sourceDescriptor = KibanaTilemapSource.createDescriptor();
const source = new KibanaTilemapSource(sourceDescriptor);
const layer = source.createDefaultLayer();
return [layer.toLayerDescriptor(), ...initialLayers];
const layerDescriptor = TileLayer.createDescriptor({
sourceDescriptor: KibanaTilemapSource.createDescriptor(),
});
return [layerDescriptor, ...initialLayers];
}
const isEmsEnabled = getInjectedVarFunc()('isEmsEnabled', true);
if (isEmsEnabled) {
const descriptor = EMSTMSSource.createDescriptor({ isAutoSelect: true });
const source = new EMSTMSSource(descriptor);
const layer = source.createDefaultLayer();
return [layer.toLayerDescriptor(), ...initialLayers];
const layerDescriptor = VectorTileLayer.createDescriptor({
sourceDescriptor: EMSTMSSource.createDescriptor({ isAutoSelect: true }),
});
return [layerDescriptor, ...initialLayers];
}
return initialLayers;

View file

@ -4,51 +4,36 @@
* you may not use this file except in compliance with the Elastic License.
*/
import React, { Fragment } from 'react';
import { EuiSpacer, EuiPanel, EuiButtonEmpty } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import React from 'react';
import { EuiPanel } from '@elastic/eui';
import { uploadLayerWizardConfig } from '../../../layers/sources/client_file_source';
export const ImportEditor = ({ clearSource, isIndexingTriggered, ...props }) => {
const editorProperties = getEditorProperties({ isIndexingTriggered, ...props });
export const ImportEditor = props => {
const editorProperties = getEditorProperties(props);
return (
<Fragment>
{isIndexingTriggered ? null : (
<Fragment>
<EuiButtonEmpty size="xs" flush="left" onClick={clearSource} iconType="arrowLeft">
<FormattedMessage
id="xpack.maps.addLayerPanel.changeDataSourceButtonLabel"
defaultMessage="Change data source"
/>
</EuiButtonEmpty>
<EuiSpacer size="s" />
</Fragment>
)}
<EuiPanel style={{ position: 'relative' }}>
{uploadLayerWizardConfig.renderWizard(editorProperties)}
</EuiPanel>
</Fragment>
<EuiPanel style={{ position: 'relative' }}>
{uploadLayerWizardConfig.renderWizard(editorProperties)}
</EuiPanel>
);
};
function getEditorProperties({
inspectorAdapters,
previewLayer,
mapColors,
onRemove,
viewLayer,
isIndexingTriggered,
onIndexReady,
importSuccessHandler,
importErrorHandler,
}) {
return {
onPreviewSource: viewLayer,
inspectorAdapters,
previewLayer,
mapColors,
onRemove,
importSuccessHandler,
importErrorHandler,
isIndexingTriggered,
addAndViewSource: viewLayer,
onIndexReady,
};
}

View file

@ -34,12 +34,12 @@ function mapStateToProps(state = {}) {
function mapDispatchToProps(dispatch) {
return {
viewLayer: async layer => {
previewLayer: async layerDescriptor => {
await dispatch(setSelectedLayer(null));
await dispatch(removeTransientLayer());
dispatch(addLayer(layer.toLayerDescriptor()));
dispatch(setSelectedLayer(layer.getId()));
dispatch(setTransientLayer(layer.getId()));
dispatch(addLayer(layerDescriptor));
dispatch(setSelectedLayer(layerDescriptor.id));
dispatch(setTransientLayer(layerDescriptor.id));
},
removeTransientLayer: () => {
dispatch(setSelectedLayer(null));

View file

@ -1,19 +0,0 @@
/*
* 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 { connect } from 'react-redux';
import { SourceEditor } from './view';
import { getInspectorAdapters } from '../../../reducers/non_serializable_instances';
function mapStateToProps(state = {}) {
return {
inspectorAdapters: getInspectorAdapters(state),
};
}
const connectedFlyOut = connect(mapStateToProps)(SourceEditor);
export { connectedFlyOut as SourceEditor };

View file

@ -1,40 +0,0 @@
/*
* 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 React, { Fragment } from 'react';
import { EuiSpacer, EuiPanel, EuiButtonEmpty } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
export const SourceEditor = ({
clearSource,
layerWizard,
isIndexingTriggered,
inspectorAdapters,
previewLayer,
}) => {
if (!layerWizard) {
return null;
}
return (
<Fragment>
{isIndexingTriggered ? null : (
<Fragment>
<EuiButtonEmpty size="xs" flush="left" onClick={clearSource} iconType="arrowLeft">
<FormattedMessage
id="xpack.maps.addLayerPanel.changeDataSourceButtonLabel"
defaultMessage="Change data source"
/>
</EuiButtonEmpty>
<EuiSpacer size="s" />
</Fragment>
)}
<EuiPanel>
{layerWizard.renderWizard({ onPreviewSource: previewLayer, inspectorAdapters })}
</EuiPanel>
</Fragment>
);
};

View file

@ -7,8 +7,7 @@
import React, { Fragment } from 'react';
import { getLayerWizards } from '../../../layers/layer_wizard_registry';
import { EuiTitle, EuiSpacer, EuiCard, EuiIcon } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiSpacer, EuiCard, EuiIcon } from '@elastic/eui';
import _ from 'lodash';
export function SourceSelect({ updateSourceSelection }) {
@ -38,17 +37,5 @@ export function SourceSelect({ updateSourceSelection }) {
);
});
return (
<Fragment>
<EuiTitle size="xs">
<h2>
<FormattedMessage
id="xpack.maps.addLayerPanel.chooseDataSourceTitle"
defaultMessage="Choose data source"
/>
</h2>
</EuiTitle>
{sourceCards}
</Fragment>
);
return <Fragment>{sourceCards}</Fragment>;
}

View file

@ -4,18 +4,19 @@
* you may not use this file except in compliance with the Elastic License.
*/
import React, { Component } from 'react';
import React, { Component, Fragment } from 'react';
import { SourceSelect } from './source_select/source_select';
import { FlyoutFooter } from './flyout_footer';
import { SourceEditor } from './source_editor';
import { ImportEditor } from './import_editor';
import { EuiFlexGroup, EuiTitle, EuiFlyoutHeader } from '@elastic/eui';
import { EuiButtonEmpty, EuiPanel, EuiTitle, EuiFlyoutHeader, EuiSpacer } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
export class AddLayerPanel extends Component {
state = {
layerWizard: null,
layer: null,
layerDescriptor: null, // TODO get this from redux store instead of storing locally
isIndexingSource: false,
importView: false,
layerImportAddReady: false,
};
@ -35,13 +36,9 @@ export class AddLayerPanel extends Component {
}
_getPanelDescription() {
const { layerWizard, importView, layerImportAddReady } = this.state;
const { importView, layerImportAddReady } = this.state;
let panelDescription;
if (!layerWizard) {
panelDescription = i18n.translate('xpack.maps.addLayerPanel.selectSource', {
defaultMessage: 'Select source',
});
} else if (layerImportAddReady || !importView) {
if (layerImportAddReady || !importView) {
panelDescription = i18n.translate('xpack.maps.addLayerPanel.addLayer', {
defaultMessage: 'Add layer',
});
@ -53,29 +50,21 @@ export class AddLayerPanel extends Component {
return panelDescription;
}
_viewLayer = async (source, options = {}) => {
_previewLayer = async (layerDescriptor, isIndexingSource) => {
if (!this._isMounted) {
return;
}
if (!source) {
this.setState({ layer: null });
if (!layerDescriptor) {
this.setState({
layerDescriptor: null,
isIndexingSource: false,
});
this.props.removeTransientLayer();
return;
}
const styleDescriptor =
this.state.layer && this.state.layer.getCurrentStyle()
? this.state.layer.getCurrentStyle().getDescriptor()
: null;
const layerInitProps = {
...options,
style: styleDescriptor,
};
const newLayer = source.createDefaultLayer(layerInitProps, this.props.mapColors);
if (!this._isMounted) {
return;
}
this.setState({ layer: newLayer }, () => this.props.viewLayer(this.state.layer));
this.setState({ layerDescriptor, isIndexingSource });
this.props.previewLayer(layerDescriptor);
};
_clearLayerData = ({ keepSourceType = false }) => {
@ -84,7 +73,8 @@ export class AddLayerPanel extends Component {
}
this.setState({
layer: null,
layerDescriptor: null,
isIndexingSource: false,
...(!keepSourceType ? { layerWizard: null, importView: false } : {}),
});
this.props.removeTransientLayer();
@ -95,72 +85,75 @@ export class AddLayerPanel extends Component {
};
_layerAddHandler = () => {
const {
isIndexingTriggered,
setIndexingTriggered,
selectLayerAndAdd,
resetIndexing,
} = this.props;
const layerSource = this.state.layer.getSource();
const boolIndexLayer = layerSource.shouldBeIndexed();
this.setState({ layer: null });
if (boolIndexLayer && !isIndexingTriggered) {
setIndexingTriggered();
if (this.state.isIndexingSource && !this.props.isIndexingTriggered) {
this.props.setIndexingTriggered();
} else {
selectLayerAndAdd();
this.props.selectLayerAndAdd();
if (this.state.importView) {
this.setState({
layerImportAddReady: false,
});
resetIndexing();
this.props.resetIndexing();
}
}
};
_renderAddLayerPanel() {
const { layerWizard, importView } = this.state;
if (!layerWizard) {
_renderPanelBody() {
if (!this.state.layerWizard) {
return <SourceSelect updateSourceSelection={this._onSourceSelectionChange} />;
}
if (importView) {
const backButton = this.props.isIndexingTriggered ? null : (
<Fragment>
<EuiButtonEmpty size="xs" flush="left" onClick={this._clearLayerData} iconType="arrowLeft">
<FormattedMessage
id="xpack.maps.addLayerPanel.changeDataSourceButtonLabel"
defaultMessage="Change layer"
/>
</EuiButtonEmpty>
<EuiSpacer size="s" />
</Fragment>
);
if (this.state.importView) {
return (
<ImportEditor
clearSource={this._clearLayerData}
viewLayer={this._viewLayer}
onRemove={() => this._clearLayerData({ keepSourceType: true })}
/>
<Fragment>
{backButton}
<ImportEditor
clearSource={this._clearLayerData}
previewLayer={this._previewLayer}
mapColors={this.props.mapColors}
onRemove={() => this._clearLayerData({ keepSourceType: true })}
/>
</Fragment>
);
}
return (
<SourceEditor
clearSource={this._clearLayerData}
layerWizard={layerWizard}
previewLayer={this._viewLayer}
/>
<Fragment>
{backButton}
<EuiPanel>
{this.state.layerWizard.renderWizard({
previewLayer: this._previewLayer,
mapColors: this.props.mapColors,
})}
</EuiPanel>
</Fragment>
);
}
_renderFooter(buttonDescription) {
const { importView, layer } = this.state;
const { isIndexingReady, isIndexingSuccess } = this.props;
render() {
if (!this.props.flyoutVisible) {
return null;
}
const buttonEnabled = importView ? isIndexingReady || isIndexingSuccess : !!layer;
return (
<FlyoutFooter
showNextButton={!!this.state.layerWizard}
disableNextButton={!buttonEnabled}
onClick={this._layerAddHandler}
nextButtonText={buttonDescription}
/>
);
}
_renderFlyout() {
const panelDescription = this._getPanelDescription();
const isNextBtnEnabled = this.state.importView
? this.props.isIndexingReady || this.props.isIndexingSuccess
: !!this.state.layerDescriptor;
return (
<EuiFlexGroup direction="column" gutterSize="none">
<Fragment>
<EuiFlyoutHeader hasBorder className="mapLayerPanel__header">
<EuiTitle size="s">
<h2>{panelDescription}</h2>
@ -168,14 +161,16 @@ export class AddLayerPanel extends Component {
</EuiFlyoutHeader>
<div className="mapLayerPanel__body" data-test-subj="layerAddForm">
<div className="mapLayerPanel__bodyOverflow">{this._renderAddLayerPanel()}</div>
<div className="mapLayerPanel__bodyOverflow">{this._renderPanelBody()}</div>
</div>
{this._renderFooter(panelDescription)}
</EuiFlexGroup>
<FlyoutFooter
showNextButton={!!this.state.layerWizard}
disableNextButton={!isNextBtnEnabled}
onClick={this._layerAddHandler}
nextButtonText={panelDescription}
/>
</Fragment>
);
}
render() {
return this.props.flyoutVisible ? this._renderFlyout() : null;
}
}

View file

@ -156,7 +156,7 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer {
static type = LAYER_TYPE.BLENDED_VECTOR;
static createDescriptor(
options: VectorLayerDescriptor,
options: Partial<VectorLayerDescriptor>,
mapColors: string[]
): VectorLayerDescriptor {
const layerDescriptor = VectorLayer.createDescriptor(options, mapColors);

View file

@ -62,7 +62,6 @@ export interface ILayer {
isLayerLoading(): boolean;
hasErrors(): boolean;
getErrors(): string;
toLayerDescriptor(): LayerDescriptor;
getMbLayerIds(): string[];
ownsMbLayerId(mbLayerId: string): boolean;
ownsMbSourceId(mbSourceId: string): boolean;
@ -413,10 +412,6 @@ export class AbstractLayer implements ILayer {
: '';
}
toLayerDescriptor(): LayerDescriptor {
return this._descriptor;
}
async syncData(syncContext: SyncContext) {
// no-op by default
}

View file

@ -6,13 +6,17 @@
/* eslint-disable @typescript-eslint/consistent-type-definitions */
import { ReactElement } from 'react';
import { ISource } from './sources/source';
export type PreviewSourceHandler = (source: ISource | null) => void;
import { LayerDescriptor } from '../../common/descriptor_types';
export type RenderWizardArguments = {
onPreviewSource: PreviewSourceHandler;
inspectorAdapters: object;
previewLayer: (layerDescriptor: LayerDescriptor | null, isIndexingSource?: boolean) => void;
mapColors: string[];
// upload arguments
isIndexingTriggered: boolean;
onRemove: () => void;
onIndexReady: () => void;
importSuccessHandler: (indexResponses: unknown) => void;
importErrorHandler: (indexResponses: unknown) => void;
};
export type LayerWizard = {

View file

@ -12,7 +12,7 @@ import { esDocumentsLayerWizardConfig } from './sources/es_search_source';
// @ts-ignore
import { clustersLayerWizardConfig, heatmapLayerWizardConfig } from './sources/es_geo_grid_source';
// @ts-ignore
import { point2PointLayerWizardConfig } from './sources/es_pew_pew_source/es_pew_pew_source';
import { point2PointLayerWizardConfig } from './sources/es_pew_pew_source';
// @ts-ignore
import { emsBoundariesLayerWizardConfig } from './sources/ems_file_source';
// @ts-ignore

View file

@ -5,17 +5,7 @@
*/
import { AbstractVectorSource } from '../vector_source';
import React from 'react';
import {
ES_GEO_FIELD_TYPE,
SOURCE_TYPES,
DEFAULT_MAX_RESULT_WINDOW,
SCALING_TYPES,
} from '../../../../common/constants';
import { ClientFileCreateSourceEditor } from './create_client_file_source_editor';
import { ESSearchSource } from '../es_search_source';
import uuid from 'uuid/v4';
import { i18n } from '@kbn/i18n';
import { SOURCE_TYPES } from '../../../../common/constants';
import { registerSource } from '../source_registry';
export class GeojsonFileSource extends AbstractVectorSource {
@ -66,103 +56,9 @@ export class GeojsonFileSource extends AbstractVectorSource {
canFormatFeatureProperties() {
return true;
}
shouldBeIndexed() {
return true;
}
}
const viewIndexedData = (
addAndViewSource,
inspectorAdapters,
importSuccessHandler,
importErrorHandler
) => {
return (indexResponses = {}) => {
const { indexDataResp, indexPatternResp } = indexResponses;
const indexCreationFailed = !(indexDataResp && indexDataResp.success);
const allDocsFailed = indexDataResp.failures.length === indexDataResp.docCount;
const indexPatternCreationFailed = !(indexPatternResp && indexPatternResp.success);
if (indexCreationFailed || allDocsFailed || indexPatternCreationFailed) {
importErrorHandler(indexResponses);
return;
}
const { fields, id: indexPatternId } = indexPatternResp;
const geoField = fields.find(field => Object.values(ES_GEO_FIELD_TYPE).includes(field.type));
if (!indexPatternId || !geoField) {
addAndViewSource(null);
} else {
const source = new ESSearchSource(
{
id: uuid(),
indexPatternId,
geoField: geoField.name,
// Only turn on bounds filter for large doc counts
filterByMapBounds: indexDataResp.docCount > DEFAULT_MAX_RESULT_WINDOW,
scalingType:
geoField.type === ES_GEO_FIELD_TYPE.GEO_POINT
? SCALING_TYPES.CLUSTERS
: SCALING_TYPES.LIMIT,
},
inspectorAdapters
);
addAndViewSource(source);
importSuccessHandler(indexResponses);
}
};
};
const previewGeojsonFile = (onPreviewSource, inspectorAdapters) => {
return (geojsonFile, name) => {
if (!geojsonFile) {
onPreviewSource(null);
return;
}
const sourceDescriptor = GeojsonFileSource.createDescriptor(geojsonFile, name);
const source = new GeojsonFileSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
};
registerSource({
ConstructorFunction: GeojsonFileSource,
type: SOURCE_TYPES.GEOJSON_FILE,
});
export const uploadLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.geojsonFileDescription', {
defaultMessage: 'Index GeoJSON data in Elasticsearch',
}),
icon: 'importAction',
isIndexingSource: true,
renderWizard: ({
onPreviewSource,
inspectorAdapters,
addAndViewSource,
isIndexingTriggered,
onRemove,
onIndexReady,
importSuccessHandler,
importErrorHandler,
}) => {
return (
<ClientFileCreateSourceEditor
previewGeojsonFile={previewGeojsonFile(onPreviewSource, inspectorAdapters)}
isIndexingTriggered={isIndexingTriggered}
onIndexingComplete={viewIndexedData(
addAndViewSource,
inspectorAdapters,
importSuccessHandler,
importErrorHandler
)}
onRemove={onRemove}
onIndexReady={onIndexReady}
/>
);
},
title: i18n.translate('xpack.maps.source.geojsonFileTitle', {
defaultMessage: 'Upload GeoJSON',
}),
};

View file

@ -4,4 +4,5 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { GeojsonFileSource, uploadLayerWizardConfig } from './geojson_file_source';
export { GeojsonFileSource } from './geojson_file_source';
export { uploadLayerWizardConfig } from './upload_layer_wizard';

View file

@ -0,0 +1,106 @@
/*
* 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 { i18n } from '@kbn/i18n';
import React from 'react';
import { IFieldType } from 'src/plugins/data/public';
import {
ES_GEO_FIELD_TYPE,
DEFAULT_MAX_RESULT_WINDOW,
SCALING_TYPES,
} from '../../../../common/constants';
// @ts-ignore
import { ESSearchSource, createDefaultLayerDescriptor } from '../es_search_source';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { ClientFileCreateSourceEditor } from './create_client_file_source_editor';
// @ts-ignore
import { GeojsonFileSource } from './geojson_file_source';
import { VectorLayer } from '../../vector_layer';
export const uploadLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.geojsonFileDescription', {
defaultMessage: 'Index GeoJSON data in Elasticsearch',
}),
icon: 'importAction',
isIndexingSource: true,
renderWizard: ({
previewLayer,
mapColors,
isIndexingTriggered,
onRemove,
onIndexReady,
importSuccessHandler,
importErrorHandler,
}: RenderWizardArguments) => {
function previewGeojsonFile(geojsonFile: unknown, name: string) {
if (!geojsonFile) {
previewLayer(null);
return;
}
const sourceDescriptor = GeojsonFileSource.createDescriptor(geojsonFile, name);
const layerDescriptor = VectorLayer.createDescriptor({ sourceDescriptor }, mapColors);
// TODO figure out a better way to handle passing this information back to layer_addpanel
previewLayer(layerDescriptor, true);
}
function viewIndexedData(indexResponses: {
indexDataResp: unknown;
indexPatternResp: unknown;
}) {
const { indexDataResp, indexPatternResp } = indexResponses;
// @ts-ignore
const indexCreationFailed = !(indexDataResp && indexDataResp.success);
// @ts-ignore
const allDocsFailed = indexDataResp.failures.length === indexDataResp.docCount;
// @ts-ignore
const indexPatternCreationFailed = !(indexPatternResp && indexPatternResp.success);
if (indexCreationFailed || allDocsFailed || indexPatternCreationFailed) {
importErrorHandler(indexResponses);
return;
}
// @ts-ignore
const { fields, id: indexPatternId } = indexPatternResp;
const geoField = fields.find((field: IFieldType) =>
[ES_GEO_FIELD_TYPE.GEO_POINT as string, ES_GEO_FIELD_TYPE.GEO_SHAPE as string].includes(
field.type
)
);
if (!indexPatternId || !geoField) {
previewLayer(null);
} else {
const esSearchSourceConfig = {
indexPatternId,
geoField: geoField.name,
// Only turn on bounds filter for large doc counts
// @ts-ignore
filterByMapBounds: indexDataResp.docCount > DEFAULT_MAX_RESULT_WINDOW,
scalingType:
geoField.type === ES_GEO_FIELD_TYPE.GEO_POINT
? SCALING_TYPES.CLUSTERS
: SCALING_TYPES.LIMIT,
};
previewLayer(createDefaultLayerDescriptor(esSearchSourceConfig, mapColors));
importSuccessHandler(indexResponses);
}
}
return (
<ClientFileCreateSourceEditor
previewGeojsonFile={previewGeojsonFile}
isIndexingTriggered={isIndexingTriggered}
onIndexingComplete={viewIndexedData}
onRemove={onRemove}
onIndexReady={onIndexReady}
/>
);
},
title: i18n.translate('xpack.maps.source.geojsonFileTitle', {
defaultMessage: 'Upload GeoJSON',
}),
};

View file

@ -0,0 +1,31 @@
/*
* 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 React from 'react';
import { i18n } from '@kbn/i18n';
import { VectorLayer } from '../../vector_layer';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { EMSFileCreateSourceEditor } from './create_source_editor';
// @ts-ignore
import { EMSFileSource, sourceTitle } from './ems_file_source';
export const emsBoundariesLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.emsFileDescription', {
defaultMessage: 'Administrative boundaries from Elastic Maps Service',
}),
icon: 'emsApp',
renderWizard: ({ previewLayer, mapColors }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: unknown) => {
// @ts-ignore
const sourceDescriptor = EMSFileSource.createDescriptor(sourceConfig);
const layerDescriptor = VectorLayer.createDescriptor({ sourceDescriptor }, mapColors);
previewLayer(layerDescriptor);
};
return <EMSFileCreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -9,14 +9,13 @@ import { VECTOR_SHAPE_TYPES } from '../vector_feature_types';
import React from 'react';
import { SOURCE_TYPES, FIELD_ORIGIN } from '../../../../common/constants';
import { getEMSClient } from '../../../meta';
import { EMSFileCreateSourceEditor } from './create_source_editor';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
import { UpdateSourceEditor } from './update_source_editor';
import { EMSFileField } from '../../fields/ems_file_field';
import { registerSource } from '../source_registry';
const sourceTitle = i18n.translate('xpack.maps.source.emsFileTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.emsFileTitle', {
defaultMessage: 'EMS Boundaries',
});
@ -161,19 +160,3 @@ registerSource({
ConstructorFunction: EMSFileSource,
type: SOURCE_TYPES.EMS_FILE,
});
export const emsBoundariesLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.emsFileDescription', {
defaultMessage: 'Administrative boundaries from Elastic Maps Service',
}),
icon: 'emsApp',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
const sourceDescriptor = EMSFileSource.createDescriptor(sourceConfig);
const source = new EMSFileSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return <EMSFileCreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -4,4 +4,5 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { EMSFileSource, emsBoundariesLayerWizardConfig } from './ems_file_source';
export { emsBoundariesLayerWizardConfig } from './ems_boundaries_layer_wizard';
export { EMSFileSource } from './ems_file_source';

View file

@ -0,0 +1,32 @@
/*
* 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 React from 'react';
import { i18n } from '@kbn/i18n';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { EMSTMSSource, sourceTitle } from './ems_tms_source';
// @ts-ignore
import { VectorTileLayer } from '../../vector_tile_layer';
// @ts-ignore
import { TileServiceSelect } from './tile_service_select';
export const emsBaseMapLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.emsTileDescription', {
defaultMessage: 'Tile map service from Elastic Maps Service',
}),
icon: 'emsApp',
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: unknown) => {
const layerDescriptor = VectorTileLayer.createDescriptor({
sourceDescriptor: EMSTMSSource.createDescriptor(sourceConfig),
});
previewLayer(layerDescriptor);
};
return <TileServiceSelect onTileSelect={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -7,10 +7,8 @@
import _ from 'lodash';
import React from 'react';
import { AbstractTMSSource } from '../tms_source';
import { VectorTileLayer } from '../../vector_tile_layer';
import { getEMSClient } from '../../../meta';
import { TileServiceSelect } from './tile_service_select';
import { UpdateSourceEditor } from './update_source_editor';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
@ -18,7 +16,7 @@ import { SOURCE_TYPES } from '../../../../common/constants';
import { getInjectedVarFunc, getUiSettings } from '../../../kibana_services';
import { registerSource } from '../source_registry';
const sourceTitle = i18n.translate('xpack.maps.source.emsTileTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.emsTileTitle', {
defaultMessage: 'EMS Basemaps',
});
@ -84,20 +82,6 @@ export class EMSTMSSource extends AbstractTMSSource {
return tmsService;
}
_createDefaultLayerDescriptor(options) {
return VectorTileLayer.createDescriptor({
sourceDescriptor: this._descriptor,
...options,
});
}
createDefaultLayer(options) {
return new VectorTileLayer({
layerDescriptor: this._createDefaultLayerDescriptor(options),
source: this,
});
}
async getDisplayName() {
try {
const emsTMSService = await this._getEMSTMSService();
@ -150,20 +134,3 @@ registerSource({
ConstructorFunction: EMSTMSSource,
type: SOURCE_TYPES.EMS_TMS,
});
export const emsBaseMapLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.emsTileDescription', {
defaultMessage: 'Tile map service from Elastic Maps Service',
}),
icon: 'emsApp',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
const descriptor = EMSTMSSource.createDescriptor(sourceConfig);
const source = new EMSTMSSource(descriptor, inspectorAdapters);
onPreviewSource(source);
};
return <TileServiceSelect onTileSelect={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -4,4 +4,5 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { EMSTMSSource, emsBaseMapLayerWizardConfig } from './ems_tms_source';
export { emsBaseMapLayerWizardConfig } from './ems_base_map_layer_wizard';
export { EMSTMSSource } from './ems_tms_source';

View file

@ -0,0 +1,108 @@
/*
* 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 { i18n } from '@kbn/i18n';
import React from 'react';
// @ts-ignore
import { CreateSourceEditor } from './create_source_editor';
// @ts-ignore
import { ESGeoGridSource, clustersTitle } from './es_geo_grid_source';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
import { VectorLayer } from '../../vector_layer';
import {
ESGeoGridSourceDescriptor,
ColorDynamicOptions,
SizeDynamicOptions,
} from '../../../../common/descriptor_types';
import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults';
import { VectorStyle } from '../../styles/vector/vector_style';
import {
COUNT_PROP_NAME,
COLOR_MAP_TYPE,
FIELD_ORIGIN,
RENDER_AS,
VECTOR_STYLES,
STYLE_TYPE,
} from '../../../../common/constants';
// @ts-ignore
import { COLOR_GRADIENTS } from '../../styles/color_utils';
export const clustersLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.esGridClustersDescription', {
defaultMessage: 'Geospatial data grouped in grids with metrics for each gridded cell',
}),
icon: 'logoElasticsearch',
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: Partial<ESGeoGridSourceDescriptor>) => {
if (!sourceConfig) {
previewLayer(null);
return;
}
const defaultDynamicProperties = getDefaultDynamicProperties();
const layerDescriptor = VectorLayer.createDescriptor({
sourceDescriptor: ESGeoGridSource.createDescriptor(sourceConfig),
style: VectorStyle.createDescriptor({
// @ts-ignore
[VECTOR_STYLES.FILL_COLOR]: {
type: STYLE_TYPE.DYNAMIC,
options: {
...(defaultDynamicProperties[VECTOR_STYLES.FILL_COLOR]!
.options as ColorDynamicOptions),
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
color: COLOR_GRADIENTS[0].value,
type: COLOR_MAP_TYPE.ORDINAL,
},
},
[VECTOR_STYLES.LINE_COLOR]: {
type: STYLE_TYPE.STATIC,
options: {
color: '#FFF',
},
},
[VECTOR_STYLES.LINE_WIDTH]: {
type: STYLE_TYPE.STATIC,
options: {
size: 0,
},
},
[VECTOR_STYLES.ICON_SIZE]: {
type: STYLE_TYPE.DYNAMIC,
options: {
...(defaultDynamicProperties[VECTOR_STYLES.ICON_SIZE]!.options as SizeDynamicOptions),
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
},
},
[VECTOR_STYLES.LABEL_TEXT]: {
type: STYLE_TYPE.DYNAMIC,
options: {
...defaultDynamicProperties[VECTOR_STYLES.LABEL_TEXT]!.options,
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
},
},
}),
});
previewLayer(layerDescriptor);
};
return (
<CreateSourceEditor
requestType={RENDER_AS.POINT}
onSourceConfigChange={onSourceConfigChange}
/>
);
},
title: clustersTitle,
};

View file

@ -8,39 +8,27 @@ import React from 'react';
import uuid from 'uuid/v4';
import { VECTOR_SHAPE_TYPES } from '../vector_feature_types';
import { HeatmapLayer } from '../../heatmap_layer';
import { VectorLayer } from '../../vector_layer';
import { convertCompositeRespToGeoJson, convertRegularRespToGeoJson } from './convert_to_geojson';
import { VectorStyle } from '../../styles/vector/vector_style';
import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults';
import { COLOR_GRADIENTS } from '../../styles/color_utils';
import { CreateSourceEditor } from './create_source_editor';
import { UpdateSourceEditor } from './update_source_editor';
import {
SOURCE_TYPES,
DEFAULT_MAX_BUCKETS_LIMIT,
COUNT_PROP_NAME,
COLOR_MAP_TYPE,
RENDER_AS,
GRID_RESOLUTION,
VECTOR_STYLES,
FIELD_ORIGIN,
} from '../../../../common/constants';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
import { AbstractESAggSource } from '../es_agg_source';
import { DynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property';
import { StaticStyleProperty } from '../../styles/vector/properties/static_style_property';
import { DataRequestAbortError } from '../../util/data_request';
import { registerSource } from '../source_registry';
export const MAX_GEOTILE_LEVEL = 29;
const clustersTitle = i18n.translate('xpack.maps.source.esGridClustersTitle', {
export const clustersTitle = i18n.translate('xpack.maps.source.esGridClustersTitle', {
defaultMessage: 'Clusters and grids',
});
const heatmapTitle = i18n.translate('xpack.maps.source.esGridHeatmapTitle', {
export const heatmapTitle = i18n.translate('xpack.maps.source.esGridHeatmapTitle', {
defaultMessage: 'Heat map',
});
@ -320,87 +308,6 @@ export class ESGeoGridSource extends AbstractESAggSource {
return true;
}
_createHeatmapLayerDescriptor(options) {
return HeatmapLayer.createDescriptor({
sourceDescriptor: this._descriptor,
...options,
});
}
_createVectorLayerDescriptor(options) {
const descriptor = VectorLayer.createDescriptor({
sourceDescriptor: this._descriptor,
...options,
});
const defaultDynamicProperties = getDefaultDynamicProperties();
descriptor.style = VectorStyle.createDescriptor({
[VECTOR_STYLES.FILL_COLOR]: {
type: DynamicStyleProperty.type,
options: {
...defaultDynamicProperties[VECTOR_STYLES.FILL_COLOR].options,
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
color: COLOR_GRADIENTS[0].value,
type: COLOR_MAP_TYPE.ORDINAL,
},
},
[VECTOR_STYLES.LINE_COLOR]: {
type: StaticStyleProperty.type,
options: {
color: '#FFF',
},
},
[VECTOR_STYLES.LINE_WIDTH]: {
type: StaticStyleProperty.type,
options: {
size: 0,
},
},
[VECTOR_STYLES.ICON_SIZE]: {
type: DynamicStyleProperty.type,
options: {
...defaultDynamicProperties[VECTOR_STYLES.ICON_SIZE].options,
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
},
},
[VECTOR_STYLES.LABEL_TEXT]: {
type: DynamicStyleProperty.type,
options: {
...defaultDynamicProperties[VECTOR_STYLES.LABEL_TEXT].options,
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
},
},
});
return descriptor;
}
createDefaultLayer(options) {
if (this._descriptor.requestType === RENDER_AS.HEATMAP) {
return new HeatmapLayer({
layerDescriptor: this._createHeatmapLayerDescriptor(options),
source: this,
});
}
const layerDescriptor = this._createVectorLayerDescriptor(options);
const style = new VectorStyle(layerDescriptor.style, this);
return new VectorLayer({
layerDescriptor,
source: this,
style,
});
}
canFormatFeatureProperties() {
return true;
}
@ -422,57 +329,3 @@ registerSource({
ConstructorFunction: ESGeoGridSource,
type: SOURCE_TYPES.ES_GEO_GRID,
});
export const clustersLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.esGridClustersDescription', {
defaultMessage: 'Geospatial data grouped in grids with metrics for each gridded cell',
}),
icon: 'logoElasticsearch',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
if (!sourceConfig) {
onPreviewSource(null);
return;
}
const sourceDescriptor = ESGeoGridSource.createDescriptor(sourceConfig);
const source = new ESGeoGridSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return (
<CreateSourceEditor
requestType={RENDER_AS.POINT}
onSourceConfigChange={onSourceConfigChange}
/>
);
},
title: clustersTitle,
};
export const heatmapLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.esGridHeatmapDescription', {
defaultMessage: 'Geospatial data grouped in grids to show density',
}),
icon: 'logoElasticsearch',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
if (!sourceConfig) {
onPreviewSource(null);
return;
}
const sourceDescriptor = ESGeoGridSource.createDescriptor(sourceConfig);
const source = new ESGeoGridSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return (
<CreateSourceEditor
requestType={RENDER_AS.HEATMAP}
onSourceConfigChange={onSourceConfigChange}
/>
);
},
title: heatmapTitle,
};

View file

@ -0,0 +1,45 @@
/*
* 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 { i18n } from '@kbn/i18n';
import React from 'react';
// @ts-ignore
import { CreateSourceEditor } from './create_source_editor';
// @ts-ignore
import { ESGeoGridSource, heatmapTitle } from './es_geo_grid_source';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { HeatmapLayer } from '../../heatmap_layer';
import { ESGeoGridSourceDescriptor } from '../../../../common/descriptor_types';
import { RENDER_AS } from '../../../../common/constants';
export const heatmapLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.esGridHeatmapDescription', {
defaultMessage: 'Geospatial data grouped in grids to show density',
}),
icon: 'logoElasticsearch',
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: Partial<ESGeoGridSourceDescriptor>) => {
if (!sourceConfig) {
previewLayer(null);
return;
}
const layerDescriptor = HeatmapLayer.createDescriptor({
sourceDescriptor: ESGeoGridSource.createDescriptor(sourceConfig),
});
previewLayer(layerDescriptor);
};
return (
<CreateSourceEditor
requestType={RENDER_AS.HEATMAP}
onSourceConfigChange={onSourceConfigChange}
/>
);
},
title: heatmapTitle,
};

View file

@ -4,8 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
export {
ESGeoGridSource,
clustersLayerWizardConfig,
heatmapLayerWizardConfig,
} from './es_geo_grid_source';
export { clustersLayerWizardConfig } from './clusters_layer_wizard';
export { ESGeoGridSource } from './es_geo_grid_source';
export { heatmapLayerWizardConfig } from './heatmap_layer_wizard';

View file

@ -8,29 +8,18 @@ import React from 'react';
import uuid from 'uuid/v4';
import { VECTOR_SHAPE_TYPES } from '../vector_feature_types';
import { VectorLayer } from '../../vector_layer';
import { CreateSourceEditor } from './create_source_editor';
import { UpdateSourceEditor } from './update_source_editor';
import { VectorStyle } from '../../styles/vector/vector_style';
import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults';
import { i18n } from '@kbn/i18n';
import {
FIELD_ORIGIN,
SOURCE_TYPES,
COUNT_PROP_NAME,
VECTOR_STYLES,
} from '../../../../common/constants';
import { SOURCE_TYPES } from '../../../../common/constants';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
import { convertToLines } from './convert_to_lines';
import { AbstractESAggSource } from '../es_agg_source';
import { DynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property';
import { COLOR_GRADIENTS } from '../../styles/color_utils';
import { indexPatterns } from '../../../../../../../src/plugins/data/public';
import { registerSource } from '../source_registry';
const MAX_GEOTILE_LEVEL = 29;
const sourceTitle = i18n.translate('xpack.maps.source.pewPewTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.pewPewTitle', {
defaultMessage: 'Point to point',
});
@ -109,43 +98,6 @@ export class ESPewPewSource extends AbstractESAggSource {
];
}
createDefaultLayer(options) {
const defaultDynamicProperties = getDefaultDynamicProperties();
const styleDescriptor = VectorStyle.createDescriptor({
[VECTOR_STYLES.LINE_COLOR]: {
type: DynamicStyleProperty.type,
options: {
...defaultDynamicProperties[VECTOR_STYLES.LINE_COLOR].options,
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
color: COLOR_GRADIENTS[0].value,
},
},
[VECTOR_STYLES.LINE_WIDTH]: {
type: DynamicStyleProperty.type,
options: {
...defaultDynamicProperties[VECTOR_STYLES.LINE_WIDTH].options,
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
},
},
});
return new VectorLayer({
layerDescriptor: VectorLayer.createDescriptor({
...options,
sourceDescriptor: this._descriptor,
style: styleDescriptor,
}),
source: this,
style: new VectorStyle(styleDescriptor, this),
});
}
getGeoGridPrecision(zoom) {
const targetGeotileLevel = Math.ceil(zoom) + 2;
return Math.min(targetGeotileLevel, MAX_GEOTILE_LEVEL);
@ -234,25 +186,3 @@ registerSource({
ConstructorFunction: ESPewPewSource,
type: SOURCE_TYPES.ES_PEW_PEW,
});
export const point2PointLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.pewPewDescription', {
defaultMessage: 'Aggregated data paths between the source and destination',
}),
icon: 'logoElasticsearch',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
if (!sourceConfig) {
onPreviewSource(null);
return;
}
const sourceDescriptor = ESPewPewSource.createDescriptor(sourceConfig);
const source = new ESPewPewSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -0,0 +1,8 @@
/*
* 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.
*/
export { ESPewPewSource } from './es_pew_pew_source';
export { point2PointLayerWizardConfig } from './point_2_point_layer_wizard';

View file

@ -0,0 +1,74 @@
/*
* 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 React from 'react';
import { i18n } from '@kbn/i18n';
import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults';
import { VectorLayer } from '../../vector_layer';
// @ts-ignore
import { ESPewPewSource, sourceTitle } from './es_pew_pew_source';
import { VectorStyle } from '../../styles/vector/vector_style';
import {
FIELD_ORIGIN,
COUNT_PROP_NAME,
VECTOR_STYLES,
STYLE_TYPE,
} from '../../../../common/constants';
// @ts-ignore
import { COLOR_GRADIENTS } from '../../styles/color_utils';
// @ts-ignore
import { CreateSourceEditor } from './create_source_editor';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
import { ColorDynamicOptions, SizeDynamicOptions } from '../../../../common/descriptor_types';
export const point2PointLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.pewPewDescription', {
defaultMessage: 'Aggregated data paths between the source and destination',
}),
icon: 'logoElasticsearch',
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: unknown) => {
if (!sourceConfig) {
previewLayer(null);
return;
}
const defaultDynamicProperties = getDefaultDynamicProperties();
const layerDescriptor = VectorLayer.createDescriptor({
sourceDescriptor: ESPewPewSource.createDescriptor(sourceConfig),
style: VectorStyle.createDescriptor({
[VECTOR_STYLES.LINE_COLOR]: {
type: STYLE_TYPE.DYNAMIC,
options: {
...(defaultDynamicProperties[VECTOR_STYLES.LINE_COLOR]!
.options as ColorDynamicOptions),
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
color: COLOR_GRADIENTS[0].value,
},
},
[VECTOR_STYLES.LINE_WIDTH]: {
type: STYLE_TYPE.DYNAMIC,
options: {
...(defaultDynamicProperties[VECTOR_STYLES.LINE_WIDTH]!
.options as SizeDynamicOptions),
field: {
name: COUNT_PROP_NAME,
origin: FIELD_ORIGIN.SOURCE,
},
},
},
}),
});
previewLayer(layerDescriptor);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -0,0 +1,43 @@
/*
* 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 { i18n } from '@kbn/i18n';
import React from 'react';
// @ts-ignore
import { CreateSourceEditor } from './create_source_editor';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { ESSearchSource, sourceTitle } from './es_search_source';
import { BlendedVectorLayer } from '../../blended_vector_layer';
import { VectorLayer } from '../../vector_layer';
import { SCALING_TYPES } from '../../../../common/constants';
export function createDefaultLayerDescriptor(sourceConfig: unknown, mapColors: string[]) {
const sourceDescriptor = ESSearchSource.createDescriptor(sourceConfig);
return sourceDescriptor.scalingType === SCALING_TYPES.CLUSTERS
? BlendedVectorLayer.createDescriptor({ sourceDescriptor }, mapColors)
: VectorLayer.createDescriptor({ sourceDescriptor }, mapColors);
}
export const esDocumentsLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.esSearchDescription', {
defaultMessage: 'Vector data from a Kibana index pattern',
}),
icon: 'logoElasticsearch',
renderWizard: ({ previewLayer, mapColors }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: unknown) => {
if (!sourceConfig) {
previewLayer(null);
return;
}
previewLayer(createDefaultLayerDescriptor(sourceConfig, mapColors));
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -8,6 +8,8 @@ import { AbstractESSource } from '../es_source';
import { ESSearchSourceDescriptor } from '../../../../common/descriptor_types';
export class ESSearchSource extends AbstractESSource {
static createDescriptor(sourceConfig: unknown): ESSearchSourceDescriptor;
constructor(sourceDescriptor: Partial<ESSearchSourceDescriptor>, inspectorAdapters: unknown);
getFieldNames(): string[];
}

View file

@ -6,15 +6,11 @@
import _ from 'lodash';
import React from 'react';
import uuid from 'uuid/v4';
import { VECTOR_SHAPE_TYPES } from '../vector_feature_types';
import { AbstractESSource } from '../es_source';
import { getSearchService } from '../../../kibana_services';
import { VectorStyle } from '../../styles/vector/vector_style';
import { VectorLayer } from '../../vector_layer';
import { hitsToGeoJson } from '../../../elasticsearch_geo_utils';
import { CreateSourceEditor } from './create_source_editor';
import { UpdateSourceEditor } from './update_source_editor';
import {
SOURCE_TYPES,
@ -27,14 +23,14 @@ import { i18n } from '@kbn/i18n';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
import { getSourceFields } from '../../../index_pattern_util';
import { loadIndexSettings } from './load_index_settings';
import { BlendedVectorLayer } from '../../blended_vector_layer';
import uuid from 'uuid/v4';
import { DEFAULT_FILTER_BY_MAP_BOUNDS } from './constants';
import { ESDocField } from '../../fields/es_doc_field';
import { getField, addFieldToDSL } from '../../util/es_agg_utils';
import { registerSource } from '../source_registry';
const sourceTitle = i18n.translate('xpack.maps.source.esSearchTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.esSearchTitle', {
defaultMessage: 'Documents',
});
@ -71,56 +67,31 @@ function getDocValueAndSourceFields(indexPattern, fieldNames) {
export class ESSearchSource extends AbstractESSource {
static type = SOURCE_TYPES.ES_SEARCH;
static createDescriptor(descriptor) {
return {
...descriptor,
id: descriptor.id ? descriptor.id : uuid(),
type: ESSearchSource.type,
indexPatternId: descriptor.indexPatternId,
geoField: descriptor.geoField,
filterByMapBounds: _.get(descriptor, 'filterByMapBounds', DEFAULT_FILTER_BY_MAP_BOUNDS),
tooltipProperties: _.get(descriptor, 'tooltipProperties', []),
sortField: _.get(descriptor, 'sortField', ''),
sortOrder: _.get(descriptor, 'sortOrder', SORT_ORDER.DESC),
scalingType: _.get(descriptor, 'scalingType', SCALING_TYPES.LIMIT),
topHitsSplitField: descriptor.topHitsSplitField,
topHitsSize: _.get(descriptor, 'topHitsSize', 1),
};
}
constructor(descriptor, inspectorAdapters) {
super(
{
...descriptor,
id: descriptor.id,
type: ESSearchSource.type,
indexPatternId: descriptor.indexPatternId,
geoField: descriptor.geoField,
filterByMapBounds: _.get(descriptor, 'filterByMapBounds', DEFAULT_FILTER_BY_MAP_BOUNDS),
tooltipProperties: _.get(descriptor, 'tooltipProperties', []),
sortField: _.get(descriptor, 'sortField', ''),
sortOrder: _.get(descriptor, 'sortOrder', SORT_ORDER.DESC),
scalingType: _.get(descriptor, 'scalingType', SCALING_TYPES.LIMIT),
topHitsSplitField: descriptor.topHitsSplitField,
topHitsSize: _.get(descriptor, 'topHitsSize', 1),
},
inspectorAdapters
);
super(ESSearchSource.createDescriptor(descriptor), inspectorAdapters);
this._tooltipFields = this._descriptor.tooltipProperties.map(property =>
this.createField({ fieldName: property })
);
}
createDefaultLayer(options, mapColors) {
if (this._descriptor.scalingType === SCALING_TYPES.CLUSTERS) {
const layerDescriptor = BlendedVectorLayer.createDescriptor(
{
sourceDescriptor: this._descriptor,
...options,
},
mapColors
);
const style = new VectorStyle(layerDescriptor.style, this);
return new BlendedVectorLayer({
layerDescriptor: layerDescriptor,
source: this,
style,
});
}
const layerDescriptor = this._createDefaultLayerDescriptor(options, mapColors);
const style = new VectorStyle(layerDescriptor.style, this);
return new VectorLayer({
layerDescriptor: layerDescriptor,
source: this,
style,
});
}
createField({ fieldName }) {
return new ESDocField({
fieldName,
@ -586,29 +557,3 @@ registerSource({
ConstructorFunction: ESSearchSource,
type: SOURCE_TYPES.ES_SEARCH,
});
export const esDocumentsLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.esSearchDescription', {
defaultMessage: 'Vector data from a Kibana index pattern',
}),
icon: 'logoElasticsearch',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
if (!sourceConfig) {
onPreviewSource(null);
return;
}
const source = new ESSearchSource(
{
id: uuid(),
...sourceConfig,
},
inspectorAdapters
);
onPreviewSource(source);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -1,33 +0,0 @@
/*
* 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.
*/
jest.mock('ui/new_platform');
jest.mock('../../../kibana_services');
import { ESSearchSource } from './es_search_source';
import { VectorLayer } from '../../vector_layer';
import { SCALING_TYPES, SOURCE_TYPES } from '../../../../common/constants';
import { ESSearchSourceDescriptor } from '../../../../common/descriptor_types';
const descriptor: ESSearchSourceDescriptor = {
type: SOURCE_TYPES.ES_SEARCH,
id: '1234',
indexPatternId: 'myIndexPattern',
geoField: 'myLocation',
scalingType: SCALING_TYPES.LIMIT,
};
describe('ES Search Source', () => {
beforeEach(() => {
require('../../../kibana_services').getUiSettings = () => ({
get: jest.fn(),
});
});
it('should create a vector layer', () => {
const source = new ESSearchSource(descriptor, null);
const layer = source.createDefaultLayer();
expect(layer instanceof VectorLayer).toEqual(true);
});
});

View file

@ -4,4 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { ESSearchSource, esDocumentsLayerWizardConfig } from './es_search_source';
export { ESSearchSource } from './es_search_source';
export {
createDefaultLayerDescriptor,
esDocumentsLayerWizardConfig,
} from './es_documents_layer_wizard';

View file

@ -4,4 +4,5 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { KibanaRegionmapSource, kibanaRegionMapLayerWizardConfig } from './kibana_regionmap_source';
export { kibanaRegionMapLayerWizardConfig } from './kibana_regionmap_layer_wizard';
export { KibanaRegionmapSource } from './kibana_regionmap_source';

View file

@ -0,0 +1,31 @@
/*
* 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 React from 'react';
import { i18n } from '@kbn/i18n';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { KibanaRegionmapSource, sourceTitle } from './kibana_regionmap_source';
import { VectorLayer } from '../../vector_layer';
// @ts-ignore
import { CreateSourceEditor } from './create_source_editor';
export const kibanaRegionMapLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.kbnRegionMapDescription', {
defaultMessage: 'Vector data from hosted GeoJSON configured in kibana.yml',
}),
icon: 'logoKibana',
renderWizard: ({ previewLayer, mapColors }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: unknown) => {
const sourceDescriptor = KibanaRegionmapSource.createDescriptor(sourceConfig);
const layerDescriptor = VectorLayer.createDescriptor({ sourceDescriptor }, mapColors);
previewLayer(layerDescriptor);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -5,8 +5,6 @@
*/
import { AbstractVectorSource } from '../vector_source';
import React from 'react';
import { CreateSourceEditor } from './create_source_editor';
import { getKibanaRegionList } from '../../../meta';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
@ -14,7 +12,7 @@ import { FIELD_ORIGIN, SOURCE_TYPES } from '../../../../common/constants';
import { KibanaRegionField } from '../../fields/kibana_region_field';
import { registerSource } from '../source_registry';
const sourceTitle = i18n.translate('xpack.maps.source.kbnRegionMapTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.kbnRegionMapTitle', {
defaultMessage: 'Configured GeoJSON',
});
@ -101,20 +99,3 @@ registerSource({
ConstructorFunction: KibanaRegionmapSource,
type: SOURCE_TYPES.REGIONMAP_FILE,
});
export const kibanaRegionMapLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.kbnRegionMapDescription', {
defaultMessage: 'Vector data from hosted GeoJSON configured in kibana.yml',
}),
icon: 'logoKibana',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
const sourceDescriptor = KibanaRegionmapSource.createDescriptor(sourceConfig);
const source = new KibanaRegionmapSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -4,4 +4,5 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { KibanaTilemapSource, kibanaBasemapLayerWizardConfig } from './kibana_tilemap_source';
export { kibanaBasemapLayerWizardConfig } from './kibana_base_map_layer_wizard';
export { KibanaTilemapSource } from './kibana_tilemap_source';

View file

@ -0,0 +1,31 @@
/*
* 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 React from 'react';
import { i18n } from '@kbn/i18n';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
// @ts-ignore
import { CreateSourceEditor } from './create_source_editor';
// @ts-ignore
import { KibanaTilemapSource, sourceTitle } from './kibana_tilemap_source';
import { TileLayer } from '../../tile_layer';
export const kibanaBasemapLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.kbnTMSDescription', {
defaultMessage: 'Tile map service configured in kibana.yml',
}),
icon: 'logoKibana',
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = () => {
const layerDescriptor = TileLayer.createDescriptor({
sourceDescriptor: KibanaTilemapSource.createDescriptor(),
});
previewLayer(layerDescriptor);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -3,10 +3,8 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import React from 'react';
import { AbstractTMSSource } from '../tms_source';
import { TileLayer } from '../../tile_layer';
import { CreateSourceEditor } from './create_source_editor';
import { getKibanaTileMap } from '../../../meta';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel } from '../../../../common/i18n_getters';
@ -14,7 +12,7 @@ import _ from 'lodash';
import { SOURCE_TYPES } from '../../../../common/constants';
import { registerSource } from '../source_registry';
const sourceTitle = i18n.translate('xpack.maps.source.kbnTMSTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.kbnTMSTitle', {
defaultMessage: 'Configured Tile Map Service',
});
@ -42,20 +40,6 @@ export class KibanaTilemapSource extends AbstractTMSSource {
];
}
_createDefaultLayerDescriptor(options) {
return TileLayer.createDescriptor({
sourceDescriptor: this._descriptor,
...options,
});
}
createDefaultLayer(options) {
return new TileLayer({
layerDescriptor: this._createDefaultLayerDescriptor(options),
source: this,
});
}
async getUrlTemplate() {
const tilemap = getKibanaTileMap();
if (!tilemap.url) {
@ -88,19 +72,3 @@ registerSource({
ConstructorFunction: KibanaTilemapSource,
type: SOURCE_TYPES.KIBANA_TILEMAP,
});
export const kibanaBasemapLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.kbnTMSDescription', {
defaultMessage: 'Tile map service configured in kibana.yml',
}),
icon: 'logoKibana',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = () => {
const sourceDescriptor = KibanaTilemapSource.createDescriptor();
const source = new KibanaTilemapSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return <CreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -12,30 +12,20 @@ import {
} from './mvt_single_layer_vector_source_editor';
import { MVTSingleLayerVectorSource, sourceTitle } from './mvt_single_layer_vector_source';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
import { SOURCE_TYPES } from '../../../../common/constants';
import { TiledVectorLayer } from '../../tiled_vector_layer';
export const mvtVectorSourceWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.mvtVectorSourceWizard', {
defaultMessage: 'Vector source wizard',
}),
icon: 'grid',
renderWizard: ({ onPreviewSource, inspectorAdapters }: RenderWizardArguments) => {
const onSourceConfigChange = ({
urlTemplate,
layerName,
minSourceZoom,
maxSourceZoom,
}: MVTSingleLayerVectorSourceConfig) => {
const sourceDescriptor = MVTSingleLayerVectorSource.createDescriptor({
urlTemplate,
layerName,
minSourceZoom,
maxSourceZoom,
type: SOURCE_TYPES.MVT_SINGLE_LAYER,
});
const source = new MVTSingleLayerVectorSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
renderWizard: ({ previewLayer, mapColors }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: MVTSingleLayerVectorSourceConfig) => {
const sourceDescriptor = MVTSingleLayerVectorSource.createDescriptor(sourceConfig);
const layerDescriptor = TiledVectorLayer.createDescriptor({ sourceDescriptor }, mapColors);
previewLayer(layerDescriptor);
};
return <MVTSingleLayerVectorSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,

View file

@ -7,7 +7,6 @@
import { i18n } from '@kbn/i18n';
import uuid from 'uuid/v4';
import { AbstractSource, ImmutableSourceProperty } from '../source';
import { TiledVectorLayer } from '../../tiled_vector_layer';
import { GeoJsonWithMeta, ITiledSingleLayerVectorSource } from '../vector_source';
import { MAX_ZOOM, MIN_ZOOM, SOURCE_TYPES } from '../../../../common/constants';
import { VECTOR_SHAPE_TYPES } from '../vector_feature_types';
@ -17,11 +16,10 @@ import { getDataSourceLabel, getUrlLabel } from '../../../../common/i18n_getters
import {
MapExtent,
TiledSingleLayerVectorSourceDescriptor,
VectorLayerDescriptor,
VectorSourceRequestMeta,
VectorSourceSyncMeta,
} from '../../../../common/descriptor_types';
import { VectorLayerArguments } from '../../vector_layer';
import { MVTSingleLayerVectorSourceConfig } from './mvt_single_layer_vector_source_editor';
export const sourceTitle = i18n.translate(
'xpack.maps.source.MVTSingleLayerVectorSource.sourceTitle',
@ -37,7 +35,7 @@ export class MVTSingleLayerVectorSource extends AbstractSource
layerName,
minSourceZoom,
maxSourceZoom,
}: TiledSingleLayerVectorSourceDescriptor) {
}: MVTSingleLayerVectorSourceConfig) {
return {
type: SOURCE_TYPES.MVT_SINGLE_LAYER,
id: uuid(),
@ -66,22 +64,6 @@ export class MVTSingleLayerVectorSource extends AbstractSource
return [];
}
createDefaultLayer(options?: Partial<VectorLayerDescriptor>): TiledVectorLayer {
const layerDescriptor: Partial<VectorLayerDescriptor> = {
sourceDescriptor: this._descriptor,
...options,
};
const normalizedLayerDescriptor: VectorLayerDescriptor = TiledVectorLayer.createDescriptor(
layerDescriptor,
[]
);
const vectorLayerArguments: VectorLayerArguments = {
layerDescriptor: normalizedLayerDescriptor,
source: this,
};
return new TiledVectorLayer(vectorLayerArguments);
}
getGeoJsonWithMeta(
layerName: 'string',
searchFilters: unknown[],

View file

@ -13,8 +13,7 @@ import { Adapters } from 'src/plugins/inspector/public';
// @ts-ignore
import { copyPersistentState } from '../../reducers/util';
import { LayerDescriptor, SourceDescriptor } from '../../../common/descriptor_types';
import { ILayer } from '../layer';
import { SourceDescriptor } from '../../../common/descriptor_types';
import { IField } from '../fields/field';
import { MAX_ZOOM, MIN_ZOOM } from '../../../common/constants';
@ -37,7 +36,6 @@ export type PreIndexedShape = {
export type FieldFormatter = (value: string | number | null | undefined | boolean) => string;
export interface ISource {
createDefaultLayer(options?: Partial<LayerDescriptor>): ILayer;
destroy(): void;
getDisplayName(): Promise<string>;
getInspectorAdapters(): Adapters | undefined;
@ -59,7 +57,6 @@ export interface ISource {
getIndexPatternIds(): string[];
getQueryableIndexPatternIds(): string[];
getGeoGridPrecision(zoom: number): number;
shouldBeIndexed(): boolean;
getPreIndexedShape(): Promise<PreIndexedShape | null>;
createFieldFormatter(field: IField): Promise<FieldFormatter | null>;
getValueSuggestions(field: IField, query: string): Promise<string[]>;
@ -99,10 +96,6 @@ export class AbstractSource implements ISource {
return this._inspectorAdapters;
}
createDefaultLayer(options?: Partial<LayerDescriptor>): ILayer {
throw new Error(`Source#createDefaultLayer not implemented`);
}
async getDisplayName(): Promise<string> {
return '';
}
@ -155,10 +148,6 @@ export class AbstractSource implements ISource {
return false;
}
shouldBeIndexed(): boolean {
return false;
}
isESSource(): boolean {
return false;
}

View file

@ -4,9 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { VectorLayer } from '../../vector_layer';
import { TooltipProperty } from '../../tooltips/tooltip_property';
import { VectorStyle } from '../../styles/vector/vector_style';
import { AbstractSource } from './../source';
import * as topojson from 'topojson-client';
import _ from 'lodash';
@ -74,30 +72,10 @@ export class AbstractVectorSource extends AbstractSource {
return this.createField({ fieldName: name });
}
_createDefaultLayerDescriptor(options, mapColors) {
return VectorLayer.createDescriptor(
{
sourceDescriptor: this._descriptor,
...options,
},
mapColors
);
}
_getTooltipPropertyNames() {
return this._tooltipFields.map(field => field.getName());
}
createDefaultLayer(options, mapColors) {
const layerDescriptor = this._createDefaultLayerDescriptor(options, mapColors);
const style = new VectorStyle(layerDescriptor.style, this);
return new VectorLayer({
layerDescriptor: layerDescriptor,
source: this,
style,
});
}
isFilterByMapBounds() {
return false;
}

View file

@ -4,4 +4,5 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { WMSSource, wmsLayerWizardConfig } from './wms_source';
export { wmsLayerWizardConfig } from './wms_layer_wizard';
export { WMSSource } from './wms_source';

View file

@ -0,0 +1,36 @@
/*
* 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 React from 'react';
import { i18n } from '@kbn/i18n';
// @ts-ignore
import { WMSCreateSourceEditor } from './wms_create_source_editor';
// @ts-ignore
import { sourceTitle, WMSSource } from './wms_source';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
import { TileLayer } from '../../tile_layer';
export const wmsLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.wmsDescription', {
defaultMessage: 'Maps from OGC Standard WMS',
}),
icon: 'grid',
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: unknown) => {
if (!sourceConfig) {
previewLayer(null);
return;
}
const layerDescriptor = TileLayer.createDescriptor({
sourceDescriptor: WMSSource.createDescriptor(sourceConfig),
});
previewLayer(layerDescriptor);
};
return <WMSCreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -4,18 +4,14 @@
* you may not use this file except in compliance with the Elastic License.
*/
import React from 'react';
import { AbstractTMSSource } from '../tms_source';
import { TileLayer } from '../../tile_layer';
import { WMSCreateSourceEditor } from './wms_create_source_editor';
import { i18n } from '@kbn/i18n';
import { getDataSourceLabel, getUrlLabel } from '../../../../common/i18n_getters';
import { WmsClient } from './wms_client';
import { SOURCE_TYPES } from '../../../../common/constants';
import { registerSource } from '../source_registry';
const sourceTitle = i18n.translate('xpack.maps.source.wmsTitle', {
export const sourceTitle = i18n.translate('xpack.maps.source.wmsTitle', {
defaultMessage: 'Web Map Service',
});
@ -52,20 +48,6 @@ export class WMSSource extends AbstractTMSSource {
];
}
_createDefaultLayerDescriptor(options) {
return TileLayer.createDescriptor({
sourceDescriptor: this._descriptor,
...options,
});
}
createDefaultLayer(options) {
return new TileLayer({
layerDescriptor: this._createDefaultLayerDescriptor(options),
source: this,
});
}
async getDisplayName() {
return this._descriptor.serviceUrl;
}
@ -94,24 +76,3 @@ registerSource({
ConstructorFunction: WMSSource,
type: SOURCE_TYPES.WMS,
});
export const wmsLayerWizardConfig = {
description: i18n.translate('xpack.maps.source.wmsDescription', {
defaultMessage: 'Maps from OGC Standard WMS',
}),
icon: 'grid',
renderWizard: ({ onPreviewSource, inspectorAdapters }) => {
const onSourceConfigChange = sourceConfig => {
if (!sourceConfig) {
onPreviewSource(null);
return;
}
const sourceDescriptor = WMSSource.createDescriptor(sourceConfig);
const source = new WMSSource(sourceDescriptor, inspectorAdapters);
onPreviewSource(source);
};
return <WMSCreateSourceEditor onSourceConfigChange={onSourceConfigChange} />;
},
title: sourceTitle,
};

View file

@ -9,17 +9,19 @@ import React from 'react';
import { XYZTMSEditor, XYZTMSSourceConfig } from './xyz_tms_editor';
import { XYZTMSSource, sourceTitle } from './xyz_tms_source';
import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry';
import { TileLayer } from '../../tile_layer';
export const tmsLayerWizardConfig: LayerWizard = {
description: i18n.translate('xpack.maps.source.ems_xyzDescription', {
defaultMessage: 'Tile map service configured in interface',
}),
icon: 'grid',
renderWizard: ({ onPreviewSource }: RenderWizardArguments) => {
renderWizard: ({ previewLayer }: RenderWizardArguments) => {
const onSourceConfigChange = (sourceConfig: XYZTMSSourceConfig) => {
const sourceDescriptor = XYZTMSSource.createDescriptor(sourceConfig);
const source = new XYZTMSSource(sourceDescriptor);
onPreviewSource(source);
const layerDescriptor = TileLayer.createDescriptor({
sourceDescriptor: XYZTMSSource.createDescriptor(sourceConfig),
});
previewLayer(layerDescriptor);
};
return <XYZTMSEditor onSourceConfigChange={onSourceConfigChange} />;
},

View file

@ -5,8 +5,6 @@
*/
import { XYZTMSSource } from './xyz_tms_source';
import { ILayer } from '../../layer';
import { TileLayer } from '../../tile_layer';
import { SOURCE_TYPES } from '../../../../common/constants';
import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types';
@ -16,12 +14,6 @@ const descriptor: XYZTMSSourceDescriptor = {
id: 'foobar',
};
describe('xyz Tilemap Source', () => {
it('should create a tile-layer', () => {
const source = new XYZTMSSource(descriptor);
const layer: ILayer = source.createDefaultLayer();
expect(layer instanceof TileLayer).toEqual(true);
});
it('should echo url template for url template', async () => {
const source = new XYZTMSSource(descriptor);
const template = await source.getUrlTemplate();

View file

@ -5,15 +5,13 @@
*/
import { i18n } from '@kbn/i18n';
import { TileLayer } from '../../tile_layer';
import { getDataSourceLabel, getUrlLabel } from '../../../../common/i18n_getters';
import { SOURCE_TYPES } from '../../../../common/constants';
import { registerSource } from '../source_registry';
import { AbstractTMSSource } from '../tms_source';
import { LayerDescriptor, XYZTMSSourceDescriptor } from '../../../../common/descriptor_types';
import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types';
import { Attribution, ImmutableSourceProperty } from '../source';
import { XYZTMSSourceConfig } from './xyz_tms_editor';
import { ILayer } from '../../layer';
export const sourceTitle = i18n.translate('xpack.maps.source.ems_xyzTitle', {
defaultMessage: 'Tile Map Service',
@ -49,17 +47,6 @@ export class XYZTMSSource extends AbstractTMSSource {
];
}
createDefaultLayer(options?: LayerDescriptor): ILayer {
const layerDescriptor: LayerDescriptor = TileLayer.createDescriptor({
sourceDescriptor: this._descriptor,
...options,
});
return new TileLayer({
layerDescriptor,
source: this,
});
}
async getDisplayName(): Promise<string> {
return this._descriptor.urlTemplate;
}

View file

@ -23,9 +23,6 @@ class MockTileSource extends AbstractTMSSource implements ITMSSource {
super(descriptor, {});
this._descriptor = descriptor;
}
createDefaultLayer(): ILayer {
throw new Error('not implemented');
}
async getDisplayName(): Promise<string> {
return this._descriptor.urlTemplate;

View file

@ -8819,10 +8819,8 @@
"xpack.logstash.workersTooltip": "パイプラインのフィルターとアウトプットステージを同時に実行するワーカーの数です。イベントが詰まってしまう場合や CPU が飽和状態ではない場合は、マシンの処理能力をより有効に活用するため、この数字を上げてみてください。\n\nデフォルト値:ホストの CPU コア数です",
"xpack.maps.addLayerPanel.addLayer": "レイヤーを追加",
"xpack.maps.addLayerPanel.changeDataSourceButtonLabel": "データソースを変更",
"xpack.maps.addLayerPanel.chooseDataSourceTitle": "データソースの選択",
"xpack.maps.addLayerPanel.footer.cancelButtonLabel": "キャンセル",
"xpack.maps.addLayerPanel.importFile": "ファイルのインポート",
"xpack.maps.addLayerPanel.selectSource": "ソースを選択",
"xpack.maps.aggs.defaultCountLabel": "カウント",
"xpack.maps.appDescription": "マップアプリケーション",
"xpack.maps.appTitle": "マップ",

View file

@ -8822,10 +8822,8 @@
"xpack.logstash.workersTooltip": "并行执行管道的筛选和输出阶段的工作线程数目。如果您发现事件出现积压或 CPU 未饱和,请考虑增大此数值,以更好地利用机器处理能力。\n\n默认值主机的 CPU 核心数",
"xpack.maps.addLayerPanel.addLayer": "添加图层",
"xpack.maps.addLayerPanel.changeDataSourceButtonLabel": "更改数据源",
"xpack.maps.addLayerPanel.chooseDataSourceTitle": "选择数据源",
"xpack.maps.addLayerPanel.footer.cancelButtonLabel": "鍙栨秷",
"xpack.maps.addLayerPanel.importFile": "导入文件",
"xpack.maps.addLayerPanel.selectSource": "选择源",
"xpack.maps.aggs.defaultCountLabel": "计数",
"xpack.maps.appDescription": "地图应用程序",
"xpack.maps.appTitle": "Maps",