@vaadin/bundles 25.3.0-alpha13 → 25.3.0-alpha14

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 (105) hide show
  1. package/node_modules_vaadin_map_node_modules_ol_control_MousePosition_js.js +6 -6
  2. package/node_modules_vaadin_map_node_modules_ol_control_MousePosition_js.js.map +1 -1
  3. package/node_modules_vaadin_map_node_modules_ol_control_ZoomToExtent_js.js +10 -1
  4. package/node_modules_vaadin_map_node_modules_ol_control_ZoomToExtent_js.js.map +1 -1
  5. package/node_modules_vaadin_map_node_modules_ol_events_SnapEvent_js.js +5 -0
  6. package/node_modules_vaadin_map_node_modules_ol_events_SnapEvent_js.js.map +1 -1
  7. package/node_modules_vaadin_map_node_modules_ol_featureloader_js.js +9 -8
  8. package/node_modules_vaadin_map_node_modules_ol_featureloader_js.js.map +1 -1
  9. package/node_modules_vaadin_map_node_modules_ol_geom_GeometryCollection_js.js +1 -1
  10. package/node_modules_vaadin_map_node_modules_ol_geom_GeometryCollection_js.js.map +1 -1
  11. package/node_modules_vaadin_map_node_modules_ol_geom_flat_clip_js.js +172 -0
  12. package/node_modules_vaadin_map_node_modules_ol_geom_flat_clip_js.js.map +1 -0
  13. package/node_modules_vaadin_map_node_modules_ol_geom_flat_length_js-_95bd5.js +58 -0
  14. package/node_modules_vaadin_map_node_modules_ol_geom_flat_length_js-_95bd5.js.map +1 -0
  15. package/{node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-node_modules_vaadin_map_node_-a1378d.js → node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-304640.js} +244 -5
  16. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-304640.js.map +1 -0
  17. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-7a9288.js +383 -0
  18. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-7a9288.js.map +1 -0
  19. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js.js +243 -0
  20. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js.js.map +1 -0
  21. package/node_modules_vaadin_map_node_modules_ol_geom_flat_textpath_js.js +18 -5
  22. package/node_modules_vaadin_map_node_modules_ol_geom_flat_textpath_js.js.map +1 -1
  23. package/node_modules_vaadin_map_node_modules_ol_interaction_DragAndDrop_js.js +8 -8
  24. package/node_modules_vaadin_map_node_modules_ol_interaction_DragAndDrop_js.js.map +1 -1
  25. package/{node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c0.js → node_modules_vaadin_map_node_modules_ol_render_VectorContext_js.js} +2 -2
  26. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js.js.map +1 -0
  27. package/node_modules_vaadin_map_node_modules_ol_render_canvas_LineStringBuilder_js.js +17 -7
  28. package/node_modules_vaadin_map_node_modules_ol_render_canvas_LineStringBuilder_js.js.map +1 -1
  29. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc10.js +18 -15
  30. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc10.js.map +1 -1
  31. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc11.js +18 -15
  32. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc11.js.map +1 -1
  33. package/node_modules_vaadin_map_node_modules_ol_renderer_Layer_js.js +21 -1
  34. package/node_modules_vaadin_map_node_modules_ol_renderer_Layer_js.js.map +1 -1
  35. package/node_modules_vaadin_map_node_modules_ol_source_Source_js.js +34 -3
  36. package/node_modules_vaadin_map_node_modules_ol_source_Source_js.js.map +1 -1
  37. package/package.json +135 -135
  38. package/vaadin-bundle.json +1824 -1812
  39. package/vaadin.js +2725 -1726
  40. package/vaadin.js.map +1 -1
  41. package/vendors-node_modules_vaadin_map_node_modules_ol_Feature_js.js +30 -16
  42. package/vendors-node_modules_vaadin_map_node_modules_ol_Feature_js.js.map +1 -1
  43. package/vendors-node_modules_vaadin_map_node_modules_ol_Overlay_js.js +6 -6
  44. package/vendors-node_modules_vaadin_map_node_modules_ol_Overlay_js.js.map +1 -1
  45. package/vendors-node_modules_vaadin_map_node_modules_ol_control_FullScreen_js.js +7 -7
  46. package/vendors-node_modules_vaadin_map_node_modules_ol_control_FullScreen_js.js.map +1 -1
  47. package/vendors-node_modules_vaadin_map_node_modules_ol_control_OverviewMap_js.js +1 -1
  48. package/vendors-node_modules_vaadin_map_node_modules_ol_control_OverviewMap_js.js.map +1 -1
  49. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ScaleLine_js.js +6 -6
  50. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ScaleLine_js.js.map +1 -1
  51. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ZoomSlider_js.js +1 -1
  52. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ZoomSlider_js.js.map +1 -1
  53. package/vendors-node_modules_vaadin_map_node_modules_ol_control_js.js +34 -25
  54. package/vendors-node_modules_vaadin_map_node_modules_ol_control_js.js.map +1 -1
  55. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Draw_js.js +146 -943
  56. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Draw_js.js.map +1 -1
  57. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Extent_js.js +111 -34
  58. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Extent_js.js.map +1 -1
  59. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Link_js.js +3 -3
  60. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Link_js.js.map +1 -1
  61. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Modify_js.js +1055 -219
  62. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Modify_js.js.map +1 -1
  63. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Select_js.js +129 -57
  64. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Select_js.js.map +1 -1
  65. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Snap_js.js +74 -80
  66. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Snap_js.js.map +1 -1
  67. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Translate_js.js +11 -11
  68. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Translate_js.js.map +1 -1
  69. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_js.js +54 -54
  70. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_js.js.map +1 -1
  71. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_tracing_js.js +801 -0
  72. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_tracing_js.js.map +1 -0
  73. package/vendors-node_modules_vaadin_map_node_modules_ol_render_Feature_js.js +36 -20
  74. package/vendors-node_modules_vaadin_map_node_modules_ol_render_Feature_js.js.map +1 -1
  75. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_BuilderGroup_js.js +17 -279
  76. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_BuilderGroup_js.js.map +1 -1
  77. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Builder_js.js +16 -7
  78. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Builder_js.js.map +1 -1
  79. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_ExecutorGroup_js.js +53 -17
  80. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_ExecutorGroup_js.js.map +1 -1
  81. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Executor_js.js +336 -38
  82. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Executor_js.js.map +1 -1
  83. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Immediate_js.js +75 -42
  84. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Immediate_js.js.map +1 -1
  85. package/{node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js → vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js} +77 -11
  86. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js.map +1 -0
  87. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_TextBuilder_js.js +210 -16
  88. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_TextBuilder_js.js.map +1 -1
  89. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_Layer_js.js +88 -32
  90. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_Layer_js.js.map +1 -1
  91. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_VectorLayer_js.js +62 -22
  92. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_VectorLayer_js.js.map +1 -1
  93. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_vector_js.js +2 -2
  94. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_vector_js.js.map +1 -1
  95. package/vendors-node_modules_vaadin_map_node_modules_ol_source_Vector_js.js +135 -81
  96. package/vendors-node_modules_vaadin_map_node_modules_ol_source_Vector_js.js.map +1 -1
  97. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c0.js.map +0 -1
  98. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c1.js +0 -144
  99. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c1.js.map +0 -1
  100. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-node_modules_vaadin_map_node_-a1378d.js.map +0 -1
  101. package/node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js.map +0 -1
  102. package/node_modules_vaadin_map_node_modules_ol_style_js.js +0 -48
  103. package/node_modules_vaadin_map_node_modules_ol_style_js.js.map +0 -1
  104. package/vendors-node_modules_vaadin_map_node_modules_ol_geom_js-node_modules_vaadin_map_node_modules_-f0f4bb.js +0 -769
  105. package/vendors-node_modules_vaadin_map_node_modules_ol_geom_js-node_modules_vaadin_map_node_modules_-f0f4bb.js.map +0 -1
@@ -11,14 +11,14 @@ __webpack_require__.r(__webpack_exports__);
11
11
  /* harmony export */ "ExtentEvent": () => (/* binding */ ExtentEvent),
12
12
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
13
13
  /* harmony export */ });
14
- /* harmony import */ var _Feature_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Feature.js */ "./node_modules/@vaadin/map/node_modules/ol/Feature.js");
15
- /* harmony import */ var _MapBrowserEventType_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../MapBrowserEventType.js */ "./node_modules/@vaadin/map/node_modules/ol/MapBrowserEventType.js");
14
+ /* harmony import */ var _Feature_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Feature.js */ "./node_modules/@vaadin/map/node_modules/ol/Feature.js");
15
+ /* harmony import */ var _MapBrowserEventType_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../MapBrowserEventType.js */ "./node_modules/@vaadin/map/node_modules/ol/MapBrowserEventType.js");
16
16
  /* harmony import */ var _coordinate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../coordinate.js */ "./node_modules/@vaadin/map/node_modules/ol/coordinate.js");
17
17
  /* harmony import */ var _events_Event_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events/Event.js */ "./node_modules/@vaadin/map/node_modules/ol/events/Event.js");
18
18
  /* harmony import */ var _events_condition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../events/condition.js */ "./node_modules/@vaadin/map/node_modules/ol/events/condition.js");
19
- /* harmony import */ var _extent_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../extent.js */ "./node_modules/@vaadin/map/node_modules/ol/extent.js");
20
- /* harmony import */ var _geom_Point_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../geom/Point.js */ "./node_modules/@vaadin/map/node_modules/ol/geom/Point.js");
21
- /* harmony import */ var _geom_Polygon_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../geom/Polygon.js */ "./node_modules/@vaadin/map/node_modules/ol/geom/Polygon.js");
19
+ /* harmony import */ var _extent_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../extent.js */ "./node_modules/@vaadin/map/node_modules/ol/extent.js");
20
+ /* harmony import */ var _geom_Point_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../geom/Point.js */ "./node_modules/@vaadin/map/node_modules/ol/geom/Point.js");
21
+ /* harmony import */ var _geom_Polygon_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../geom/Polygon.js */ "./node_modules/@vaadin/map/node_modules/ol/geom/Polygon.js");
22
22
  /* harmony import */ var _layer_Vector_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../layer/Vector.js */ "./node_modules/@vaadin/map/node_modules/ol/layer/Vector.js");
23
23
  /* harmony import */ var _proj_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../proj.js */ "./node_modules/@vaadin/map/node_modules/ol/proj.js");
24
24
  /* harmony import */ var _source_Vector_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../source/Vector.js */ "./node_modules/@vaadin/map/node_modules/ol/source/Vector.js");
@@ -47,6 +47,11 @@ __webpack_require__.r(__webpack_exports__);
47
47
  * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a
48
48
  * boolean to indicate whether that event should be handled.
49
49
  * Default is {@link module:ol/events/condition.always}.
50
+ * @property {import("../events/condition.js").Condition|null} [createCondition=null] A function that
51
+ * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a
52
+ * boolean to indicate whether that event should be handled to create a new extent.
53
+ * If `null`, the `condition` will also be used as `createCondition`.
54
+ * @property {boolean} [drag=false] An extent can be dragged.
50
55
  * @property {import("../extent.js").Extent} [extent] Initial extent. Defaults to no
51
56
  * initial extent.
52
57
  * @property {import("../style/Style.js").StyleLike} [boxStyle]
