@reltio/components 1.4.2256 → 1.4.2258

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/AttributesView/AttributesView.test.js +8 -2
  2. package/EditModeAttributesPager/components/SpecialRenderer/SpecialRenderer.js +5 -2
  3. package/ReltioMap/ReltioMap.d.ts +5 -8
  4. package/ReltioMap/ReltioMap.js +31 -39
  5. package/ReltioMap/ReltioMap.spec.js +299 -104
  6. package/ReltioMap/components/ClusteredMarkers/ClusteredMarkers.d.ts +2 -1
  7. package/ReltioMap/components/ClusteredMarkers/ClusteredMarkers.js +11 -13
  8. package/ReltioMap/components/EntityMarker/EntityMarker.d.ts +2 -1
  9. package/ReltioMap/components/EntityMarker/EntityMarker.js +3 -3
  10. package/ReltioMap/components/PolygonDrawing/PolygonDrawing.d.ts +4 -0
  11. package/ReltioMap/components/PolygonDrawing/PolygonDrawing.js +18 -0
  12. package/ReltioMap/components/PolygonDrawing/crosshair.inline.svg.d.ts +1 -0
  13. package/ReltioMap/components/PolygonDrawing/crosshair.inline.svg.js +1 -0
  14. package/ReltioMap/components/PolygonDrawing/index.d.ts +2 -0
  15. package/ReltioMap/components/PolygonDrawing/index.js +2 -0
  16. package/ReltioMap/components/PolygonDrawing/polygonRingHelpers.d.ts +5 -0
  17. package/ReltioMap/components/PolygonDrawing/polygonRingHelpers.js +43 -0
  18. package/ReltioMap/components/PolygonDrawing/useDrawingCursors.d.ts +6 -0
  19. package/ReltioMap/components/PolygonDrawing/useDrawingCursors.js +87 -0
  20. package/ReltioMap/components/PolygonDrawing/usePolygonDrawing.d.ts +9 -0
  21. package/ReltioMap/components/PolygonDrawing/usePolygonDrawing.js +197 -0
  22. package/ReltioMap/components/PolygonDrawing/usePreviewPolylines.d.ts +7 -0
  23. package/ReltioMap/components/PolygonDrawing/usePreviewPolylines.js +38 -0
  24. package/ReltioMap/components/PolygonDrawing/useVertexHandles.d.ts +14 -0
  25. package/ReltioMap/components/PolygonDrawing/useVertexHandles.js +85 -0
  26. package/ReltioMap/components/TopRightMapControls/TopRightMapControls.d.ts +3 -3
  27. package/ReltioMap/components/TopRightMapControls/TopRightMapControls.js +4 -18
  28. package/ReltioMap/helpers.d.ts +2 -1
  29. package/ReltioMap/helpers.js +3 -11
  30. package/ReltioMap/types.d.ts +2 -2
  31. package/cjs/AttributesView/AttributesView.test.js +8 -2
  32. package/cjs/EditModeAttributesPager/components/SpecialRenderer/SpecialRenderer.js +4 -1
  33. package/cjs/ReltioMap/ReltioMap.d.ts +5 -8
  34. package/cjs/ReltioMap/ReltioMap.js +29 -37
  35. package/cjs/ReltioMap/ReltioMap.spec.js +298 -103
  36. package/cjs/ReltioMap/components/ClusteredMarkers/ClusteredMarkers.d.ts +2 -1
  37. package/cjs/ReltioMap/components/ClusteredMarkers/ClusteredMarkers.js +11 -13
  38. package/cjs/ReltioMap/components/EntityMarker/EntityMarker.d.ts +2 -1
  39. package/cjs/ReltioMap/components/EntityMarker/EntityMarker.js +3 -3
  40. package/cjs/ReltioMap/components/PolygonDrawing/PolygonDrawing.d.ts +4 -0
  41. package/cjs/ReltioMap/components/PolygonDrawing/PolygonDrawing.js +22 -0
  42. package/cjs/ReltioMap/components/PolygonDrawing/crosshair.inline.svg.d.ts +1 -0
  43. package/cjs/ReltioMap/components/PolygonDrawing/crosshair.inline.svg.js +4 -0
  44. package/cjs/ReltioMap/components/PolygonDrawing/index.d.ts +2 -0
  45. package/cjs/ReltioMap/components/PolygonDrawing/index.js +7 -0
  46. package/cjs/ReltioMap/components/PolygonDrawing/polygonRingHelpers.d.ts +5 -0
  47. package/cjs/ReltioMap/components/PolygonDrawing/polygonRingHelpers.js +50 -0
  48. package/cjs/ReltioMap/components/PolygonDrawing/useDrawingCursors.d.ts +6 -0
  49. package/cjs/ReltioMap/components/PolygonDrawing/useDrawingCursors.js +91 -0
  50. package/cjs/ReltioMap/components/PolygonDrawing/usePolygonDrawing.d.ts +9 -0
  51. package/cjs/ReltioMap/components/PolygonDrawing/usePolygonDrawing.js +202 -0
  52. package/cjs/ReltioMap/components/PolygonDrawing/usePreviewPolylines.d.ts +7 -0
  53. package/cjs/ReltioMap/components/PolygonDrawing/usePreviewPolylines.js +42 -0
  54. package/cjs/ReltioMap/components/PolygonDrawing/useVertexHandles.d.ts +14 -0
  55. package/cjs/ReltioMap/components/PolygonDrawing/useVertexHandles.js +89 -0
  56. package/cjs/ReltioMap/components/TopRightMapControls/TopRightMapControls.d.ts +3 -3
  57. package/cjs/ReltioMap/components/TopRightMapControls/TopRightMapControls.js +3 -17
  58. package/cjs/ReltioMap/helpers.d.ts +2 -1
  59. package/cjs/ReltioMap/helpers.js +8 -15
  60. package/cjs/ReltioMap/types.d.ts +2 -2
  61. package/cjs/constants/index.d.ts +1 -1
  62. package/cjs/constants/index.js +2 -2
  63. package/cjs/constants/map.d.ts +1 -2
  64. package/cjs/constants/map.js +2 -5
  65. package/cjs/features/workflow/AddWorkflowDialog/styles.d.ts +1 -1
  66. package/cjs/icons/index.d.ts +0 -1
  67. package/cjs/icons/index.js +2 -4
  68. package/constants/index.d.ts +1 -1
  69. package/constants/index.js +1 -1
  70. package/constants/map.d.ts +1 -2
  71. package/constants/map.js +1 -4
  72. package/features/workflow/AddWorkflowDialog/styles.d.ts +1 -1
  73. package/icons/index.d.ts +0 -1
  74. package/icons/index.js +0 -1
  75. package/package.json +2 -2
  76. package/ReltioMap/components/DrawingManager/DrawingManager.d.ts +0 -2
  77. package/ReltioMap/components/DrawingManager/DrawingManager.js +0 -5
  78. package/ReltioMap/components/DrawingManager/index.d.ts +0 -1
  79. package/ReltioMap/components/DrawingManager/index.js +0 -1
  80. package/ReltioMap/components/DrawingManager/useDrawingManager.d.ts +0 -7
  81. package/ReltioMap/components/DrawingManager/useDrawingManager.js +0 -36
  82. package/ReltioMap/googleMock.test-data.d.ts +0 -1
  83. package/ReltioMap/googleMock.test-data.js +0 -109
  84. package/cjs/ReltioMap/components/DrawingManager/DrawingManager.d.ts +0 -2
  85. package/cjs/ReltioMap/components/DrawingManager/DrawingManager.js +0 -9
  86. package/cjs/ReltioMap/components/DrawingManager/index.d.ts +0 -1
  87. package/cjs/ReltioMap/components/DrawingManager/index.js +0 -5
  88. package/cjs/ReltioMap/components/DrawingManager/useDrawingManager.d.ts +0 -7
  89. package/cjs/ReltioMap/components/DrawingManager/useDrawingManager.js +0 -40
  90. package/cjs/ReltioMap/googleMock.test-data.d.ts +0 -1
  91. package/cjs/ReltioMap/googleMock.test-data.js +0 -113
  92. package/cjs/icons/Radius.d.ts +0 -3
  93. package/cjs/icons/Radius.js +0 -22
  94. package/icons/Radius.d.ts +0 -3
  95. package/icons/Radius.js +0 -17
