diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx index e7fa87435cf09..ebcd4e23c5375 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx @@ -43,8 +43,6 @@ import { syncGeojsonSourceData } from './geojson_source_data'; import { JoinState, performInnerJoins } from './perform_inner_joins'; import { buildVectorRequestMeta } from '../../build_vector_request_meta'; -export const SUPPORTS_FEATURE_EDITING_REQUEST_ID = 'SUPPORTS_FEATURE_EDITING_REQUEST_ID'; - export class GeoJsonVectorLayer extends AbstractVectorLayer { static createDescriptor( options: Partial, @@ -65,12 +63,6 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { return layerDescriptor; } - supportsFeatureEditing(): boolean { - const dataRequest = this.getDataRequest(SUPPORTS_FEATURE_EDITING_REQUEST_ID); - const data = dataRequest?.getData() as { supportsFeatureEditing: boolean } | undefined; - return data ? data.supportsFeatureEditing : false; - } - async getBounds(syncContext: DataRequestContext) { const isStaticLayer = !this.getSource().isBoundsAware(); return isStaticLayer || this.hasJoins() @@ -380,33 +372,6 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { }); } - async _syncSupportsFeatureEditing({ - syncContext, - source, - }: { - syncContext: DataRequestContext; - source: IVectorSource; - }) { - if (syncContext.dataFilters.isReadOnly) { - return; - } - const { startLoading, stopLoading, onLoadError } = syncContext; - const dataRequestId = SUPPORTS_FEATURE_EDITING_REQUEST_ID; - const requestToken = Symbol(`layer-${this.getId()}-${dataRequestId}`); - const prevDataRequest = this.getDataRequest(dataRequestId); - if (prevDataRequest) { - return; - } - try { - startLoading(dataRequestId, requestToken); - const supportsFeatureEditing = await source.supportsFeatureEditing(); - stopLoading(dataRequestId, requestToken, { supportsFeatureEditing }); - } catch (error) { - onLoadError(dataRequestId, requestToken, error.message); - throw error; - } - } - _getSourceFeatureCollection() { const sourceDataRequest = this.getSourceDataRequest(); return sourceDataRequest ? (sourceDataRequest.getData() as FeatureCollection) : null; diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts index e56884298a0b6..4b45adc8848bd 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts @@ -118,6 +118,47 @@ describe('syncMvtSourceData', () => { sinon.assert.notCalled(syncContext.stopLoading); }); + test('Should re-sync with forceRefreshDueToDrawing when there are no changes in source state or search state', async () => { + const syncContext = { + ...new MockSyncContext({ dataFilters: {} }), + forceRefreshDueToDrawing: true, + }; + const prevRequestMeta = { + ...syncContext.dataFilters, + applyGlobalQuery: true, + applyGlobalTime: true, + applyForceRefresh: true, + fieldNames: [], + sourceMeta: {}, + isForceRefresh: false, + }; + + await syncMvtSourceData({ + layerId: 'layer1', + prevDataRequest: { + getMeta: () => { + return prevRequestMeta; + }, + getData: () => { + return { + tileMinZoom: 4, + tileMaxZoom: 14, + tileSourceLayer: 'aggs', + tileUrl: 'https://example.com/{x}/{y}/{z}.pbf?token=12345', + refreshToken: '12345', + }; + }, + } as unknown as DataRequest, + requestMeta: { ...prevRequestMeta }, + source: mockSource, + syncContext, + }); + // @ts-expect-error + sinon.assert.calledOnce(syncContext.startLoading); + // @ts-expect-error + sinon.assert.calledOnce(syncContext.stopLoading); + }); + test('Should re-sync when there are changes to search state', async () => { const syncContext = new MockSyncContext({ dataFilters: {} }); const prevRequestMeta = { diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts index 5d4008fc19220..f20ab0b5d200f 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts @@ -53,7 +53,8 @@ export async function syncMvtSourceData({ return true; }, }); - const canSkip = noChangesInSourceState && noChangesInSearchState; + const canSkip = + !syncContext.forceRefreshDueToDrawing && noChangesInSourceState && noChangesInSearchState; if (canSkip) { return; @@ -63,7 +64,9 @@ export async function syncMvtSourceData({ syncContext.startLoading(SOURCE_DATA_REQUEST_ID, requestToken, requestMeta); try { const refreshToken = - !prevData || (requestMeta.isForceRefresh && requestMeta.applyForceRefresh) + !prevData || + syncContext.forceRefreshDueToDrawing || + (requestMeta.isForceRefresh && requestMeta.applyForceRefresh) ? uuid() : prevData.refreshToken; diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx index 796f37d4ce915..5947013dc39f1 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx @@ -189,6 +189,7 @@ export class MvtVectorLayer extends AbstractVectorLayer { } await this._syncSourceStyleMeta(syncContext, this.getSource(), this.getCurrentStyle()); await this._syncSourceFormatters(syncContext, this.getSource(), this.getCurrentStyle()); + await this._syncSupportsFeatureEditing({ syncContext, source: this.getSource() }); await syncMvtSourceData({ layerId: this.getId(), diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx index 0384517bf9834..b8b90fdf75ff4 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx @@ -60,6 +60,8 @@ import { buildVectorRequestMeta } from '../build_vector_request_meta'; import { getJoinAggKey } from '../../../../common/get_agg_key'; import { syncBoundsData } from './bounds_data'; +const SUPPORTS_FEATURE_EDITING_REQUEST_ID = 'SUPPORTS_FEATURE_EDITING_REQUEST_ID'; + export function isVectorLayer(layer: ILayer) { return (layer as IVectorLayer).canShowTooltip !== undefined; } @@ -242,7 +244,9 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { } supportsFeatureEditing(): boolean { - return false; + const dataRequest = this.getDataRequest(SUPPORTS_FEATURE_EDITING_REQUEST_ID); + const data = dataRequest?.getData() as { supportsFeatureEditing: boolean } | undefined; + return data ? data.supportsFeatureEditing : false; } hasJoins() { @@ -522,6 +526,33 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { } } + async _syncSupportsFeatureEditing({ + syncContext, + source, + }: { + syncContext: DataRequestContext; + source: IVectorSource; + }) { + if (syncContext.dataFilters.isReadOnly) { + return; + } + const { startLoading, stopLoading, onLoadError } = syncContext; + const dataRequestId = SUPPORTS_FEATURE_EDITING_REQUEST_ID; + const requestToken = Symbol(`layer-${this.getId()}-${dataRequestId}`); + const prevDataRequest = this.getDataRequest(dataRequestId); + if (prevDataRequest) { + return; + } + try { + startLoading(dataRequestId, requestToken); + const supportsFeatureEditing = await source.supportsFeatureEditing(); + stopLoading(dataRequestId, requestToken, { supportsFeatureEditing }); + } catch (error) { + onLoadError(dataRequestId, requestToken, error.message); + throw error; + } + } + _setMbPointsProperties( mbMap: MbMap, mvtSourceLayer?: string,