@@ -100,11 +105,11 @@ class ExtentEvent extends _events_Event_js__WEBPACK_IMPORTED_MODULE_1__["default
100
105
 
101
106
  /***
102
107
  * @template Return
103
- * @typedef {import("../Observable").OnSignature<import("../Observable").EventTypes, import("../events/Event.js").default, Return> &
104
- * import("../Observable").OnSignature<import("../ObjectEventType").Types|
105
- * 'change:active', import("../Object").ObjectEvent, Return> &
106
- * import("../Observable").OnSignature<'extentchanged', ExtentEvent, Return> &
107
- * import("../Observable").CombinedOnSignature<import("../Observable").EventTypes|import("../ObjectEventType").Types|
108
+ * @typedef {import("../Observable.js").OnSignature<import("../Observable.js").EventTypes, import("../events/Event.js").default, Return> &
109
+ * import("../Observable.js").OnSignature<import("../ObjectEventType.js").Types|
110
+ * 'change:active', import("../Object.js").ObjectEvent, Return> &
111
+ * import("../Observable.js").OnSignature<'extentchanged', ExtentEvent, Return> &
112
+ * import("../Observable.js").CombinedOnSignature<import("../Observable.js").EventTypes|import("../ObjectEventType.js").Types|
108
113
  * 'change:active'|'extentchanged', Return>} ExtentOnSignature
109
114
  */
110
115
 
@@ -112,7 +117,8 @@ class ExtentEvent extends _events_Event_js__WEBPACK_IMPORTED_MODULE_1__["default
112
117
  * @classdesc
113
118
  * Allows the user to draw a vector box by clicking and dragging on the map.
114
119
  * Once drawn, the vector box can be modified by dragging its vertices or edges.
115
- * This interaction is only supported for mouse devices.
120
+ * The interaction can also be configured with an initial extent and a `createCondition`
121
+ * to prevent the creation of a new extent on `pointerdown`, if desired.
116
122
  *
117
123
  * @fires ExtentEvent
118
124
  * @api
@@ -127,12 +133,12 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
127
133
  super(/** @type {import("./Pointer.js").Options} */ (options));
128
134
 
129
135
  /***
130
- * @type {ExtentOnSignature<import("../events").EventsKey>}
136
+ * @type {ExtentOnSignature<import("../events.js").EventsKey>}
131
137
  */
132
138
  this.on;
133
139
 
134
140
  /***
135
- * @type {ExtentOnSignature<import("../events").EventsKey>}
141
+ * @type {ExtentOnSignature<import("../events.js").EventsKey>}
136
142
  */
137
143
  this.once;
138
144
 
@@ -148,6 +154,18 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
148
154
  */
149
155
  this.condition_ = options.condition ? options.condition : _events_condition_js__WEBPACK_IMPORTED_MODULE_3__.always;
150
156
 
157
+ /**
158
+ * @type {import("../events/condition.js").Condition}
159
+ * @private
160
+ */
161
+ this.createCondition_ = options.createCondition || this.condition_;
162
+
163
+ /**
164
+ * @type {boolean}
165
+ * @private
166
+ */
167
+ this.drag_ = options.drag || false;
168
+
151
169
  /**
152
170
  * Extent of the drawn box
153
171
  * @type {import("../extent.js").Extent}
@@ -279,17 +297,31 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
279
297
 
280
298
  /**
281
299
  * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent pointer move event
300
+ * @return {boolean} The event was handled.
282
301
  * @private
283
302
  */
284
303
  handlePointerMove_(mapBrowserEvent) {
285
304
  const pixel = mapBrowserEvent.pixel;
286
305
  const map = mapBrowserEvent.map;
306
+ const draggable =
307
+ this.drag_ &&
308
+ (0,_extent_js__WEBPACK_IMPORTED_MODULE_7__.containsCoordinate)(this.extent_, mapBrowserEvent.coordinate);
287
309
 
288
310
  let vertex = this.snapToVertex_(pixel, map);
289
- if (!vertex) {
311
+ if (!vertex && this.createCondition_(mapBrowserEvent) && !draggable) {
290
312
  vertex = map.getCoordinateFromPixelInternal(pixel);
291
313
  }
292
- this.createOrUpdatePointerFeature_(vertex);
314
+ if (draggable && !vertex) {
315
+ this.getMap().getViewport().classList.add('ol-grab');
316
+ } else {
317
+ this.getMap().getViewport().classList.remove('ol-grab');
318
+ }
319
+ if (vertex) {
320
+ this.updatePointerFeature_(vertex);
321
+ return true;
322
+ }
323
+ this.noVertexFeature_();
324
+ return false;
293
325
  }
294
326
 
295
327
  /**
@@ -302,9 +334,9 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
302
334
 
303
335
  if (!extentFeature) {
304
336
  if (!extent) {
305
- extentFeature = new _Feature_js__WEBPACK_IMPORTED_MODULE_7__["default"]({});
337
+ extentFeature = new _Feature_js__WEBPACK_IMPORTED_MODULE_8__["default"]({});
306
338
  } else {
307
- extentFeature = new _Feature_js__WEBPACK_IMPORTED_MODULE_7__["default"]((0,_geom_Polygon_js__WEBPACK_IMPORTED_MODULE_8__.fromExtent)(extent));
339
+ extentFeature = new _Feature_js__WEBPACK_IMPORTED_MODULE_8__["default"]((0,_geom_Polygon_js__WEBPACK_IMPORTED_MODULE_9__.fromExtent)(extent));
308
340
  }
309
341
  this.extentFeature_ = extentFeature;
310
342
  this.extentOverlay_.getSource().addFeature(extentFeature);
@@ -312,7 +344,7 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
312
344
  if (!extent) {
313
345
  extentFeature.setGeometry(undefined);
314
346
  } else {
315
- extentFeature.setGeometry((0,_geom_Polygon_js__WEBPACK_IMPORTED_MODULE_8__.fromExtent)(extent));
347
+ extentFeature.setGeometry((0,_geom_Polygon_js__WEBPACK_IMPORTED_MODULE_9__.fromExtent)(extent));
316
348
  }
317
349
  }
318
350
  return extentFeature;
@@ -320,22 +352,35 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
320
352
 
321
353
  /**
322
354
  * @param {import("../coordinate.js").Coordinate} vertex location of feature
355
+ * @param {boolean} [createIfNotExists] create the feature if it does not exist
323
356
  * @return {Feature} vertex as feature
324
357
  * @private
325
358
  */
326
- createOrUpdatePointerFeature_(vertex) {
359
+ updatePointerFeature_(vertex, createIfNotExists = true) {
327
360
  let vertexFeature = this.vertexFeature_;
328
- if (!vertexFeature) {
329
- vertexFeature = new _Feature_js__WEBPACK_IMPORTED_MODULE_7__["default"](new _geom_Point_js__WEBPACK_IMPORTED_MODULE_9__["default"](vertex));
361
+ if (createIfNotExists && !vertexFeature) {
362
+ vertexFeature = new _Feature_js__WEBPACK_IMPORTED_MODULE_8__["default"](new _geom_Point_js__WEBPACK_IMPORTED_MODULE_10__["default"](vertex));
330
363
  this.vertexFeature_ = vertexFeature;
331
364
  this.vertexOverlay_.getSource().addFeature(vertexFeature);
332
- } else {
365
+ }
366
+ if (vertexFeature) {
333
367
  const geometry = vertexFeature.getGeometry();
334
368
  geometry.setCoordinates(vertex);
335
369
  }
336
370
  return vertexFeature;
337
371
  }
338
372
 
373
+ /**
374
+ * Remove the vertex feature if it exists.
375
+ * @private
376
+ */
377
+ noVertexFeature_() {
378
+ if (this.vertexFeature_) {
379
+ this.vertexOverlay_.getSource().removeFeature(this.vertexFeature_);
380
+ this.vertexFeature_ = null;
381
+ }
382
+ }
383
+
339
384
  /**
340
385
  * @param {import("../MapBrowserEvent.js").default} mapBrowserEvent Map browser event.
341
386
  * @return {boolean} `false` to stop event propagation.
@@ -343,19 +388,23 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
343
388
  */
344
389
  handleEvent(mapBrowserEvent) {
345
390
  if (!mapBrowserEvent.originalEvent || !this.condition_(mapBrowserEvent)) {
391
+ this.noVertexFeature_();
346
392
  return true;
347
393
  }
394
+
395
+ let handled = this.handlingDownUpSequence;
396
+
348
397
  //display pointer (if not dragging)
349
398
  if (
350
- mapBrowserEvent.type == _MapBrowserEventType_js__WEBPACK_IMPORTED_MODULE_10__["default"].POINTERMOVE &&
399
+ mapBrowserEvent.type == _MapBrowserEventType_js__WEBPACK_IMPORTED_MODULE_11__["default"].POINTERMOVE &&
351
400
  !this.handlingDownUpSequence
352
401
  ) {
353
- this.handlePointerMove_(mapBrowserEvent);
402
+ handled = this.handlePointerMove_(mapBrowserEvent);
354
403
  }
355
404
  //call pointer to determine up/down/drag
356
405
  super.handleEvent(mapBrowserEvent);
357
406
  //return false to stop propagation
358
- return false;
407
+ return !handled;
359
408
  }
360
409
 
361
410
  /**
@@ -411,13 +460,22 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
411
460
  getOpposingPoint([extent[2], y]),
412
461
  );
413
462
  }
414
- //no snap - new bbox
463
+ //no snap - new bbox or dragging existing bbox
415
464
  } else {
416
465
  vertex = map.getCoordinateFromPixelInternal(pixel);
417
- this.setExtent([vertex[0], vertex[1], vertex[0], vertex[1]]);
418
- this.pointerHandler_ = getPointHandler(vertex);
466
+ let drag = false;
467
+ if (this.drag_) {
468
+ if ((0,_extent_js__WEBPACK_IMPORTED_MODULE_7__.containsCoordinate)(extent, vertex)) {
469
+ this.pointerHandler_ = getDragHandler(extent, vertex);
470
+ drag = true;
471
+ }
472
+ }
473
+ if (!drag && this.createCondition_(mapBrowserEvent)) {
474
+ this.setExtent([vertex[0], vertex[1], vertex[0], vertex[1]]);
475
+ this.pointerHandler_ = getPointHandler(vertex);
476
+ }
419
477
  }
420
- return true; //event handled; start downup sequence
478
+ return !!this.pointerHandler_; //event handled; start downup sequence
421
479
  }
422
480
 
423
481
  /**
@@ -429,7 +487,7 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
429
487
  if (this.pointerHandler_) {
430
488
  const pixelCoordinate = mapBrowserEvent.coordinate;
431
489
  this.setExtent(this.pointerHandler_(pixelCoordinate));
432
- this.createOrUpdatePointerFeature_(pixelCoordinate);
490
+ this.updatePointerFeature_(pixelCoordinate, false);
433
491
  }
434
492
  }
435
493
 
@@ -443,7 +501,7 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
443
501
  this.pointerHandler_ = null;
444
502
  //If bbox is zero area, set to null;
445
503
  const extent = this.getExtentInternal();
446
- if (!extent || (0,_extent_js__WEBPACK_IMPORTED_MODULE_11__.getArea)(extent) === 0) {
504
+ if (!extent || (0,_extent_js__WEBPACK_IMPORTED_MODULE_7__.getArea)(extent) === 0) {
447
505
  this.setExtent(null);
448
506
  }
449
507
  return false; //Stop handling downup sequence
@@ -480,6 +538,7 @@ class Extent extends _Pointer_js__WEBPACK_IMPORTED_MODULE_2__["default"] {
480
538
  *
481
539
  * @return {import("../extent.js").Extent} Drawn extent in the view projection.
482
540
  * @api
541
+ * @deprecated Use {@link module:ol/interaction/Extent~Extent#getExtent} instead.
483
542
  */
484
543
  getExtentInternal() {
485
544
  return this.extent_;
@@ -529,7 +588,7 @@ function getDefaultPointerStyleFunction() {
529
588
  */
530
589
  function getPointHandler(fixedPoint) {
531
590
  return function (point) {
532
- return (0,_extent_js__WEBPACK_IMPORTED_MODULE_11__.boundingExtent)([fixedPoint, point]);
591
+ return (0,_extent_js__WEBPACK_IMPORTED_MODULE_7__.boundingExtent)([fixedPoint, point]);
533
592
  };
534
593
  }
535
594
 
@@ -541,17 +600,35 @@ function getPointHandler(fixedPoint) {
541
600
  function getEdgeHandler(fixedP1, fixedP2) {
542
601
  if (fixedP1[0] == fixedP2[0]) {
543
602
  return function (point) {
544
- return (0,_extent_js__WEBPACK_IMPORTED_MODULE_11__.boundingExtent)([fixedP1, [point[0], fixedP2[1]]]);
603
+ return (0,_extent_js__WEBPACK_IMPORTED_MODULE_7__.boundingExtent)([fixedP1, [point[0], fixedP2[1]]]);
545
604
  };
546
605
  }
547
606
  if (fixedP1[1] == fixedP2[1]) {
548
607
  return function (point) {
549
- return (0,_extent_js__WEBPACK_IMPORTED_MODULE_11__.boundingExtent)([fixedP1, [fixedP2[0], point[1]]]);
608
+ return (0,_extent_js__WEBPACK_IMPORTED_MODULE_7__.boundingExtent)([fixedP1, [fixedP2[0], point[1]]]);
550
609
  };
551
610
  }
552
611
  return null;
553
612
  }
554
613
 
614
+ /**
615
+ * @param {import("../extent.js").Extent} extent The extent that will be dragged
616
+ * @param {import("../coordinate.js").Coordinate} vertex The vertex that drag delta is calculated from
617
+ * @return {PointerHandler|null} event handler
618
+ */
619
+ function getDragHandler(extent, vertex) {
620
+ return function (point) {
621
+ const deltaX = point[0] - vertex[0];
622
+ const deltaY = point[1] - vertex[1];
623
+ return [
624
+ extent[0] + deltaX,
625
+ extent[1] + deltaY,
626
+ extent[2] + deltaX,
627
+ extent[3] + deltaY,
628
+ ];
629
+ };
630
+ }
631
+
555
632
  /**
556
633
  * @param {import("../extent.js").Extent} extent extent
557
634
  * @return {Array<Array<import("../coordinate.js").Coordinate>>} extent line segments
@@ -1 +1 @@
1
- {"version":3,"file":"vendors-node_modules_vaadin_map_node_modules_ol_interaction_Extent_js.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACoC;AACwB;AAMlC;AACa;AACO;AACO;AAChB;AAC8B;AACtB;AACL;AACO;AACM;AACP;;AAE9C;AACA,aAAa,QAAQ;AACrB,cAAc,4CAA4C;AAC1D,YAAY,iDAAiD;AAC7D;AACA,eAAe,wCAAwC;AACvD,cAAc,+BAA+B;AAC7C;AACA,cAAc,uCAAuC;AACrD;AACA,kBAAkB;AAClB,cAAc,QAAQ;AACtB;AACA,cAAc,uCAAuC;AACrD;AACA,kBAAkB;AAClB,cAAc,SAAS;AACvB;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,2CAA2C;AACjE;AACA;AACO,0BAA0B,wDAAK;AACtC;AACA,aAAa,+BAA+B;AAC5C;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,iFAAiF;AAC9F;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mDAAkB;AACvC;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA,qBAAqB,gCAAgC;;AAErD;AACA,cAAc;AACd;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,8DAA8D,wDAAM;;AAEpE;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,8BAA8B,wDAAW;AACzC,kBAAkB,yDAAY;AAC9B;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA,8BAA8B,wDAAW;AACzC,kBAAkB,yDAAY;AAC9B;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,aAAa,6BAA6B;AAC1C,aAAa,6BAA6B;AAC1C,cAAc,4CAA4C;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wEAAwB;AAChC,QAAQ,wEAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,gEAAgB;AACnC;;AAEA;AACA,UAAU,wDAAkB;AAC5B;AACA;AACA;AACA,6BAA6B,+DAAyB;AACtD,6BAA6B,+DAAyB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,yCAAyC;AACtD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,+BAA+B;AAC5C,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,mDAAO,GAAG;AACtC,QAAQ;AACR,4BAA4B,mDAAO,CAAC,4DAAiB;AACrD;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR,kCAAkC,4DAAiB;AACnD;AACA;AACA;AACA;;AAEA;AACA,aAAa,uCAAuC;AACpD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA,0BAA0B,mDAAO,KAAK,sDAAK;AAC3C;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,4EAA+B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,iBAAiB,iBAAiB;AAClC;;AAEA;AACA;AACA,aAAa,yCAAyC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oDAAO;AAC1B;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA,aAAa,6BAA6B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA,WAAW,sDAAY;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,+BAA+B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,2CAA2C;AACvD;AACA;AACA,gBAAgB,oEAAkB;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,2CAA2C;AACvD;AACA;AACA,gBAAgB,oEAAkB;AAClC;AACA;AACA;AACA;;AAEA;AACA,WAAW,uCAAuC;AAClD,YAAY,iFAAiF;AAC7F;AACA;AACA;AACA,WAAW,2DAAc;AACzB;AACA;;AAEA;AACA,WAAW,uCAAuC;AAClD,WAAW,uCAAuC;AAClD,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA,aAAa,2DAAc;AAC3B;AACA;AACA;AACA;AACA,aAAa,2DAAc;AAC3B;AACA;AACA;AACA;;AAEA;AACA,WAAW,+BAA+B;AAC1C,YAAY,qDAAqD;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,MAAM,EAAC","sources":["webpack://@vaadin/bundles/./node_modules/@vaadin/map/node_modules/ol/interaction/Extent.js"],"sourcesContent":["/**\n * @module ol/interaction/Extent\n */\nimport Feature from '../Feature.js';\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport {\n closestOnSegment,\n distance as coordinateDistance,\n squaredDistance as squaredCoordinateDistance,\n squaredDistanceToSegment,\n} from '../coordinate.js';\nimport Event from '../events/Event.js';\nimport {always} from '../events/condition.js';\nimport {boundingExtent, getArea} from '../extent.js';\nimport Point from '../geom/Point.js';\nimport {fromExtent as polygonFromExtent} from '../geom/Polygon.js';\nimport VectorLayer from '../layer/Vector.js';\nimport {toUserExtent} from '../proj.js';\nimport VectorSource from '../source/Vector.js';\nimport {createEditingStyle} from '../style/Style.js';\nimport PointerInteraction from './Pointer.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.always}.\n * @property {import(\"../extent.js\").Extent} [extent] Initial extent. Defaults to no\n * initial extent.\n * @property {import(\"../style/Style.js\").StyleLike} [boxStyle]\n * Style for the drawn extent box. Defaults to the `Polygon` editing style\n * documented in {@link module:ol/style/Style~Style}\n * @property {number} [pixelTolerance=10] Pixel tolerance for considering the\n * pointer close enough to a segment or vertex for editing.\n * @property {import(\"../style/Style.js\").StyleLike} [pointerStyle]\n * Style for the cursor used to draw the extent. Defaults to the `Point` editing style\n * documented in {@link module:ol/style/Style~Style}\n * @property {boolean} [wrapX=false] Wrap the drawn extent across multiple maps\n * in the X direction? Only affects visuals, not functionality.\n */\n\n/**\n * @enum {string}\n */\nconst ExtentEventType = {\n /**\n * Triggered after the extent is changed\n * @event ExtentEvent#extentchanged\n * @api\n */\n EXTENTCHANGED: 'extentchanged',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/interaction/Extent~Extent} instances are\n * instances of this type.\n */\nexport class ExtentEvent extends Event {\n /**\n * @param {import(\"../extent.js\").Extent} extent the new extent\n */\n constructor(extent) {\n super(ExtentEventType.EXTENTCHANGED);\n\n /**\n * The current extent.\n * @type {import(\"../extent.js\").Extent}\n * @api\n */\n this.extent = extent;\n }\n}\n\n/**\n * @typedef {function (import(\"../coordinate.js\").Coordinate): import(\"../extent.js\").Extent} PointerHandler\n */\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature<import(\"../Observable\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable\").OnSignature<import(\"../ObjectEventType\").Types|\n * 'change:active', import(\"../Object\").ObjectEvent, Return> &\n * import(\"../Observable\").OnSignature<'extentchanged', ExtentEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature<import(\"../Observable\").EventTypes|import(\"../ObjectEventType\").Types|\n * 'change:active'|'extentchanged', Return>} ExtentOnSignature\n */\n\n/**\n * @classdesc\n * Allows the user to draw a vector box by clicking and dragging on the map.\n * Once drawn, the vector box can be modified by dragging its vertices or edges.\n * This interaction is only supported for mouse devices.\n *\n * @fires ExtentEvent\n * @api\n */\nclass Extent extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n super(/** @type {import(\"./Pointer.js\").Options} */ (options));\n\n /***\n * @type {ExtentOnSignature<import(\"../events\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {ExtentOnSignature<import(\"../events\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {ExtentOnSignature<void>}\n */\n this.un;\n\n /**\n * Condition\n * @type {import(\"../events/condition.js\").Condition}\n * @private\n */\n this.condition_ = options.condition ? options.condition : always;\n\n /**\n * Extent of the drawn box\n * @type {import(\"../extent.js\").Extent}\n * @private\n */\n this.extent_ = null;\n\n /**\n * Handler for pointer move events\n * @type {PointerHandler|null}\n * @private\n */\n this.pointerHandler_ = null;\n\n /**\n * Pixel threshold to snap to extent\n * @type {number}\n * @private\n */\n this.pixelTolerance_ =\n options.pixelTolerance !== undefined ? options.pixelTolerance : 10;\n\n /**\n * Is the pointer snapped to an extent vertex\n * @type {boolean}\n * @private\n */\n this.snappedToVertex_ = false;\n\n /**\n * Feature for displaying the visible extent\n * @type {Feature}\n * @private\n */\n this.extentFeature_ = null;\n\n /**\n * Feature for displaying the visible pointer\n * @type {Feature<Point>}\n * @private\n */\n this.vertexFeature_ = null;\n\n if (!options) {\n options = {};\n }\n\n /**\n * Layer for the extentFeature\n * @type {VectorLayer}\n * @private\n */\n this.extentOverlay_ = new VectorLayer({\n source: new VectorSource({\n useSpatialIndex: false,\n wrapX: !!options.wrapX,\n }),\n style: options.boxStyle\n ? options.boxStyle\n : getDefaultExtentStyleFunction(),\n updateWhileAnimating: true,\n updateWhileInteracting: true,\n });\n\n /**\n * Layer for the vertexFeature\n * @type {VectorLayer}\n * @private\n */\n this.vertexOverlay_ = new VectorLayer({\n source: new VectorSource({\n useSpatialIndex: false,\n wrapX: !!options.wrapX,\n }),\n style: options.pointerStyle\n ? options.pointerStyle\n : getDefaultPointerStyleFunction(),\n updateWhileAnimating: true,\n updateWhileInteracting: true,\n });\n\n if (options.extent) {\n this.setExtent(options.extent);\n }\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel cursor location\n * @param {import(\"../Map.js\").default} map map\n * @return {import(\"../coordinate.js\").Coordinate|null} snapped vertex on extent\n * @private\n */\n snapToVertex_(pixel, map) {\n const pixelCoordinate = map.getCoordinateFromPixelInternal(pixel);\n const sortByDistance = function (a, b) {\n return (\n squaredDistanceToSegment(pixelCoordinate, a) -\n squaredDistanceToSegment(pixelCoordinate, b)\n );\n };\n const extent = this.getExtentInternal();\n if (extent) {\n //convert extents to line segments and find the segment closest to pixelCoordinate\n const segments = getSegments(extent);\n segments.sort(sortByDistance);\n const closestSegment = segments[0];\n\n let vertex = closestOnSegment(pixelCoordinate, closestSegment);\n const vertexPixel = map.getPixelFromCoordinateInternal(vertex);\n\n //if the distance is within tolerance, snap to the segment\n if (coordinateDistance(pixel, vertexPixel) <= this.pixelTolerance_) {\n //test if we should further snap to a vertex\n const pixel1 = map.getPixelFromCoordinateInternal(closestSegment[0]);\n const pixel2 = map.getPixelFromCoordinateInternal(closestSegment[1]);\n const squaredDist1 = squaredCoordinateDistance(vertexPixel, pixel1);\n const squaredDist2 = squaredCoordinateDistance(vertexPixel, pixel2);\n const dist = Math.sqrt(Math.min(squaredDist1, squaredDist2));\n this.snappedToVertex_ = dist <= this.pixelTolerance_;\n if (this.snappedToVertex_) {\n vertex =\n squaredDist1 > squaredDist2 ? closestSegment[1] : closestSegment[0];\n }\n return vertex;\n }\n }\n return null;\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent pointer move event\n * @private\n */\n handlePointerMove_(mapBrowserEvent) {\n const pixel = mapBrowserEvent.pixel;\n const map = mapBrowserEvent.map;\n\n let vertex = this.snapToVertex_(pixel, map);\n if (!vertex) {\n vertex = map.getCoordinateFromPixelInternal(pixel);\n }\n this.createOrUpdatePointerFeature_(vertex);\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent extent\n * @return {Feature} extent as featrue\n * @private\n */\n createOrUpdateExtentFeature_(extent) {\n let extentFeature = this.extentFeature_;\n\n if (!extentFeature) {\n if (!extent) {\n extentFeature = new Feature({});\n } else {\n extentFeature = new Feature(polygonFromExtent(extent));\n }\n this.extentFeature_ = extentFeature;\n this.extentOverlay_.getSource().addFeature(extentFeature);\n } else {\n if (!extent) {\n extentFeature.setGeometry(undefined);\n } else {\n extentFeature.setGeometry(polygonFromExtent(extent));\n }\n }\n return extentFeature;\n }\n\n /**\n * @param {import(\"../coordinate.js\").Coordinate} vertex location of feature\n * @return {Feature} vertex as feature\n * @private\n */\n createOrUpdatePointerFeature_(vertex) {\n let vertexFeature = this.vertexFeature_;\n if (!vertexFeature) {\n vertexFeature = new Feature(new Point(vertex));\n this.vertexFeature_ = vertexFeature;\n this.vertexOverlay_.getSource().addFeature(vertexFeature);\n } else {\n const geometry = vertexFeature.getGeometry();\n geometry.setCoordinates(vertex);\n }\n return vertexFeature;\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @override\n */\n handleEvent(mapBrowserEvent) {\n if (!mapBrowserEvent.originalEvent || !this.condition_(mapBrowserEvent)) {\n return true;\n }\n //display pointer (if not dragging)\n if (\n mapBrowserEvent.type == MapBrowserEventType.POINTERMOVE &&\n !this.handlingDownUpSequence\n ) {\n this.handlePointerMove_(mapBrowserEvent);\n }\n //call pointer to determine up/down/drag\n super.handleEvent(mapBrowserEvent);\n //return false to stop propagation\n return false;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n const pixel = mapBrowserEvent.pixel;\n const map = mapBrowserEvent.map;\n\n const extent = this.getExtentInternal();\n let vertex = this.snapToVertex_(pixel, map);\n\n //find the extent corner opposite the passed corner\n const getOpposingPoint = function (point) {\n let x_ = null;\n let y_ = null;\n if (point[0] == extent[0]) {\n x_ = extent[2];\n } else if (point[0] == extent[2]) {\n x_ = extent[0];\n }\n if (point[1] == extent[1]) {\n y_ = extent[3];\n } else if (point[1] == extent[3]) {\n y_ = extent[1];\n }\n if (x_ !== null && y_ !== null) {\n return [x_, y_];\n }\n return null;\n };\n if (vertex && extent) {\n const x =\n vertex[0] == extent[0] || vertex[0] == extent[2] ? vertex[0] : null;\n const y =\n vertex[1] == extent[1] || vertex[1] == extent[3] ? vertex[1] : null;\n\n //snap to point\n if (x !== null && y !== null) {\n this.pointerHandler_ = getPointHandler(getOpposingPoint(vertex));\n //snap to edge\n } else if (x !== null) {\n this.pointerHandler_ = getEdgeHandler(\n getOpposingPoint([x, extent[1]]),\n getOpposingPoint([x, extent[3]]),\n );\n } else if (y !== null) {\n this.pointerHandler_ = getEdgeHandler(\n getOpposingPoint([extent[0], y]),\n getOpposingPoint([extent[2], y]),\n );\n }\n //no snap - new bbox\n } else {\n vertex = map.getCoordinateFromPixelInternal(pixel);\n this.setExtent([vertex[0], vertex[1], vertex[0], vertex[1]]);\n this.pointerHandler_ = getPointHandler(vertex);\n }\n return true; //event handled; start downup sequence\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n if (this.pointerHandler_) {\n const pixelCoordinate = mapBrowserEvent.coordinate;\n this.setExtent(this.pointerHandler_(pixelCoordinate));\n this.createOrUpdatePointerFeature_(pixelCoordinate);\n }\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n this.pointerHandler_ = null;\n //If bbox is zero area, set to null;\n const extent = this.getExtentInternal();\n if (!extent || getArea(extent) === 0) {\n this.setExtent(null);\n }\n return false; //Stop handling downup sequence\n }\n\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default} map Map.\n * @override\n */\n setMap(map) {\n this.extentOverlay_.setMap(map);\n this.vertexOverlay_.setMap(map);\n super.setMap(map);\n }\n\n /**\n * Returns the current drawn extent in the view projection (or user projection if set)\n *\n * @return {import(\"../extent.js\").Extent} Drawn extent in the view projection.\n * @api\n */\n getExtent() {\n return toUserExtent(\n this.getExtentInternal(),\n this.getMap().getView().getProjection(),\n );\n }\n\n /**\n * Returns the current drawn extent in the view projection\n *\n * @return {import(\"../extent.js\").Extent} Drawn extent in the view projection.\n * @api\n */\n getExtentInternal() {\n return this.extent_;\n }\n\n /**\n * Manually sets the drawn extent, using the view projection.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent\n * @api\n */\n setExtent(extent) {\n //Null extent means no bbox\n this.extent_ = extent ? extent : null;\n this.createOrUpdateExtentFeature_(extent);\n this.dispatchEvent(new ExtentEvent(this.extent_));\n }\n}\n\n/**\n * Returns the default style for the drawn bbox\n *\n * @return {import(\"../style/Style.js\").StyleFunction} Default Extent style\n */\nfunction getDefaultExtentStyleFunction() {\n const style = createEditingStyle();\n return function (feature, resolution) {\n return style['Polygon'];\n };\n}\n\n/**\n * Returns the default style for the pointer\n *\n * @return {import(\"../style/Style.js\").StyleFunction} Default pointer style\n */\nfunction getDefaultPointerStyleFunction() {\n const style = createEditingStyle();\n return function (feature, resolution) {\n return style['Point'];\n };\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} fixedPoint corner that will be unchanged in the new extent\n * @return {function (import(\"../coordinate.js\").Coordinate): import(\"../extent.js\").Extent} event handler\n */\nfunction getPointHandler(fixedPoint) {\n return function (point) {\n return boundingExtent([fixedPoint, point]);\n };\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} fixedP1 first corner that will be unchanged in the new extent\n * @param {import(\"../coordinate.js\").Coordinate} fixedP2 second corner that will be unchanged in the new extent\n * @return {PointerHandler|null} event handler\n */\nfunction getEdgeHandler(fixedP1, fixedP2) {\n if (fixedP1[0] == fixedP2[0]) {\n return function (point) {\n return boundingExtent([fixedP1, [point[0], fixedP2[1]]]);\n };\n }\n if (fixedP1[1] == fixedP2[1]) {\n return function (point) {\n return boundingExtent([fixedP1, [fixedP2[0], point[1]]]);\n };\n }\n return null;\n}\n\n/**\n * @param {import(\"../extent.js\").Extent} extent extent\n * @return {Array<Array<import(\"../coordinate.js\").Coordinate>>} extent line segments\n */\nfunction getSegments(extent) {\n return [\n [\n [extent[0], extent[1]],\n [extent[0], extent[3]],\n ],\n [\n [extent[0], extent[3]],\n [extent[2], extent[3]],\n ],\n [\n [extent[2], extent[3]],\n [extent[2], extent[1]],\n ],\n [\n [extent[2], extent[1]],\n [extent[0], extent[1]],\n ],\n ];\n}\n\nexport default Extent;\n"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"vendors-node_modules_vaadin_map_node_modules_ol_interaction_Extent_js.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACoC;AACwB;AAMlC;AACa;AACO;AAC2B;AACpC;AAC8B;AACtB;AACL;AACO;AACM;AACP;;AAE9C;AACA,aAAa,QAAQ;AACrB,cAAc,4CAA4C;AAC1D,YAAY,iDAAiD;AAC7D;AACA,eAAe,wCAAwC;AACvD,cAAc,iDAAiD;AAC/D,YAAY,iDAAiD;AAC7D;AACA;AACA,cAAc,SAAS;AACvB,cAAc,+BAA+B;AAC7C;AACA,cAAc,uCAAuC;AACrD;AACA,kBAAkB;AAClB,cAAc,QAAQ;AACtB;AACA,cAAc,uCAAuC;AACrD;AACA,kBAAkB;AAClB,cAAc,SAAS;AACvB;AACA;;AAEA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAsB,2CAA2C;AACjE;AACA;AACO,0BAA0B,wDAAK;AACtC;AACA,aAAa,+BAA+B;AAC5C;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,iFAAiF;AAC9F;;AAEA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,iDAAiD;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,mDAAkB;AACvC;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA,qBAAqB,gCAAgC;;AAErD;AACA,cAAc;AACd;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,8DAA8D,wDAAM;;AAEpE;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,8BAA8B,wDAAW;AACzC,kBAAkB,yDAAY;AAC9B;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,cAAc;AACd;AACA;AACA,8BAA8B,wDAAW;AACzC,kBAAkB,yDAAY;AAC9B;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,aAAa,6BAA6B;AAC1C,aAAa,6BAA6B;AAC1C,cAAc,4CAA4C;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,wEAAwB;AAChC,QAAQ,wEAAwB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB,gEAAgB;AACnC;;AAEA;AACA,UAAU,wDAAkB;AAC5B;AACA;AACA;AACA,6BAA6B,+DAAyB;AACtD,6BAA6B,+DAAyB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,8DAAkB;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,+BAA+B;AAC5C,cAAc,SAAS;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA,4BAA4B,mDAAO,GAAG;AACtC,QAAQ;AACR,4BAA4B,mDAAO,CAAC,4DAAiB;AACrD;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR,kCAAkC,4DAAiB;AACnD;AACA;AACA;AACA;;AAEA;AACA,aAAa,uCAAuC;AACpD,aAAa,SAAS;AACtB,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA,0BAA0B,mDAAO,KAAK,uDAAK;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,8BAA8B,4EAA+B;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,YAAY,8DAAkB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB;AACpD;;AAEA;AACA;AACA,aAAa,yCAAyC;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,yCAAyC;AACtD,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,mDAAO;AAC1B;AACA;AACA,kBAAkB;AAClB;;AAEA;AACA;AACA;AACA;AACA,aAAa,6BAA6B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,+BAA+B;AAC7C;AACA;AACA;AACA,WAAW,sDAAY;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,+BAA+B;AAC7C;AACA,sBAAsB,qDAAqD;AAC3E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,+BAA+B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,2CAA2C;AACvD;AACA;AACA,gBAAgB,oEAAkB;AAClC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY,2CAA2C;AACvD;AACA;AACA,gBAAgB,oEAAkB;AAClC;AACA;AACA;AACA;;AAEA;AACA,WAAW,uCAAuC;AAClD,YAAY,iFAAiF;AAC7F;AACA;AACA;AACA,WAAW,0DAAc;AACzB;AACA;;AAEA;AACA,WAAW,uCAAuC;AAClD,WAAW,uCAAuC;AAClD,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA,aAAa,0DAAc;AAC3B;AACA;AACA;AACA;AACA,aAAa,0DAAc;AAC3B;AACA;AACA;AACA;;AAEA;AACA,WAAW,+BAA+B;AAC1C,WAAW,uCAAuC;AAClD,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,+BAA+B;AAC1C,YAAY,qDAAqD;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iEAAe,MAAM,EAAC","sources":["webpack://@vaadin/bundles/./node_modules/@vaadin/map/node_modules/ol/interaction/Extent.js"],"sourcesContent":["/**\n * @module ol/interaction/Extent\n */\nimport Feature from '../Feature.js';\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport {\n closestOnSegment,\n distance as coordinateDistance,\n squaredDistance as squaredCoordinateDistance,\n squaredDistanceToSegment,\n} from '../coordinate.js';\nimport Event from '../events/Event.js';\nimport {always} from '../events/condition.js';\nimport {boundingExtent, containsCoordinate, getArea} from '../extent.js';\nimport Point from '../geom/Point.js';\nimport {fromExtent as polygonFromExtent} from '../geom/Polygon.js';\nimport VectorLayer from '../layer/Vector.js';\nimport {toUserExtent} from '../proj.js';\nimport VectorSource from '../source/Vector.js';\nimport {createEditingStyle} from '../style/Style.js';\nimport PointerInteraction from './Pointer.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.always}.\n * @property {import(\"../events/condition.js\").Condition|null} [createCondition=null] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled to create a new extent.\n * If `null`, the `condition` will also be used as `createCondition`.\n * @property {boolean} [drag=false] An extent can be dragged.\n * @property {import(\"../extent.js\").Extent} [extent] Initial extent. Defaults to no\n * initial extent.\n * @property {import(\"../style/Style.js\").StyleLike} [boxStyle]\n * Style for the drawn extent box. Defaults to the `Polygon` editing style\n * documented in {@link module:ol/style/Style~Style}\n * @property {number} [pixelTolerance=10] Pixel tolerance for considering the\n * pointer close enough to a segment or vertex for editing.\n * @property {import(\"../style/Style.js\").StyleLike} [pointerStyle]\n * Style for the cursor used to draw the extent. Defaults to the `Point` editing style\n * documented in {@link module:ol/style/Style~Style}\n * @property {boolean} [wrapX=false] Wrap the drawn extent across multiple maps\n * in the X direction? Only affects visuals, not functionality.\n */\n\n/**\n * @enum {string}\n */\nconst ExtentEventType = {\n /**\n * Triggered after the extent is changed\n * @event ExtentEvent#extentchanged\n * @api\n */\n EXTENTCHANGED: 'extentchanged',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/interaction/Extent~Extent} instances are\n * instances of this type.\n */\nexport class ExtentEvent extends Event {\n /**\n * @param {import(\"../extent.js\").Extent} extent the new extent\n */\n constructor(extent) {\n super(ExtentEventType.EXTENTCHANGED);\n\n /**\n * The current extent.\n * @type {import(\"../extent.js\").Extent}\n * @api\n */\n this.extent = extent;\n }\n}\n\n/**\n * @typedef {function (import(\"../coordinate.js\").Coordinate): import(\"../extent.js\").Extent} PointerHandler\n */\n\n/***\n * @template Return\n * @typedef {import(\"../Observable.js\").OnSignature<import(\"../Observable.js\").EventTypes, import(\"../events/Event.js\").default, Return> &\n * import(\"../Observable.js\").OnSignature<import(\"../ObjectEventType.js\").Types|\n * 'change:active', import(\"../Object.js\").ObjectEvent, Return> &\n * import(\"../Observable.js\").OnSignature<'extentchanged', ExtentEvent, Return> &\n * import(\"../Observable.js\").CombinedOnSignature<import(\"../Observable.js\").EventTypes|import(\"../ObjectEventType.js\").Types|\n * 'change:active'|'extentchanged', Return>} ExtentOnSignature\n */\n\n/**\n * @classdesc\n * Allows the user to draw a vector box by clicking and dragging on the map.\n * Once drawn, the vector box can be modified by dragging its vertices or edges.\n * The interaction can also be configured with an initial extent and a `createCondition`\n * to prevent the creation of a new extent on `pointerdown`, if desired.\n *\n * @fires ExtentEvent\n * @api\n */\nclass Extent extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n super(/** @type {import(\"./Pointer.js\").Options} */ (options));\n\n /***\n * @type {ExtentOnSignature<import(\"../events.js\").EventsKey>}\n */\n this.on;\n\n /***\n * @type {ExtentOnSignature<import(\"../events.js\").EventsKey>}\n */\n this.once;\n\n /***\n * @type {ExtentOnSignature<void>}\n */\n this.un;\n\n /**\n * Condition\n * @type {import(\"../events/condition.js\").Condition}\n * @private\n */\n this.condition_ = options.condition ? options.condition : always;\n\n /**\n * @type {import(\"../events/condition.js\").Condition}\n * @private\n */\n this.createCondition_ = options.createCondition || this.condition_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.drag_ = options.drag || false;\n\n /**\n * Extent of the drawn box\n * @type {import(\"../extent.js\").Extent}\n * @private\n */\n this.extent_ = null;\n\n /**\n * Handler for pointer move events\n * @type {PointerHandler|null}\n * @private\n */\n this.pointerHandler_ = null;\n\n /**\n * Pixel threshold to snap to extent\n * @type {number}\n * @private\n */\n this.pixelTolerance_ =\n options.pixelTolerance !== undefined ? options.pixelTolerance : 10;\n\n /**\n * Is the pointer snapped to an extent vertex\n * @type {boolean}\n * @private\n */\n this.snappedToVertex_ = false;\n\n /**\n * Feature for displaying the visible extent\n * @type {Feature}\n * @private\n */\n this.extentFeature_ = null;\n\n /**\n * Feature for displaying the visible pointer\n * @type {Feature<Point>}\n * @private\n */\n this.vertexFeature_ = null;\n\n if (!options) {\n options = {};\n }\n\n /**\n * Layer for the extentFeature\n * @type {VectorLayer}\n * @private\n */\n this.extentOverlay_ = new VectorLayer({\n source: new VectorSource({\n useSpatialIndex: false,\n wrapX: !!options.wrapX,\n }),\n style: options.boxStyle\n ? options.boxStyle\n : getDefaultExtentStyleFunction(),\n updateWhileAnimating: true,\n updateWhileInteracting: true,\n });\n\n /**\n * Layer for the vertexFeature\n * @type {VectorLayer}\n * @private\n */\n this.vertexOverlay_ = new VectorLayer({\n source: new VectorSource({\n useSpatialIndex: false,\n wrapX: !!options.wrapX,\n }),\n style: options.pointerStyle\n ? options.pointerStyle\n : getDefaultPointerStyleFunction(),\n updateWhileAnimating: true,\n updateWhileInteracting: true,\n });\n\n if (options.extent) {\n this.setExtent(options.extent);\n }\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel cursor location\n * @param {import(\"../Map.js\").default} map map\n * @return {import(\"../coordinate.js\").Coordinate|null} snapped vertex on extent\n * @private\n */\n snapToVertex_(pixel, map) {\n const pixelCoordinate = map.getCoordinateFromPixelInternal(pixel);\n const sortByDistance = function (a, b) {\n return (\n squaredDistanceToSegment(pixelCoordinate, a) -\n squaredDistanceToSegment(pixelCoordinate, b)\n );\n };\n const extent = this.getExtentInternal();\n if (extent) {\n //convert extents to line segments and find the segment closest to pixelCoordinate\n const segments = getSegments(extent);\n segments.sort(sortByDistance);\n const closestSegment = segments[0];\n\n let vertex = closestOnSegment(pixelCoordinate, closestSegment);\n const vertexPixel = map.getPixelFromCoordinateInternal(vertex);\n\n //if the distance is within tolerance, snap to the segment\n if (coordinateDistance(pixel, vertexPixel) <= this.pixelTolerance_) {\n //test if we should further snap to a vertex\n const pixel1 = map.getPixelFromCoordinateInternal(closestSegment[0]);\n const pixel2 = map.getPixelFromCoordinateInternal(closestSegment[1]);\n const squaredDist1 = squaredCoordinateDistance(vertexPixel, pixel1);\n const squaredDist2 = squaredCoordinateDistance(vertexPixel, pixel2);\n const dist = Math.sqrt(Math.min(squaredDist1, squaredDist2));\n this.snappedToVertex_ = dist <= this.pixelTolerance_;\n if (this.snappedToVertex_) {\n vertex =\n squaredDist1 > squaredDist2 ? closestSegment[1] : closestSegment[0];\n }\n return vertex;\n }\n }\n return null;\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent pointer move event\n * @return {boolean} The event was handled.\n * @private\n */\n handlePointerMove_(mapBrowserEvent) {\n const pixel = mapBrowserEvent.pixel;\n const map = mapBrowserEvent.map;\n const draggable =\n this.drag_ &&\n containsCoordinate(this.extent_, mapBrowserEvent.coordinate);\n\n let vertex = this.snapToVertex_(pixel, map);\n if (!vertex && this.createCondition_(mapBrowserEvent) && !draggable) {\n vertex = map.getCoordinateFromPixelInternal(pixel);\n }\n if (draggable && !vertex) {\n this.getMap().getViewport().classList.add('ol-grab');\n } else {\n this.getMap().getViewport().classList.remove('ol-grab');\n }\n if (vertex) {\n this.updatePointerFeature_(vertex);\n return true;\n }\n this.noVertexFeature_();\n return false;\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent extent\n * @return {Feature} extent as featrue\n * @private\n */\n createOrUpdateExtentFeature_(extent) {\n let extentFeature = this.extentFeature_;\n\n if (!extentFeature) {\n if (!extent) {\n extentFeature = new Feature({});\n } else {\n extentFeature = new Feature(polygonFromExtent(extent));\n }\n this.extentFeature_ = extentFeature;\n this.extentOverlay_.getSource().addFeature(extentFeature);\n } else {\n if (!extent) {\n extentFeature.setGeometry(undefined);\n } else {\n extentFeature.setGeometry(polygonFromExtent(extent));\n }\n }\n return extentFeature;\n }\n\n /**\n * @param {import(\"../coordinate.js\").Coordinate} vertex location of feature\n * @param {boolean} [createIfNotExists] create the feature if it does not exist\n * @return {Feature} vertex as feature\n * @private\n */\n updatePointerFeature_(vertex, createIfNotExists = true) {\n let vertexFeature = this.vertexFeature_;\n if (createIfNotExists && !vertexFeature) {\n vertexFeature = new Feature(new Point(vertex));\n this.vertexFeature_ = vertexFeature;\n this.vertexOverlay_.getSource().addFeature(vertexFeature);\n }\n if (vertexFeature) {\n const geometry = vertexFeature.getGeometry();\n geometry.setCoordinates(vertex);\n }\n return vertexFeature;\n }\n\n /**\n * Remove the vertex feature if it exists.\n * @private\n */\n noVertexFeature_() {\n if (this.vertexFeature_) {\n this.vertexOverlay_.getSource().removeFeature(this.vertexFeature_);\n this.vertexFeature_ = null;\n }\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @override\n */\n handleEvent(mapBrowserEvent) {\n if (!mapBrowserEvent.originalEvent || !this.condition_(mapBrowserEvent)) {\n this.noVertexFeature_();\n return true;\n }\n\n let handled = this.handlingDownUpSequence;\n\n //display pointer (if not dragging)\n if (\n mapBrowserEvent.type == MapBrowserEventType.POINTERMOVE &&\n !this.handlingDownUpSequence\n ) {\n handled = this.handlePointerMove_(mapBrowserEvent);\n }\n //call pointer to determine up/down/drag\n super.handleEvent(mapBrowserEvent);\n //return false to stop propagation\n return !handled;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n const pixel = mapBrowserEvent.pixel;\n const map = mapBrowserEvent.map;\n\n const extent = this.getExtentInternal();\n let vertex = this.snapToVertex_(pixel, map);\n\n //find the extent corner opposite the passed corner\n const getOpposingPoint = function (point) {\n let x_ = null;\n let y_ = null;\n if (point[0] == extent[0]) {\n x_ = extent[2];\n } else if (point[0] == extent[2]) {\n x_ = extent[0];\n }\n if (point[1] == extent[1]) {\n y_ = extent[3];\n } else if (point[1] == extent[3]) {\n y_ = extent[1];\n }\n if (x_ !== null && y_ !== null) {\n return [x_, y_];\n }\n return null;\n };\n if (vertex && extent) {\n const x =\n vertex[0] == extent[0] || vertex[0] == extent[2] ? vertex[0] : null;\n const y =\n vertex[1] == extent[1] || vertex[1] == extent[3] ? vertex[1] : null;\n\n //snap to point\n if (x !== null && y !== null) {\n this.pointerHandler_ = getPointHandler(getOpposingPoint(vertex));\n //snap to edge\n } else if (x !== null) {\n this.pointerHandler_ = getEdgeHandler(\n getOpposingPoint([x, extent[1]]),\n getOpposingPoint([x, extent[3]]),\n );\n } else if (y !== null) {\n this.pointerHandler_ = getEdgeHandler(\n getOpposingPoint([extent[0], y]),\n getOpposingPoint([extent[2], y]),\n );\n }\n //no snap - new bbox or dragging existing bbox\n } else {\n vertex = map.getCoordinateFromPixelInternal(pixel);\n let drag = false;\n if (this.drag_) {\n if (containsCoordinate(extent, vertex)) {\n this.pointerHandler_ = getDragHandler(extent, vertex);\n drag = true;\n }\n }\n if (!drag && this.createCondition_(mapBrowserEvent)) {\n this.setExtent([vertex[0], vertex[1], vertex[0], vertex[1]]);\n this.pointerHandler_ = getPointHandler(vertex);\n }\n }\n return !!this.pointerHandler_; //event handled; start downup sequence\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n if (this.pointerHandler_) {\n const pixelCoordinate = mapBrowserEvent.coordinate;\n this.setExtent(this.pointerHandler_(pixelCoordinate));\n this.updatePointerFeature_(pixelCoordinate, false);\n }\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n this.pointerHandler_ = null;\n //If bbox is zero area, set to null;\n const extent = this.getExtentInternal();\n if (!extent || getArea(extent) === 0) {\n this.setExtent(null);\n }\n return false; //Stop handling downup sequence\n }\n\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default} map Map.\n * @override\n */\n setMap(map) {\n this.extentOverlay_.setMap(map);\n this.vertexOverlay_.setMap(map);\n super.setMap(map);\n }\n\n /**\n * Returns the current drawn extent in the view projection (or user projection if set)\n *\n * @return {import(\"../extent.js\").Extent} Drawn extent in the view projection.\n * @api\n */\n getExtent() {\n return toUserExtent(\n this.getExtentInternal(),\n this.getMap().getView().getProjection(),\n );\n }\n\n /**\n * Returns the current drawn extent in the view projection\n *\n * @return {import(\"../extent.js\").Extent} Drawn extent in the view projection.\n * @api\n * @deprecated Use {@link module:ol/interaction/Extent~Extent#getExtent} instead.\n */\n getExtentInternal() {\n return this.extent_;\n }\n\n /**\n * Manually sets the drawn extent, using the view projection.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent\n * @api\n */\n setExtent(extent) {\n //Null extent means no bbox\n this.extent_ = extent ? extent : null;\n this.createOrUpdateExtentFeature_(extent);\n this.dispatchEvent(new ExtentEvent(this.extent_));\n }\n}\n\n/**\n * Returns the default style for the drawn bbox\n *\n * @return {import(\"../style/Style.js\").StyleFunction} Default Extent style\n */\nfunction getDefaultExtentStyleFunction() {\n const style = createEditingStyle();\n return function (feature, resolution) {\n return style['Polygon'];\n };\n}\n\n/**\n * Returns the default style for the pointer\n *\n * @return {import(\"../style/Style.js\").StyleFunction} Default pointer style\n */\nfunction getDefaultPointerStyleFunction() {\n const style = createEditingStyle();\n return function (feature, resolution) {\n return style['Point'];\n };\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} fixedPoint corner that will be unchanged in the new extent\n * @return {function (import(\"../coordinate.js\").Coordinate): import(\"../extent.js\").Extent} event handler\n */\nfunction getPointHandler(fixedPoint) {\n return function (point) {\n return boundingExtent([fixedPoint, point]);\n };\n}\n\n/**\n * @param {import(\"../coordinate.js\").Coordinate} fixedP1 first corner that will be unchanged in the new extent\n * @param {import(\"../coordinate.js\").Coordinate} fixedP2 second corner that will be unchanged in the new extent\n * @return {PointerHandler|null} event handler\n */\nfunction getEdgeHandler(fixedP1, fixedP2) {\n if (fixedP1[0] == fixedP2[0]) {\n return function (point) {\n return boundingExtent([fixedP1, [point[0], fixedP2[1]]]);\n };\n }\n if (fixedP1[1] == fixedP2[1]) {\n return function (point) {\n return boundingExtent([fixedP1, [fixedP2[0], point[1]]]);\n };\n }\n return null;\n}\n\n/**\n * @param {import(\"../extent.js\").Extent} extent The extent that will be dragged\n * @param {import(\"../coordinate.js\").Coordinate} vertex The vertex that drag delta is calculated from\n * @return {PointerHandler|null} event handler\n */\nfunction getDragHandler(extent, vertex) {\n return function (point) {\n const deltaX = point[0] - vertex[0];\n const deltaY = point[1] - vertex[1];\n return [\n extent[0] + deltaX,\n extent[1] + deltaY,\n extent[2] + deltaX,\n extent[3] + deltaY,\n ];\n };\n}\n\n/**\n * @param {import(\"../extent.js\").Extent} extent extent\n * @return {Array<Array<import(\"../coordinate.js\").Coordinate>>} extent line segments\n */\nfunction getSegments(extent) {\n return [\n [\n [extent[0], extent[1]],\n [extent[0], extent[3]],\n ],\n [\n [extent[0], extent[3]],\n [extent[2], extent[3]],\n ],\n [\n [extent[2], extent[3]],\n [extent[2], extent[1]],\n ],\n [\n [extent[2], extent[1]],\n [extent[0], extent[1]],\n ],\n ];\n}\n\nexport default Extent;\n"],"names":[],"sourceRoot":""}
@@ -11,8 +11,8 @@ __webpack_require__.r(__webpack_exports__);
11
11
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
12
12
  /* harmony export */ });
13
13
  /* harmony import */ var _MapEventType_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../MapEventType.js */ "./node_modules/@vaadin/map/node_modules/ol/MapEventType.js");
14
- /* harmony import */ var _events_EventType_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../events/EventType.js */ "./node_modules/@vaadin/map/node_modules/ol/events/EventType.js");
15
14
  /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../events.js */ "./node_modules/@vaadin/map/node_modules/ol/events.js");
15
+ /* harmony import */ var _events_EventType_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../events/EventType.js */ "./node_modules/@vaadin/map/node_modules/ol/events/EventType.js");
16
16
  /* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/@vaadin/map/node_modules/ol/math.js");
17
17
  /* harmony import */ var _Interaction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Interaction.js */ "./node_modules/@vaadin/map/node_modules/ol/interaction/Interaction.js");