@@ -59,7 +59,8 @@ import { act, render, screen, waitFor } from '@testing-library/react';
59
59
  import userEvent from '@testing-library/user-event';
60
60
  import { findLast, last } from 'ramda';
61
61
  import { OverlayView, initialize, mockInstances, AdvancedMarkerElement, Map, Polygon } from '@googlemaps/jest-mocks';
62
- import { MAP_DRAWING_MODES } from '../constants';
62
+ import { POLYGON_DRAWING_MODE } from '../constants';
63
+ import { MAP_DRAWING_CROSSHAIR_CURSOR } from './components/PolygonDrawing/usePolygonDrawing';
63
64
  import * as helpers from './helpers';
64
65
  import { ReltioMap } from './ReltioMap';
65
66
  jest.mock('@vis.gl/react-google-maps', function () { return (__assign(__assign({}, jest.requireActual('@vis.gl/react-google-maps')), { MapControl: function (_a) {
@@ -81,8 +82,24 @@ describe('ReltioMap tests', function () {
81
82
  var user = userEvent.setup();
82
83
  return __assign(__assign({}, render(React.createElement(ReltioMap, __assign({}, props)))), { user: user });
83
84
  };
84
- var drawingManagerInstance;
85
- var drawingManagerConstructorSpy = jest.fn();
85
+ /**
86
+ * Map click payload: must expose lat()/lng() for serialization and equals() for polygonRingHelpers
87
+ */
88
+ var mapMouseEventWith = function (lat, lng) { return ({
89
+ latLng: {
90
+ lat: function () { return lat; },
91
+ lng: function () { return lng; },
92
+ equals: function (other) {
93
+ var oLat = typeof other.lat === 'function'
94
+ ? other.lat()
95
+ : other.lat;
96
+ var oLng = typeof other.lng === 'function'
97
+ ? other.lng()
98
+ : other.lng;
99
+ return oLat === lat && oLng === lng;
100
+ }
101
+ }
102
+ }); };
86
103
  beforeAll(function () {
87
104
  initialize();
88
105
  var OriginalMap = google.maps.Map;
@@ -91,32 +108,11 @@ describe('ReltioMap tests', function () {
91
108
  for (var _i = 0; _i < arguments.length; _i++) {
92
109
  args[_i] = arguments[_i];
93
110
  }
94
- return new (OriginalMap.bind.apply(OriginalMap, __spreadArray([void 0], args, false)))();
111
+ var mapInstance = new (OriginalMap.bind.apply(OriginalMap, __spreadArray([void 0], args, false)))();
112
+ mapInstance.setOptions = jest.fn();
113
+ mapInstance.get = jest.fn(function () { return undefined; });
114
+ return mapInstance;
95
115
  });
96
- global.google.maps.drawing.DrawingManager = /** @class */ (function () {
97
- function DrawingManager() {
98
- var args = [];
99
- for (var _i = 0; _i < arguments.length; _i++) {
100
- args[_i] = arguments[_i];
101
- }
102
- this.addListener = jest.fn();
103
- this.getDrawingMode = jest.fn();
104
- this.getMap = jest.fn();
105
- this.setDrawingMode = jest.fn();
106
- this.setMap = jest.fn();
107
- this.setOptions = jest.fn();
108
- drawingManagerConstructorSpy.apply(void 0, args);
109
- drawingManagerInstance = this;
110
- }
111
- return DrawingManager;
112
- }());
113
- global.google.maps.drawing.OverlayType = {
114
- CIRCLE: 'circle',
115
- MARKER: 'marker',
116
- POLYGON: 'polygon',
117
- POLYLINE: 'polyline',
118
- RECTANGLE: 'rectangle'
119
- };
120
116
  var overlayView = new OverlayView();
121
117
  for (var property in overlayView) {
122
118
  if (!global.google.maps.OverlayView.prototype.hasOwnProperty(property)) {
@@ -124,9 +120,6 @@ describe('ReltioMap tests', function () {
124
120
  }
125
121
  }
126
122
  });
127
- beforeEach(function () {
128
- drawingManagerInstance = null;
129
- });
130
123
  afterEach(function () {
131
124
  jest.clearAllMocks();
132
125
  mockInstances.clearAll();
@@ -142,13 +135,14 @@ describe('ReltioMap tests', function () {
142
135
  }, target.addListener.mock.calls)) === null || _b === void 0 ? void 0 : _b[1]);
143
136
  };
144
137
  var getLastInstance = function (instance) { return last(mockInstances.get(instance)); };
138
+ var getFirstInstance = function (instance) { var _a; return (_a = mockInstances.get(instance)) === null || _a === void 0 ? void 0 : _a[0]; };
145
139
  describe('general behaviour', function () {
146
140
  it('should render map controls', function () { return __awaiter(void 0, void 0, void 0, function () {
147
141
  var _a;
148
142
  return __generator(this, function (_b) {
149
143
  switch (_b.label) {
150
144
  case 0:
151
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON] }));
145
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true }));
152
146
  _a = expect;
153
147
  return [4 /*yield*/, screen.findByLabelText('Draw area')];
154
148
  case 1:
@@ -164,7 +158,7 @@ describe('ReltioMap tests', function () {
164
158
  switch (_a.label) {
165
159
  case 0:
166
160
  mapOptions = { mapTypeControl: true };
167
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], mapOptions: mapOptions }));
161
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, mapOptions: mapOptions }));
168
162
  return [4 /*yield*/, waitFor(function () {
169
163
  expect(google.maps.Map).toHaveBeenCalledWith(expect.any(HTMLElement), expect.objectContaining({
170
164
  fullscreenControl: false,
@@ -182,7 +176,7 @@ describe('ReltioMap tests', function () {
182
176
  return __generator(this, function (_a) {
183
177
  switch (_a.label) {
184
178
  case 0:
185
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], isSearchEnabled: false }));
179
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, isSearchEnabled: false }));
186
180
  return [4 /*yield*/, waitFor(function () {
187
181
  expect(screen.queryByLabelText('Draw area')).not.toBeInTheDocument();
188
182
  })];
@@ -208,7 +202,7 @@ describe('ReltioMap tests', function () {
208
202
  }
209
203
  ];
210
204
  onMarkerClick = jest.fn();
211
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], onMarkerClicked: onMarkerClick, markers: markers }));
205
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, onMarkerClicked: onMarkerClick, markers: markers }));
212
206
  return [4 /*yield*/, waitFor(function () {
213
207
  markerMock = getLastInstance(AdvancedMarkerElement);
214
208
  expect(markerMock).toBeDefined();
@@ -252,7 +246,7 @@ describe('ReltioMap tests', function () {
252
246
  });
253
247
  it('should fit map bounds correctly if markers loaded later than map and activeOverlay is not null', function () {
254
248
  var activeOverlay = {
255
- type: MAP_DRAWING_MODES.POLYGON,
249
+ type: POLYGON_DRAWING_MODE,
256
250
  path: [
257
251
  { lat: 1, lng: 1 },
258
252
  { lat: 2, lng: 2 }
@@ -313,7 +307,7 @@ describe('ReltioMap tests', function () {
313
307
  var fitMapBoundsForOverlay = jest.spyOn(helpers, 'fitMapBoundsForOverlay');
314
308
  var rerender = setUp(__assign(__assign({}, defaultProps), { activeOverlay: null })).rerender;
315
309
  var newProps = __assign(__assign({}, defaultProps), { activeOverlay: {
316
- type: MAP_DRAWING_MODES.POLYGON,
310
+ type: POLYGON_DRAWING_MODE,
317
311
  path: [
318
312
  { lat: 1, lng: 1 },
319
313
  { lat: 2, lng: 2 }
@@ -330,7 +324,7 @@ describe('ReltioMap tests', function () {
330
324
  var fitMapBoundsForOverlay = jest.spyOn(helpers, 'fitMapBoundsForOverlay');
331
325
  var rerender = setUp(__assign(__assign({}, defaultProps), { activeOverlay: null })).rerender;
332
326
  var newProps = __assign(__assign({}, defaultProps), { activeOverlay: {
333
- type: MAP_DRAWING_MODES.POLYGON,
327
+ type: POLYGON_DRAWING_MODE,
334
328
  path: [
335
329
  { lat: 1, lng: 1 },
336
330
  { lat: 2, lng: 2 }
@@ -381,16 +375,16 @@ describe('ReltioMap tests', function () {
381
375
  switch (_b.label) {
382
376
  case 0:
383
377
  activeOverlay = {
384
- type: MAP_DRAWING_MODES.POLYGON,
378
+ type: POLYGON_DRAWING_MODE,
385
379
  path: [
386
380
  { lat: 1, lng: 1 },
387
381
  { lat: 2, lng: 2 }
388
382
  ]
389
383
  };
390
- _a = setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], activeOverlay: activeOverlay })), user = _a.user, rerender = _a.rerender;
384
+ _a = setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, activeOverlay: activeOverlay })), user = _a.user, rerender = _a.rerender;
391
385
  polygon = getLastInstance(Polygon);
392
386
  expect(polygon.setOptions).toHaveBeenCalledWith(expect.objectContaining({ paths: activeOverlay.path }));
393
- newProps = __assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], activeOverlay: null });
387
+ newProps = __assign(__assign({}, defaultProps), { enablePolygonDrawing: true, activeOverlay: null });
394
388
  rerender(React.createElement(ReltioMap, __assign({}, newProps)));
395
389
  return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
396
390
  case 1:
@@ -400,16 +394,16 @@ describe('ReltioMap tests', function () {
400
394
  }
401
395
  });
402
396
  }); });
403
- it('should not render Polygon if "activeOverlay" prop is circle', function () { return __awaiter(void 0, void 0, void 0, function () {
397
+ it('should not render Polygon if "activeOverlay" is not a polygon', function () { return __awaiter(void 0, void 0, void 0, function () {
404
398
  var activeOverlay;
405
399
  return __generator(this, function (_a) {
406
400
  switch (_a.label) {
407
401
  case 0:
408
402
  activeOverlay = {
409
- type: MAP_DRAWING_MODES.CIRCLE,
403
+ type: 'bounds-rectangle',
410
404
  path: [{ lat: 1, lng: 1 }]
411
405
  };
412
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], activeOverlay: activeOverlay }));
406
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, activeOverlay: activeOverlay }));
413
407
  return [4 /*yield*/, waitFor(function () {
414
408
  expect(mockInstances.get(Polygon)).toHaveLength(0);
415
409
  })];
@@ -425,19 +419,19 @@ describe('ReltioMap tests', function () {
425
419
  switch (_a.label) {
426
420
  case 0:
427
421
  activeOverlay = {
428
- type: MAP_DRAWING_MODES.POLYGON,
422
+ type: POLYGON_DRAWING_MODE,
429
423
  path: [
430
424
  { lat: 1, lng: 1 },
431
425
  { lat: 2, lng: 2 }
432
426
  ]
433
427
  };
434
428
  onOverlayUpdated = jest.fn();
435
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], activeOverlay: activeOverlay, onOverlayUpdated: onOverlayUpdated }));
429
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, activeOverlay: activeOverlay, onOverlayUpdated: onOverlayUpdated }));
436
430
  polygon = getLastInstance(Polygon);
437
431
  getEventHandler(polygon, 'mouseup')();
438
432
  return [4 /*yield*/, waitFor(function () {
439
433
  expect(onOverlayUpdated).toHaveBeenCalledWith({
440
- type: MAP_DRAWING_MODES.POLYGON,
434
+ type: POLYGON_DRAWING_MODE,
441
435
  data: []
442
436
  });
443
437
  })];
@@ -454,19 +448,19 @@ describe('ReltioMap tests', function () {
454
448
  switch (_a.label) {
455
449
  case 0:
456
450
  activeOverlay = {
457
- type: MAP_DRAWING_MODES.POLYGON,
451
+ type: POLYGON_DRAWING_MODE,
458
452
  path: [
459
453
  { lat: 1, lng: 1 },
460
454
  { lat: 2, lng: 2 }
461
455
  ]
462
456
  };
463
457
  onOverlayUpdated = jest.fn();
464
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.POLYGON], activeOverlay: activeOverlay, onOverlayUpdated: onOverlayUpdated }));
458
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, activeOverlay: activeOverlay, onOverlayUpdated: onOverlayUpdated }));
465
459
  polygon = getLastInstance(Polygon);
466
460
  getEventHandler(polygon, 'dragend')();
467
461
  return [4 /*yield*/, waitFor(function () {
468
462
  expect(onOverlayUpdated).toHaveBeenCalledWith({
469
- type: MAP_DRAWING_MODES.POLYGON,
463
+ type: POLYGON_DRAWING_MODE,
470
464
  data: []
471
465
  });
472
466
  })];
@@ -479,46 +473,54 @@ describe('ReltioMap tests', function () {
479
473
  }); });
480
474
  });
481
475
  describe('drawing behavior', function () {
482
- it("shouldn't be in drawing mode by default", function () { return __awaiter(void 0, void 0, void 0, function () {
476
+ it("shouldn't enable double-click zoom suppression before entering draw mode", function () { return __awaiter(void 0, void 0, void 0, function () {
477
+ var mapMock;
483
478
  return __generator(this, function (_a) {
484
479
  switch (_a.label) {
485
480
  case 0:
486
- setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.CIRCLE] }));
487
- return [4 /*yield*/, waitFor(function () {
488
- expect(drawingManagerInstance).not.toBe(null);
489
- })];
481
+ setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true }));
482
+ return [4 /*yield*/, waitFor(function () { return getLastInstance(Map); })];
490
483
  case 1:
491
- _a.sent();
492
- expect(drawingManagerInstance.setDrawingMode).not.toHaveBeenCalledWith(MAP_DRAWING_MODES.CIRCLE);
484
+ mapMock = _a.sent();
485
+ expect(mapMock.setOptions).not.toHaveBeenCalledWith({ disableDoubleClickZoom: true });
493
486
  return [2 /*return*/];
494
487
  }
495
488
  });
496
489
  }); });
497
- it('should change drawing mode on map control action', function () { return __awaiter(void 0, void 0, void 0, function () {
498
- var user;
490
+ it('should toggle double-click zoom suppression when entering and leaving polygon drawing mode', function () { return __awaiter(void 0, void 0, void 0, function () {
491
+ var user, mapMock;
499
492
  return __generator(this, function (_a) {
500
493
  switch (_a.label) {
501
494
  case 0:
502
- user = setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.CIRCLE] })).user;
503
- return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
495
+ user = setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true })).user;
496
+ return [4 /*yield*/, waitFor(function () { return getLastInstance(Map); })];
504
497
  case 1:
498
+ mapMock = _a.sent();
499
+ return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
500
+ case 2:
505
501
  _a.sent();
506
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: MAP_DRAWING_MODES.CIRCLE }));
502
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({
503
+ draggableCursor: MAP_DRAWING_CROSSHAIR_CURSOR
504
+ }));
505
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({
506
+ disableDoubleClickZoom: true,
507
+ clickableIcons: false
508
+ }));
507
509
  return [4 /*yield*/, user.click(screen.getByLabelText('Clear area'))];
