diff --git a/modules/editable-layers/src/edit-modes/modify-mode.ts b/modules/editable-layers/src/edit-modes/modify-mode.ts index 72f84e61..de87f373 100644 --- a/modules/editable-layers/src/edit-modes/modify-mode.ts +++ b/modules/editable-layers/src/edit-modes/modify-mode.ts @@ -284,7 +284,7 @@ export class ModifyMode extends GeoJsonEditMode { handleStopDragging(event: StopDraggingEvent, props: ModeProps) { const selectedFeatureIndexes = props.selectedIndexes; - const editHandle = getPickedEditHandle(event.picks); + const editHandle = getPickedEditHandle(event.pointerDownPicks); if (selectedFeatureIndexes.length && editHandle) { this._dragEditHandle('finishMovePosition', props, editHandle, event); } diff --git a/modules/editable-layers/test/edit-modes/lib/__snapshots__/modify-mode.spec.ts.snap b/modules/editable-layers/test/edit-modes/lib/__snapshots__/modify-mode.spec.ts.snap index 0fd45016..1fd5c162 100644 --- a/modules/editable-layers/test/edit-modes/lib/__snapshots__/modify-mode.spec.ts.snap +++ b/modules/editable-layers/test/edit-modes/lib/__snapshots__/modify-mode.spec.ts.snap @@ -1,5 +1,91 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`Correct coordinate edited when stopping near another guide 1`] = ` +{ + "features": [ + { + "geometry": { + "coordinates": [ + 1, + 2, + ], + "type": "Point", + }, + "properties": { + "editHandleType": "existing", + "featureIndex": 0, + "guideType": "editHandle", + "positionIndexes": [ + 0, + ], + }, + "type": "Feature", + }, + { + "geometry": { + "coordinates": [ + 2, + 3, + ], + "type": "Point", + }, + "properties": { + "editHandleType": "existing", + "featureIndex": 0, + "guideType": "editHandle", + "positionIndexes": [ + 1, + ], + }, + "type": "Feature", + }, + { + "geometry": { + "coordinates": [ + 3, + 4, + ], + "type": "Point", + }, + "properties": { + "editHandleType": "existing", + "featureIndex": 0, + "guideType": "editHandle", + "positionIndexes": [ + 2, + ], + }, + "type": "Feature", + }, + ], + "type": "FeatureCollection", +} +`; + +exports[`Correct coordinate edited when stopping near another guide 2`] = ` +{ + "geometry": { + "coordinates": [ + [ + 3.1, + 4.1, + ], + [ + 2, + 3, + ], + [ + 3, + 4, + ], + ], + "type": "LineString", + }, + "properties": {}, + "type": "Feature", +} +`; + exports[`Rectangular polygon feature preserves shape 1`] = ` { "features": [ diff --git a/modules/editable-layers/test/edit-modes/lib/modify-mode.spec.ts b/modules/editable-layers/test/edit-modes/lib/modify-mode.spec.ts index 87cc993d..11671e4d 100644 --- a/modules/editable-layers/test/edit-modes/lib/modify-mode.spec.ts +++ b/modules/editable-layers/test/edit-modes/lib/modify-mode.spec.ts @@ -168,7 +168,7 @@ const mockMove = (mode, picks: Pick[], props: ModeProps) => { const startDragEvent = createStartDraggingEvent([100, 100], [100, 100], picks); mode.handleStartDragging(startDragEvent, props); - const stopDragEvent = createStopDraggingEvent([110, 115], [100, 100], picks); + const stopDragEvent = createStopDraggingEvent([110, 115], [100, 100], picks, picks); mode.handleStopDragging(stopDragEvent, props); }; @@ -199,6 +199,47 @@ test('Rectangular polygon feature preserves shape', () => { expect(props.data.features[0]).not.toEqual(movedFeature); }); +test('Correct coordinate edited when stopping near another guide', () => { + const mockOnEdit = vi.fn(); + const props = createFeatureCollectionProps({ + data: { + type: 'FeatureCollection', + features: [lineStringFeature] + } as FeatureCollection, + selectedIndexes: [0], + onEdit: mockOnEdit + }); + + const mode = new ModifyMode(); + const guides = mode.getGuides(props); + expect(guides).toMatchSnapshot(); + + const dragStart = [1, 2]; + const dragEnd = [3.1, 4.1]; + + const pointerDownPicks = [ + { index: 0, isGuide: true, object: guides.features[0] }, + { index: 0, object: lineStringFeature } + ]; + + const stopDragPicks = [ + { index: 2, isGuide: true, object: guides.features[2] }, // simulate another guide being picked + { index: 0, isGuide: true, object: guides.features[0] }, + { index: 0, object: lineStringFeature } + ]; + + const startDragEvent = createStartDraggingEvent(dragStart, dragStart, pointerDownPicks); + mode.handleStartDragging(startDragEvent, props); + + const stopDragEvent = createStopDraggingEvent(dragEnd, dragStart, stopDragPicks, pointerDownPicks); + mode.handleStopDragging(stopDragEvent, props); + + expect(mockOnEdit).toHaveBeenCalledTimes(1); + + const editedFeature = mockOnEdit.mock.calls[0][0].updatedData.features[0]; + expect(editedFeature).toMatchSnapshot(); +}); + describe('getGuides()', () => { it('gets edit handles for Point', () => { const mode = new ModifyMode(); diff --git a/modules/editable-layers/test/edit-modes/test-utils.ts b/modules/editable-layers/test/edit-modes/test-utils.ts index 0073caf4..2f5a8b7a 100644 --- a/modules/editable-layers/test/edit-modes/test-utils.ts +++ b/modules/editable-layers/test/edit-modes/test-utils.ts @@ -345,7 +345,8 @@ export function createStartDraggingEvent( export function createStopDraggingEvent( mapCoords: Position, pointerDownMapCoords: Position, - picks: Pick[] = [] + picks: Pick[] = [], + pointerDownPicks: Pick[] | null = null ): StopDraggingEvent { lastCoords = mapCoords; @@ -353,7 +354,7 @@ export function createStopDraggingEvent( screenCoords: [-1, -1], mapCoords, picks, - pointerDownPicks: null, + pointerDownPicks, pointerDownScreenCoords: [-1, -1], pointerDownMapCoords, sourceEvent: null