18
18
  /**
@@ -318,7 +318,7 @@ class Link extends _Interaction_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
318
318
  return;
319
319
  }
320
320
  const view = map.getView();
321
- if (!view) {
321
+ if (!view || !view.isDef()) {
322
322
  return;
323
323
  }
324
324
 
@@ -438,7 +438,7 @@ class Link extends _Interaction_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
438
438
  return;
439
439
  }
440
440
  const view = map.getView();
441
- if (!view) {
441
+ if (!view || !view.isDef()) {
442
442
  return;
443
443
  }
444
444
 
@@ -1 +1 @@
1
- {"version":3,"file":"vendors-node_modules_vaadin_map_node_modules_ol_interaction_Link_js.js","mappings":";;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AAC8C;AACC;AACI;AAChB;AACQ;;AAE3C;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA,SAAS,iDAAO;AAChB;;AAEA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,eAAe;AAC1B,WAAW,eAAe;AAC1B,YAAY,SAAS;AACrB;AACA;AACA;AACA;;AAEA,cAAc,qBAAqB;;AAEnC;AACA,aAAa,uBAAuB;AACpC;;AAEA;AACA,aAAa,QAAQ;AACrB,cAAc,+CAA+C;AAC7D,cAAc,eAAe;AAC7B;AACA,cAAc,SAAS;AACvB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uDAAW;AAC9B;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,mBAAmB;AACnB;;AAEA;AACA;AACA,0BAA0B;AAC1B,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI;;AAET;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,kCAAkC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,6BAA6B;AAC1C;AACA;AACA;AACA;AACA,MAAM,kDAAM,MAAM,gEAAoB;AACtC,MAAM,kDAAM,sBAAsB,mEAAgB;AAClD,MAAM,kDAAM;AACZ;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,6BAA6B;AAC1C;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D,MAAM,yDAAa;AACnB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,KAAK;AAClB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA,iEAAe,IAAI,EAAC","sources":["webpack://@vaadin/bundles/./node_modules/@vaadin/map/node_modules/ol/interaction/Link.js"],"sourcesContent":["/**\n * @module ol/interaction/Link\n */\nimport MapEventType from '../MapEventType.js';\nimport EventType from '../events/EventType.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {toFixed} from '../math.js';\nimport Interaction from './Interaction.js';\n\n/**\n * @param {number} number A number.\n * @return {number} A number with at most 5 decimal places.\n */\nfunction to5(number) {\n return toFixed(number, 5);\n}\n\n/**\n * @param {string} string A string.\n * @return {number} A number representing the string.\n */\nfunction readNumber(string) {\n return parseFloat(string);\n}\n\n/**\n * @param {number} number A number.\n * @return {string} A string representing the number.\n */\nfunction writeNumber(number) {\n return to5(number).toString();\n}\n\n/**\n * @param {number} a A number.\n * @param {number} b A number.\n * @return {boolean} The numbers are different.\n */\nfunction differentNumber(a, b) {\n if (isNaN(a)) {\n return false;\n }\n return a !== readNumber(writeNumber(b));\n}\n\n/**\n * @param {Array<number>} a An array of two numbers.\n * @param {Array<number>} b An array of two numbers.\n * @return {boolean} The arrays are different.\n */\nfunction differentArray(a, b) {\n return differentNumber(a[0], b[0]) || differentNumber(a[1], b[1]);\n}\n\n/** @typedef {'x'|'y'|'z'|'r'|'l'} Params */\n\n/**\n * @typedef {function(string):void} Callback\n */\n\n/**\n * @typedef {Object} Options\n * @property {boolean|import('../View.js').AnimationOptions} [animate=true] Animate view transitions.\n * @property {Array<Params>} [params=['x', 'y', 'z', 'r', 'l']] Properties to track. Default is to track\n * `x` (center x), `y` (center y), `z` (zoom), `r` (rotation) and `l` (layers).\n * @property {boolean} [replace=false] Replace the current URL without creating the new entry in browser history.\n * By default, changes in the map state result in a new entry being added to the browser history.\n * @property {string} [prefix=''] By default, the URL will be updated with search parameters x, y, z, and r. To\n * avoid collisions with existing search parameters that your application uses, you can supply a custom prefix for\n * the ones used by this interaction (e.g. 'ol:').\n */\n\n/**\n * @classdesc\n * An interaction that synchronizes the map state with the URL.\n *\n * @api\n */\nclass Link extends Interaction {\n /**\n * @param {Options} [options] Link options.\n */\n constructor(options) {\n super();\n\n options = Object.assign(\n {\n animate: true,\n params: ['x', 'y', 'z', 'r', 'l'],\n replace: false,\n prefix: '',\n },\n options || {},\n );\n\n let animationOptions;\n if (options.animate === true) {\n animationOptions = {duration: 250};\n } else if (!options.animate) {\n animationOptions = null;\n } else {\n animationOptions = options.animate;\n }\n\n /**\n * @type {import('../View.js').AnimationOptions|null}\n * @private\n */\n this.animationOptions_ = animationOptions;\n\n /**\n * @type {Object<Params, boolean>}\n * @private\n */\n this.params_ = options.params.reduce((acc, value) => {\n acc[value] = true;\n return acc;\n }, {});\n\n /**\n * @private\n * @type {boolean}\n */\n this.replace_ = options.replace;\n\n /**\n * @private\n * @type {string}\n */\n this.prefix_ = options.prefix;\n\n /**\n * @private\n * @type {!Array<import(\"../events.js\").EventsKey>}\n */\n this.listenerKeys_ = [];\n\n /**\n * @private\n * @type {boolean}\n */\n this.initial_ = true;\n\n /**\n * @private\n */\n this.updateState_ = this.updateState_.bind(this);\n\n /**\n * The tracked parameter callbacks.\n * @private\n * @type {Object<string, Callback>}\n */\n this.trackedCallbacks_ = {};\n\n /**\n * The tracked parameter values.\n * @private\n * @type {Object<string, string|null>}\n */\n this.trackedValues_ = {};\n }\n\n /**\n * @private\n * @param {string} name A parameter name.\n * @return {string} A name with the prefix applied.\n */\n getParamName_(name) {\n if (!this.prefix_) {\n return name;\n }\n return this.prefix_ + name;\n }\n\n /**\n * @private\n * @param {URLSearchParams} params The search params.\n * @param {string} name The unprefixed parameter name.\n * @return {string|null} The parameter value.\n */\n get_(params, name) {\n return params.get(this.getParamName_(name));\n }\n\n /**\n * @private\n * @param {URLSearchParams} params The search params.\n * @param {string} name The unprefixed parameter name.\n * @param {string} value The param value.\n */\n set_(params, name, value) {\n if (!(name in this.params_)) {\n return;\n }\n params.set(this.getParamName_(name), value);\n }\n\n /**\n * @private\n * @param {URLSearchParams} params The search params.\n * @param {string} name The unprefixed parameter name.\n */\n delete_(params, name) {\n if (!(name in this.params_)) {\n return;\n }\n params.delete(this.getParamName_(name));\n }\n\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n * @override\n */\n setMap(map) {\n const oldMap = this.getMap();\n super.setMap(map);\n if (map === oldMap) {\n return;\n }\n if (oldMap) {\n this.unregisterListeners_(oldMap);\n }\n if (map) {\n this.initial_ = true;\n this.updateState_();\n this.registerListeners_(map);\n }\n }\n\n /**\n * @param {import(\"../Map.js\").default} map Map.\n * @private\n */\n registerListeners_(map) {\n this.listenerKeys_.push(\n listen(map, MapEventType.MOVEEND, this.updateUrl_, this),\n listen(map.getLayerGroup(), EventType.CHANGE, this.updateUrl_, this),\n listen(map, 'change:layergroup', this.handleChangeLayerGroup_, this),\n );\n\n if (!this.replace_) {\n addEventListener('popstate', this.updateState_);\n }\n }\n\n /**\n * @param {import(\"../Map.js\").default} map Map.\n * @private\n */\n unregisterListeners_(map) {\n for (let i = 0, ii = this.listenerKeys_.length; i < ii; ++i) {\n unlistenByKey(this.listenerKeys_[i]);\n }\n this.listenerKeys_.length = 0;\n\n if (!this.replace_) {\n removeEventListener('popstate', this.updateState_);\n }\n\n const url = new URL(window.location.href);\n const params = url.searchParams;\n this.delete_(params, 'x');\n this.delete_(params, 'y');\n this.delete_(params, 'z');\n this.delete_(params, 'r');\n this.delete_(params, 'l');\n window.history.replaceState(null, '', url);\n }\n\n /**\n * @private\n */\n handleChangeLayerGroup_() {\n const map = this.getMap();\n if (!map) {\n return;\n }\n this.unregisterListeners_(map);\n this.registerListeners_(map);\n this.initial_ = true;\n this.updateUrl_();\n }\n\n /**\n * @private\n */\n updateState_() {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n for (const key in this.trackedCallbacks_) {\n const value = params.get(key);\n if (key in this.trackedCallbacks_ && value !== this.trackedValues_[key]) {\n this.trackedValues_[key] = value;\n this.trackedCallbacks_[key](value);\n }\n }\n\n const map = this.getMap();\n if (!map) {\n return;\n }\n const view = map.getView();\n if (!view) {\n return;\n }\n\n let updateView = false;\n\n /**\n * @type {import('../View.js').AnimationOptions}\n */\n const viewProperties = {};\n\n const zoom = readNumber(this.get_(params, 'z'));\n if ('z' in this.params_ && differentNumber(zoom, view.getZoom())) {\n updateView = true;\n viewProperties.zoom = zoom;\n }\n\n const rotation = readNumber(this.get_(params, 'r'));\n if ('r' in this.params_ && differentNumber(rotation, view.getRotation())) {\n updateView = true;\n viewProperties.rotation = rotation;\n }\n\n const center = [\n readNumber(this.get_(params, 'x')),\n readNumber(this.get_(params, 'y')),\n ];\n if (\n ('x' in this.params_ || 'y' in this.params_) &&\n differentArray(center, view.getCenter())\n ) {\n updateView = true;\n viewProperties.center = center;\n }\n\n if (updateView) {\n if (!this.initial_ && this.animationOptions_) {\n view.animate(Object.assign(viewProperties, this.animationOptions_));\n } else {\n if (viewProperties.center) {\n view.setCenter(viewProperties.center);\n }\n if ('zoom' in viewProperties) {\n view.setZoom(viewProperties.zoom);\n }\n if ('rotation' in viewProperties) {\n view.setRotation(viewProperties.rotation);\n }\n }\n }\n\n const layers = map.getAllLayers();\n const layersParam = this.get_(params, 'l');\n if (\n 'l' in this.params_ &&\n layersParam &&\n layersParam.length === layers.length\n ) {\n for (let i = 0, ii = layers.length; i < ii; ++i) {\n const value = parseInt(layersParam[i]);\n if (!isNaN(value)) {\n const visible = Boolean(value);\n const layer = layers[i];\n if (layer.getVisible() !== visible) {\n layer.setVisible(visible);\n }\n }\n }\n }\n }\n\n /**\n * Register a listener for a URL search parameter. The callback will be called with a new value\n * when the corresponding search parameter changes due to history events (e.g. browser navigation).\n *\n * @param {string} key The URL search parameter.\n * @param {Callback} callback The function to call when the search parameter changes.\n * @return {string|null} The initial value of the search parameter (or null if absent from the URL).\n * @api\n */\n track(key, callback) {\n this.trackedCallbacks_[key] = callback;\n const url = new URL(window.location.href);\n const params = url.searchParams;\n const value = params.get(key);\n this.trackedValues_[key] = value;\n return value;\n }\n\n /**\n * Update the URL with a new search parameter value. If the value is null, it will be\n * deleted from the search parameters.\n *\n * @param {string} key The URL search parameter.\n * @param {string|null} value The updated value (or null to remove it from the URL).\n * @api\n */\n update(key, value) {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n if (value === null) {\n params.delete(key);\n } else {\n params.set(key, value);\n }\n if (key in this.trackedValues_) {\n this.trackedValues_[key] = value;\n }\n this.updateHistory_(url);\n }\n\n /**\n * @private\n */\n updateUrl_() {\n const map = this.getMap();\n if (!map) {\n return;\n }\n const view = map.getView();\n if (!view) {\n return;\n }\n\n const center = view.getCenter();\n const zoom = view.getZoom();\n const rotation = view.getRotation();\n\n const layers = map.getAllLayers();\n const visibilities = new Array(layers.length);\n for (let i = 0, ii = layers.length; i < ii; ++i) {\n visibilities[i] = layers[i].getVisible() ? '1' : '0';\n }\n\n const url = new URL(window.location.href);\n const params = url.searchParams;\n\n this.set_(params, 'x', writeNumber(center[0]));\n this.set_(params, 'y', writeNumber(center[1]));\n this.set_(params, 'z', writeNumber(zoom));\n this.set_(params, 'r', writeNumber(rotation));\n this.set_(params, 'l', visibilities.join(''));\n\n this.updateHistory_(url);\n this.initial_ = false;\n }\n\n /**\n * @private\n * @param {URL} url The URL.\n */\n updateHistory_(url) {\n if (url.href !== window.location.href) {\n if (this.initial_ || this.replace_) {\n window.history.replaceState(history.state, '', url);\n } else {\n window.history.pushState(null, '', url);\n }\n }\n }\n}\n\nexport default Link;\n"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"vendors-node_modules_vaadin_map_node_modules_ol_interaction_Link_js.js","mappings":";;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AAC8C;AACK;AACJ;AACZ;AACQ;;AAE3C;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA,SAAS,iDAAO;AAChB;;AAEA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,eAAe;AAC1B,WAAW,eAAe;AAC1B,YAAY,SAAS;AACrB;AACA;AACA;AACA;;AAEA,cAAc,qBAAqB;;AAEnC;AACA,aAAa,uBAAuB;AACpC;;AAEA;AACA,aAAa,QAAQ;AACrB,cAAc,+CAA+C;AAC7D,cAAc,eAAe;AAC7B;AACA,cAAc,SAAS;AACvB;AACA,cAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,uDAAW;AAC9B;AACA,aAAa,SAAS;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,mBAAmB;AACnB;;AAEA;AACA;AACA,0BAA0B;AAC1B,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI;;AAET;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,iBAAiB;AAC9B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,kCAAkC;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,aAAa,6BAA6B;AAC1C;AACA;AACA;AACA;AACA,MAAM,kDAAM,MAAM,gEAAoB;AACtC,MAAM,kDAAM,sBAAsB,mEAAgB;AAClD,MAAM,kDAAM;AACZ;;AAEA;AACA;AACA;AACA;;AAEA;AACA,aAAa,6BAA6B;AAC1C;AACA;AACA;AACA,oDAAoD,QAAQ;AAC5D,MAAM,yDAAa;AACnB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,cAAc,aAAa;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,wCAAwC,QAAQ;AAChD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,KAAK;AAClB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;;AAEA,iEAAe,IAAI,EAAC","sources":["webpack://@vaadin/bundles/./node_modules/@vaadin/map/node_modules/ol/interaction/Link.js"],"sourcesContent":["/**\n * @module ol/interaction/Link\n */\nimport MapEventType from '../MapEventType.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport EventType from '../events/EventType.js';\nimport {toFixed} from '../math.js';\nimport Interaction from './Interaction.js';\n\n/**\n * @param {number} number A number.\n * @return {number} A number with at most 5 decimal places.\n */\nfunction to5(number) {\n return toFixed(number, 5);\n}\n\n/**\n * @param {string} string A string.\n * @return {number} A number representing the string.\n */\nfunction readNumber(string) {\n return parseFloat(string);\n}\n\n/**\n * @param {number} number A number.\n * @return {string} A string representing the number.\n */\nfunction writeNumber(number) {\n return to5(number).toString();\n}\n\n/**\n * @param {number} a A number.\n * @param {number} b A number.\n * @return {boolean} The numbers are different.\n */\nfunction differentNumber(a, b) {\n if (isNaN(a)) {\n return false;\n }\n return a !== readNumber(writeNumber(b));\n}\n\n/**\n * @param {Array<number>} a An array of two numbers.\n * @param {Array<number>} b An array of two numbers.\n * @return {boolean} The arrays are different.\n */\nfunction differentArray(a, b) {\n return differentNumber(a[0], b[0]) || differentNumber(a[1], b[1]);\n}\n\n/** @typedef {'x'|'y'|'z'|'r'|'l'} Params */\n\n/**\n * @typedef {function(string):void} Callback\n */\n\n/**\n * @typedef {Object} Options\n * @property {boolean|import('../View.js').AnimationOptions} [animate=true] Animate view transitions.\n * @property {Array<Params>} [params=['x', 'y', 'z', 'r', 'l']] Properties to track. Default is to track\n * `x` (center x), `y` (center y), `z` (zoom), `r` (rotation) and `l` (layers).\n * @property {boolean} [replace=false] Replace the current URL without creating the new entry in browser history.\n * By default, changes in the map state result in a new entry being added to the browser history.\n * @property {string} [prefix=''] By default, the URL will be updated with search parameters x, y, z, and r. To\n * avoid collisions with existing search parameters that your application uses, you can supply a custom prefix for\n * the ones used by this interaction (e.g. 'ol:').\n */\n\n/**\n * @classdesc\n * An interaction that synchronizes the map state with the URL.\n *\n * @api\n */\nclass Link extends Interaction {\n /**\n * @param {Options} [options] Link options.\n */\n constructor(options) {\n super();\n\n options = Object.assign(\n {\n animate: true,\n params: ['x', 'y', 'z', 'r', 'l'],\n replace: false,\n prefix: '',\n },\n options || {},\n );\n\n let animationOptions;\n if (options.animate === true) {\n animationOptions = {duration: 250};\n } else if (!options.animate) {\n animationOptions = null;\n } else {\n animationOptions = options.animate;\n }\n\n /**\n * @type {import('../View.js').AnimationOptions|null}\n * @private\n */\n this.animationOptions_ = animationOptions;\n\n /**\n * @type {Object<Params, boolean>}\n * @private\n */\n this.params_ = options.params.reduce((acc, value) => {\n acc[value] = true;\n return acc;\n }, {});\n\n /**\n * @private\n * @type {boolean}\n */\n this.replace_ = options.replace;\n\n /**\n * @private\n * @type {string}\n */\n this.prefix_ = options.prefix;\n\n /**\n * @private\n * @type {!Array<import(\"../events.js\").EventsKey>}\n */\n this.listenerKeys_ = [];\n\n /**\n * @private\n * @type {boolean}\n */\n this.initial_ = true;\n\n /**\n * @private\n */\n this.updateState_ = this.updateState_.bind(this);\n\n /**\n * The tracked parameter callbacks.\n * @private\n * @type {Object<string, Callback>}\n */\n this.trackedCallbacks_ = {};\n\n /**\n * The tracked parameter values.\n * @private\n * @type {Object<string, string|null>}\n */\n this.trackedValues_ = {};\n }\n\n /**\n * @private\n * @param {string} name A parameter name.\n * @return {string} A name with the prefix applied.\n */\n getParamName_(name) {\n if (!this.prefix_) {\n return name;\n }\n return this.prefix_ + name;\n }\n\n /**\n * @private\n * @param {URLSearchParams} params The search params.\n * @param {string} name The unprefixed parameter name.\n * @return {string|null} The parameter value.\n */\n get_(params, name) {\n return params.get(this.getParamName_(name));\n }\n\n /**\n * @private\n * @param {URLSearchParams} params The search params.\n * @param {string} name The unprefixed parameter name.\n * @param {string} value The param value.\n */\n set_(params, name, value) {\n if (!(name in this.params_)) {\n return;\n }\n params.set(this.getParamName_(name), value);\n }\n\n /**\n * @private\n * @param {URLSearchParams} params The search params.\n * @param {string} name The unprefixed parameter name.\n */\n delete_(params, name) {\n if (!(name in this.params_)) {\n return;\n }\n params.delete(this.getParamName_(name));\n }\n\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n * @override\n */\n setMap(map) {\n const oldMap = this.getMap();\n super.setMap(map);\n if (map === oldMap) {\n return;\n }\n if (oldMap) {\n this.unregisterListeners_(oldMap);\n }\n if (map) {\n this.initial_ = true;\n this.updateState_();\n this.registerListeners_(map);\n }\n }\n\n /**\n * @param {import(\"../Map.js\").default} map Map.\n * @private\n */\n registerListeners_(map) {\n this.listenerKeys_.push(\n listen(map, MapEventType.MOVEEND, this.updateUrl_, this),\n listen(map.getLayerGroup(), EventType.CHANGE, this.updateUrl_, this),\n listen(map, 'change:layergroup', this.handleChangeLayerGroup_, this),\n );\n\n if (!this.replace_) {\n addEventListener('popstate', this.updateState_);\n }\n }\n\n /**\n * @param {import(\"../Map.js\").default} map Map.\n * @private\n */\n unregisterListeners_(map) {\n for (let i = 0, ii = this.listenerKeys_.length; i < ii; ++i) {\n unlistenByKey(this.listenerKeys_[i]);\n }\n this.listenerKeys_.length = 0;\n\n if (!this.replace_) {\n removeEventListener('popstate', this.updateState_);\n }\n\n const url = new URL(window.location.href);\n const params = url.searchParams;\n this.delete_(params, 'x');\n this.delete_(params, 'y');\n this.delete_(params, 'z');\n this.delete_(params, 'r');\n this.delete_(params, 'l');\n window.history.replaceState(null, '', url);\n }\n\n /**\n * @private\n */\n handleChangeLayerGroup_() {\n const map = this.getMap();\n if (!map) {\n return;\n }\n this.unregisterListeners_(map);\n this.registerListeners_(map);\n this.initial_ = true;\n this.updateUrl_();\n }\n\n /**\n * @private\n */\n updateState_() {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n for (const key in this.trackedCallbacks_) {\n const value = params.get(key);\n if (key in this.trackedCallbacks_ && value !== this.trackedValues_[key]) {\n this.trackedValues_[key] = value;\n this.trackedCallbacks_[key](value);\n }\n }\n\n const map = this.getMap();\n if (!map) {\n return;\n }\n const view = map.getView();\n if (!view || !view.isDef()) {\n return;\n }\n\n let updateView = false;\n\n /**\n * @type {import('../View.js').AnimationOptions}\n */\n const viewProperties = {};\n\n const zoom = readNumber(this.get_(params, 'z'));\n if ('z' in this.params_ && differentNumber(zoom, view.getZoom())) {\n updateView = true;\n viewProperties.zoom = zoom;\n }\n\n const rotation = readNumber(this.get_(params, 'r'));\n if ('r' in this.params_ && differentNumber(rotation, view.getRotation())) {\n updateView = true;\n viewProperties.rotation = rotation;\n }\n\n const center = [\n readNumber(this.get_(params, 'x')),\n readNumber(this.get_(params, 'y')),\n ];\n if (\n ('x' in this.params_ || 'y' in this.params_) &&\n differentArray(center, view.getCenter())\n ) {\n updateView = true;\n viewProperties.center = center;\n }\n\n if (updateView) {\n if (!this.initial_ && this.animationOptions_) {\n view.animate(Object.assign(viewProperties, this.animationOptions_));\n } else {\n if (viewProperties.center) {\n view.setCenter(viewProperties.center);\n }\n if ('zoom' in viewProperties) {\n view.setZoom(viewProperties.zoom);\n }\n if ('rotation' in viewProperties) {\n view.setRotation(viewProperties.rotation);\n }\n }\n }\n\n const layers = map.getAllLayers();\n const layersParam = this.get_(params, 'l');\n if (\n 'l' in this.params_ &&\n layersParam &&\n layersParam.length === layers.length\n ) {\n for (let i = 0, ii = layers.length; i < ii; ++i) {\n const value = parseInt(layersParam[i]);\n if (!isNaN(value)) {\n const visible = Boolean(value);\n const layer = layers[i];\n if (layer.getVisible() !== visible) {\n layer.setVisible(visible);\n }\n }\n }\n }\n }\n\n /**\n * Register a listener for a URL search parameter. The callback will be called with a new value\n * when the corresponding search parameter changes due to history events (e.g. browser navigation).\n *\n * @param {string} key The URL search parameter.\n * @param {Callback} callback The function to call when the search parameter changes.\n * @return {string|null} The initial value of the search parameter (or null if absent from the URL).\n * @api\n */\n track(key, callback) {\n this.trackedCallbacks_[key] = callback;\n const url = new URL(window.location.href);\n const params = url.searchParams;\n const value = params.get(key);\n this.trackedValues_[key] = value;\n return value;\n }\n\n /**\n * Update the URL with a new search parameter value. If the value is null, it will be\n * deleted from the search parameters.\n *\n * @param {string} key The URL search parameter.\n * @param {string|null} value The updated value (or null to remove it from the URL).\n * @api\n */\n update(key, value) {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n if (value === null) {\n params.delete(key);\n } else {\n params.set(key, value);\n }\n if (key in this.trackedValues_) {\n this.trackedValues_[key] = value;\n }\n this.updateHistory_(url);\n }\n\n /**\n * @private\n */\n updateUrl_() {\n const map = this.getMap();\n if (!map) {\n return;\n }\n const view = map.getView();\n if (!view || !view.isDef()) {\n return;\n }\n\n const center = view.getCenter();\n const zoom = view.getZoom();\n const rotation = view.getRotation();\n\n const layers = map.getAllLayers();\n const visibilities = new Array(layers.length);\n for (let i = 0, ii = layers.length; i < ii; ++i) {\n visibilities[i] = layers[i].getVisible() ? '1' : '0';\n }\n\n const url = new URL(window.location.href);\n const params = url.searchParams;\n\n this.set_(params, 'x', writeNumber(center[0]));\n this.set_(params, 'y', writeNumber(center[1]));\n this.set_(params, 'z', writeNumber(zoom));\n this.set_(params, 'r', writeNumber(rotation));\n this.set_(params, 'l', visibilities.join(''));\n\n this.updateHistory_(url);\n this.initial_ = false;\n }\n\n /**\n * @private\n * @param {URL} url The URL.\n */\n updateHistory_(url) {\n if (url.href !== window.location.href) {\n if (this.initial_ || this.replace_) {\n window.history.replaceState(history.state, '', url);\n } else {\n window.history.pushState(null, '', url);\n }\n }\n }\n}\n\nexport default Link;\n"],"names":[],"sourceRoot":""}