508
- case 2:
510
+ case 3:
509
511
  _a.sent();
510
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: null }));
512
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({ disableDoubleClickZoom: false }));
511
513
  return [2 /*return*/];
512
514
  }
513
515
  });
514
516
  }); });
515
- it("shouldn't render DrawingManager without drawingModes prop", function () { return __awaiter(void 0, void 0, void 0, function () {
517
+ it("shouldn't attach polygon drawing listeners when polygon drawing is disabled", function () { return __awaiter(void 0, void 0, void 0, function () {
516
518
  return __generator(this, function (_a) {
517
519
  switch (_a.label) {
518
520
  case 0:
519
521
  setUp(__assign({}, defaultProps));
520
522
  return [4 /*yield*/, waitFor(function () {
521
- expect(drawingManagerInstance).toBe(null);
523
+ expect(screen.queryByLabelText('Draw area')).not.toBeInTheDocument();
522
524
  })];
523
525
  case 1:
524
526
  _a.sent();
@@ -526,7 +528,7 @@ describe('ReltioMap tests', function () {
526
528
  }
527
529
  });
528
530
  }); });
529
- it("shouldn't render TopRightMapControls without drawingModes prop", function () { return __awaiter(void 0, void 0, void 0, function () {
531
+ it("shouldn't render TopRightMapControls when polygon drawing is disabled", function () { return __awaiter(void 0, void 0, void 0, function () {
530
532
  return __generator(this, function (_a) {
531
533
  switch (_a.label) {
532
534
  case 0:
@@ -541,38 +543,213 @@ describe('ReltioMap tests', function () {
541
543
  }
542
544
  });
543
545
  }); });
544
- it('should call props.onOverlayUpdated after polygon completing', function () { return __awaiter(void 0, void 0, void 0, function () {
545
- var onOverlayUpdated, user, overlay;
546
+ it('should call props.onOverlayUpdated after polygon completing with correct vertex coordinates', function () { return __awaiter(void 0, void 0, void 0, function () {
547
+ var onOverlayUpdated, OriginalPolygon, polygonPathSpy, user, mapMock, mapDiv, clickHandler;
546
548
  return __generator(this, function (_a) {
547
549
  switch (_a.label) {
548
550
  case 0:
549
551
  onOverlayUpdated = jest.fn();
550
- user = setUp(__assign(__assign({}, defaultProps), { onOverlayUpdated: onOverlayUpdated, drawingModes: [MAP_DRAWING_MODES.POLYGON] })).user;
552
+ OriginalPolygon = google.maps.Polygon;
553
+ polygonPathSpy = jest.spyOn(google.maps, 'Polygon').mockImplementation(function (opts) {
554
+ var instance = new OriginalPolygon(opts);
555
+ var raw = opts === null || opts === void 0 ? void 0 : opts.paths;
556
+ var ring = !raw
557
+ ? []
558
+ : 'getArray' in raw
559
+ ? raw.getArray()
560
+ : raw;
561
+ var mvc = new google.maps.MVCArray();
562
+ mvc.getArray = jest.fn(function () { return ring; });
563
+ instance.getPath = jest.fn(function () { return mvc; });
564
+ return instance;
565
+ });
566
+ user = setUp(__assign(__assign({}, defaultProps), { onOverlayUpdated: onOverlayUpdated, enablePolygonDrawing: true })).user;
567
+ return [4 /*yield*/, waitFor(function () {
568
+ var m = getLastInstance(Map);
569
+ if (!m) {
570
+ throw new Error('Map not ready');
571
+ }
572
+ return m;
573
+ })];
574
+ case 1:
575
+ mapMock = _a.sent();
576
+ mapDiv = document.createElement('div');
577
+ mapMock.getDiv = jest.fn(function () { return mapDiv; });
551
578
  return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
579
+ case 2:
580
+ _a.sent();
581
+ clickHandler = getEventHandler(mapMock, 'click');
582
+ act(function () {
583
+ clickHandler(mapMouseEventWith(1, 2));
584
+ clickHandler(mapMouseEventWith(3, 4));
585
+ clickHandler(mapMouseEventWith(5, 6));
586
+ });
587
+ act(function () {
588
+ mapDiv.dispatchEvent(new MouseEvent('dblclick', { bubbles: true, cancelable: true, composed: true }));
589
+ });
590
+ return [4 /*yield*/, waitFor(function () {
591
+ expect(onOverlayUpdated).toHaveBeenCalled();
592
+ })];
593
+ case 3:
594
+ _a.sent();
595
+ expect(onOverlayUpdated.mock.calls[0][0]).toEqual(expect.objectContaining({
596
+ type: POLYGON_DRAWING_MODE,
597
+ data: [
598
+ [1, 2],
599
+ [3, 4],
600
+ [5, 6]
601
+ ]
602
+ }));
603
+ polygonPathSpy.mockRestore();
604
+ return [2 /*return*/];
605
+ }
606
+ });
607
+ }); });
608
+ it('completes the ring when the first vertex marker is clicked after three map clicks', function () { return __awaiter(void 0, void 0, void 0, function () {
609
+ var onOverlayUpdated, OriginalPolygon, polygonPathSpy, user, mapMock, mapDiv, clickHandler, firstVertexMarker;
610
+ return __generator(this, function (_a) {
611
+ switch (_a.label) {
612
+ case 0:
613
+ onOverlayUpdated = jest.fn();
614
+ OriginalPolygon = google.maps.Polygon;
615
+ polygonPathSpy = jest.spyOn(google.maps, 'Polygon').mockImplementation(function (opts) {
616
+ var instance = new OriginalPolygon(opts);
617
+ var raw = opts === null || opts === void 0 ? void 0 : opts.paths;
618
+ var ring = !raw
619
+ ? []
620
+ : 'getArray' in raw
621
+ ? raw.getArray()
622
+ : raw;
623
+ var mvc = new google.maps.MVCArray();
624
+ mvc.getArray = jest.fn(function () { return ring; });
625
+ instance.getPath = jest.fn(function () { return mvc; });
626
+ return instance;
627
+ });
628
+ user = setUp(__assign(__assign({}, defaultProps), { onOverlayUpdated: onOverlayUpdated, enablePolygonDrawing: true })).user;
629
+ return [4 /*yield*/, waitFor(function () {
630
+ var m = getLastInstance(Map);
631
+ if (!m) {
632
+ throw new Error('Map not ready');
633
+ }
634
+ return m;
635
+ })];
552
636
  case 1:
637
+ mapMock = _a.sent();
638
+ mapDiv = document.createElement('div');
639
+ mapMock.getDiv = jest.fn(function () { return mapDiv; });
640
+ return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
641
+ case 2:
553
642
  _a.sent();
554
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: MAP_DRAWING_MODES.POLYGON }));
555
- overlay = {
556
- setMap: jest.fn(),
557
- getPath: function () { return ({
558
- getArray: function () { return [
559
- { lat: function () { return 1; }, lng: function () { return 2; } },
560
- { lat: function () { return 3; }, lng: function () { return 4; } }
561
- ]; }
562
- }); }
563
- };
643
+ clickHandler = getEventHandler(mapMock, 'click');
564
644
  act(function () {
565
- getEventHandler(drawingManagerInstance, 'polygoncomplete')(overlay);
645
+ clickHandler(mapMouseEventWith(1, 2));
646
+ clickHandler(mapMouseEventWith(3, 4));
647
+ clickHandler(mapMouseEventWith(5, 6));
566
648
  });
567
- expect(onOverlayUpdated).toHaveBeenCalledWith({
568
- type: MAP_DRAWING_MODES.POLYGON,
649
+ firstVertexMarker = getFirstInstance(AdvancedMarkerElement);
650
+ expect(firstVertexMarker).toBeDefined();
651
+ act(function () {
652
+ getEventHandler(firstVertexMarker, 'click')(__assign(__assign({}, mapMouseEventWith(0, 0)), { stop: jest.fn() }));
653
+ });
654
+ return [4 /*yield*/, waitFor(function () {
655
+ expect(onOverlayUpdated).toHaveBeenCalled();
656
+ })];
657
+ case 3:
658
+ _a.sent();
659
+ expect(onOverlayUpdated.mock.calls[0][0]).toEqual(expect.objectContaining({
660
+ type: POLYGON_DRAWING_MODE,
569
661
  data: [
570
662
  [1, 2],
571
- [3, 4]
663
+ [3, 4],
664
+ [5, 6]
572
665
  ]
666
+ }));
667
+ polygonPathSpy.mockRestore();
668
+ return [2 /*return*/];
669
+ }
670
+ });
671
+ }); });
672
+ it('clears the in-progress draw on map mouseleave so double-click does not complete a polygon', function () { return __awaiter(void 0, void 0, void 0, function () {
673
+ var onOverlayUpdated, user, mapMock, mapDiv, clickHandler;
674
+ return __generator(this, function (_a) {
675
+ switch (_a.label) {
676
+ case 0:
677
+ onOverlayUpdated = jest.fn();
678
+ user = setUp(__assign(__assign({}, defaultProps), { onOverlayUpdated: onOverlayUpdated, enablePolygonDrawing: true })).user;
679
+ return [4 /*yield*/, waitFor(function () { return getLastInstance(Map); })];
680
+ case 1:
681
+ mapMock = _a.sent();
682
+ mapDiv = document.createElement('div');
683
+ mapMock.getDiv = jest.fn(function () { return mapDiv; });
684
+ return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
685
+ case 2:
686
+ _a.sent();
687
+ clickHandler = getEventHandler(mapMock, 'click');
688
+ act(function () {
689
+ clickHandler(mapMouseEventWith(1, 2));
690
+ clickHandler(mapMouseEventWith(3, 4));
691
+ clickHandler(mapMouseEventWith(5, 6));
573
692
  });
574
- expect(overlay.setMap).toHaveBeenCalledWith(null);
575
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: null }));
693
+ act(function () {
694
+ mapDiv.dispatchEvent(new MouseEvent('mouseleave', { bubbles: true }));
695
+ });
696
+ act(function () {
697
+ mapDiv.dispatchEvent(new MouseEvent('dblclick', { bubbles: true, cancelable: true, composed: true }));
698
+ });
699
+ expect(onOverlayUpdated).not.toHaveBeenCalled();
700
+ return [2 /*return*/];
701
+ }
702
+ });
703
+ }); });
704
+ it('ignores a second double-click after completion until draw mode is toggled', function () { return __awaiter(void 0, void 0, void 0, function () {
705
+ var onOverlayUpdated, OriginalPolygon, polygonPathSpy, user, mapMock, mapDiv, clickHandler;
706
+ return __generator(this, function (_a) {
707
+ switch (_a.label) {
708
+ case 0:
709
+ onOverlayUpdated = jest.fn();
710
+ OriginalPolygon = google.maps.Polygon;
711
+ polygonPathSpy = jest.spyOn(google.maps, 'Polygon').mockImplementation(function (opts) {
712
+ var instance = new OriginalPolygon(opts);
713
+ var raw = opts === null || opts === void 0 ? void 0 : opts.paths;
714
+ var ring = !raw
715
+ ? []
716
+ : 'getArray' in raw
717
+ ? raw.getArray()
718
+ : raw;
719
+ var mvc = new google.maps.MVCArray();
720
+ mvc.getArray = jest.fn(function () { return ring; });
721
+ instance.getPath = jest.fn(function () { return mvc; });
722
+ return instance;
723
+ });
724
+ user = setUp(__assign(__assign({}, defaultProps), { onOverlayUpdated: onOverlayUpdated, enablePolygonDrawing: true })).user;
725
+ return [4 /*yield*/, waitFor(function () { return getLastInstance(Map); })];
726
+ case 1:
727
+ mapMock = _a.sent();
728
+ mapDiv = document.createElement('div');
729
+ mapMock.getDiv = jest.fn(function () { return mapDiv; });
730
+ return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
731
+ case 2:
732
+ _a.sent();
733
+ clickHandler = getEventHandler(mapMock, 'click');
734
+ act(function () {
735
+ clickHandler(mapMouseEventWith(1, 2));
736
+ clickHandler(mapMouseEventWith(3, 4));
737
+ clickHandler(mapMouseEventWith(5, 6));
738
+ });
739
+ act(function () {
740
+ mapDiv.dispatchEvent(new MouseEvent('dblclick', { bubbles: true, cancelable: true, composed: true }));
741
+ });
742
+ return [4 /*yield*/, waitFor(function () {
743
+ expect(onOverlayUpdated).toHaveBeenCalledTimes(1);
744
+ })];
745
+ case 3:
746
+ _a.sent();
747
+ onOverlayUpdated.mockClear();
748
+ act(function () {
749
+ mapDiv.dispatchEvent(new MouseEvent('dblclick', { bubbles: true, cancelable: true, composed: true }));
750
+ });
751
+ expect(onOverlayUpdated).not.toHaveBeenCalled();
752
+ polygonPathSpy.mockRestore();
576
753
  return [2 /*return*/];
577
754
  }
578
755
  });
@@ -584,13 +761,13 @@ describe('ReltioMap tests', function () {
584
761
  case 0:
585
762
  onOverlayUpdated = jest.fn();
586
763
  activeOverlay = {
587
- type: MAP_DRAWING_MODES.POLYGON,
764
+ type: POLYGON_DRAWING_MODE,
588
765
  path: [
589
766
  { lat: 1, lng: 1 },
590
767
  { lat: 2, lng: 2 }
591
768
  ]
592
769
  };
593
- user = setUp(__assign(__assign({}, defaultProps), { drawingModes: [MAP_DRAWING_MODES.CIRCLE], activeOverlay: activeOverlay, onOverlayUpdated: onOverlayUpdated })).user;
770
+ user = setUp(__assign(__assign({}, defaultProps), { enablePolygonDrawing: true, activeOverlay: activeOverlay, onOverlayUpdated: onOverlayUpdated })).user;
594
771
  return [4 /*yield*/, user.click(screen.getByLabelText('Clear area'))];
595
772
  case 1:
596
773
  _a.sent();
@@ -602,7 +779,7 @@ describe('ReltioMap tests', function () {
602
779
  });
603
780
  describe('"Search when I move the map" behavior', function () {
604
781
  it('should call props.onMapBoundsChanged with current map bounds and reset drawingMode on change isSearchOnMapMove(true)', function () { return __awaiter(void 0, void 0, void 0, function () {
605
- var onMapBoundsChanged, mapBoundsPolygon, user;
782
+ var onMapBoundsChanged, mapBoundsPolygon, user, mapMock;
606
783
  return __generator(this, function (_a) {
607
784
  switch (_a.label) {
608
785
  case 0:
@@ -611,39 +788,57 @@ describe('ReltioMap tests', function () {
611
788
  [1, 2],
612
789
  [3, 4]
613
790
  ];
614
- user = setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, drawingModes: [MAP_DRAWING_MODES.POLYGON] })).user;
791
+ user = setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, enablePolygonDrawing: true })).user;
615
792
  jest.spyOn(helpers, 'getMapBoundsPolygon').mockImplementation(function () { return mapBoundsPolygon; });
616
- return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
793
+ return [4 /*yield*/, waitFor(function () { return getLastInstance(Map); })];
617
794
  case 1:
795
+ mapMock = _a.sent();
796
+ return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
797
+ case 2:
618
798
  _a.sent();
619
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: MAP_DRAWING_MODES.POLYGON }));
799
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({
800
+ draggableCursor: MAP_DRAWING_CROSSHAIR_CURSOR
801
+ }));
802
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({
803
+ disableDoubleClickZoom: true,
804
+ clickableIcons: false
805
+ }));
620
806
  return [4 /*yield*/, user.click(screen.getByText('Search as I move the map'))];
621
- case 2:
807
+ case 3:
622
808
  _a.sent();
623
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: null }));
809
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({ disableDoubleClickZoom: false }));
624
810
  expect(onMapBoundsChanged).toHaveBeenCalledWith(mapBoundsPolygon);
625
811
  return [2 /*return*/];
626
812
  }
627
813
  });
628
814
  }); });
629
815
  it('should call props.onMapBoundsChanged with null on change isSearchOnMapMove(false)', function () { return __awaiter(void 0, void 0, void 0, function () {
630
- var onMapBoundsChanged, user;
816
+ var onMapBoundsChanged, user, mapMock;
631
817
  return __generator(this, function (_a) {
632
818
  switch (_a.label) {
633
819
  case 0:
634
820
  onMapBoundsChanged = jest.fn();
635
- user = setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, drawingModes: [MAP_DRAWING_MODES.POLYGON] })).user;
636
- return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
821
+ user = setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, enablePolygonDrawing: true })).user;
822
+ return [4 /*yield*/, waitFor(function () { return getLastInstance(Map); })];
637
823
  case 1:
638
- _a.sent();
639
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: MAP_DRAWING_MODES.POLYGON }));
640
- return [4 /*yield*/, user.click(screen.getByText('Search as I move the map'))];
824
+ mapMock = _a.sent();
825
+ return [4 /*yield*/, user.click(screen.getByLabelText('Draw area'))];
641
826
  case 2:
642
827
  _a.sent();
828
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({
829
+ draggableCursor: MAP_DRAWING_CROSSHAIR_CURSOR
830
+ }));
831
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({
832
+ disableDoubleClickZoom: true,
833
+ clickableIcons: false
834
+ }));
643
835
  return [4 /*yield*/, user.click(screen.getByText('Search as I move the map'))];
644
836
  case 3:
645
837
  _a.sent();
646
- expect(drawingManagerConstructorSpy).toHaveBeenCalledWith(expect.objectContaining({ drawingMode: null }));
838
+ return [4 /*yield*/, user.click(screen.getByText('Search as I move the map'))];
839
+ case 4:
840
+ _a.sent();
841
+ expect(mapMock.setOptions).toHaveBeenCalledWith(expect.objectContaining({ disableDoubleClickZoom: false }));
647
842
  expect(onMapBoundsChanged).toHaveBeenCalledWith(null);
648
843
  return [2 /*return*/];
649
844
  }
@@ -656,7 +851,7 @@ describe('ReltioMap tests', function () {
656
851
  [1, 2],
657
852
  [3, 4]
658
853
  ];
659
- setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, drawingModes: [MAP_DRAWING_MODES.POLYGON], isSearchOnMapMove: true }));
854
+ setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, enablePolygonDrawing: true, isSearchOnMapMove: true }));
660
855
  jest.spyOn(helpers, 'getMapBoundsPolygon').mockImplementation(function () { return mapBoundsPolygon; });
661
856
  expect(screen.getByLabelText('Search as I move the map').checked).toBe(true);
662
857
  expect(onMapBoundsChanged).not.toHaveBeenCalled();
@@ -673,7 +868,7 @@ describe('ReltioMap tests', function () {
673
868
  [1, 2],
674
869
  [3, 4]
675
870
  ];
676
- setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, drawingModes: [MAP_DRAWING_MODES.POLYGON], isSearchOnMapMove: true }));
871
+ setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, enablePolygonDrawing: true, isSearchOnMapMove: true }));
677
872
  jest.spyOn(helpers, 'getMapBoundsPolygon').mockImplementation(function () { return mapBoundsPolygon; });
678
873
  expect(screen.getByLabelText('Search as I move the map').checked).toBe(true);
679
874
  var mapMock = getLastInstance(Map);
@@ -691,7 +886,7 @@ describe('ReltioMap tests', function () {
691
886
  it('should not call props.onMapBoundsChanged on google map idle if "Search when I move the map" mode is off', function () {
692
887
  jest.useFakeTimers();
693
888
  var onMapBoundsChanged = jest.fn();
694
- setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, drawingModes: [MAP_DRAWING_MODES.POLYGON], isSearchOnMapMove: false }));
889
+ setUp(__assign(__assign({}, defaultProps), { onMapBoundsChanged: onMapBoundsChanged, enablePolygonDrawing: true, isSearchOnMapMove: false }));
695
890
  expect(screen.getByLabelText('Search as I move the map').checked).toBe(false);
696
891
  getEventHandler(getLastInstance(Map), 'idle')();
697
892
  jest.runOnlyPendingTimers();