react-spatial 1.2.0-beta.9 → 1.2.3-beta.1

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 (186) hide show
  1. package/README.md +4 -0
  2. package/components/BaseLayerSwitcher/BaseLayerSwitcher.js +163 -221
  3. package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +7 -1
  4. package/components/BaseLayerSwitcher/index.js +1 -3
  5. package/components/BaseLayerSwitcher/index.js.map +7 -1
  6. package/components/BasicMap/BasicMap.js +147 -285
  7. package/components/BasicMap/BasicMap.js.map +7 -1
  8. package/components/BasicMap/index.js +1 -3
  9. package/components/BasicMap/index.js.map +7 -1
  10. package/components/CanvasSaveButton/CanvasSaveButton.js +165 -419
  11. package/components/CanvasSaveButton/CanvasSaveButton.js.map +7 -1
  12. package/components/CanvasSaveButton/index.js +1 -3
  13. package/components/CanvasSaveButton/index.js.map +7 -1
  14. package/components/Copyright/Copyright.js +29 -70
  15. package/components/Copyright/Copyright.js.map +7 -1
  16. package/components/Copyright/index.js +1 -3
  17. package/components/Copyright/index.js.map +7 -1
  18. package/components/FeatureExportButton/FeatureExportButton.js +40 -106
  19. package/components/FeatureExportButton/FeatureExportButton.js.map +7 -1
  20. package/components/FeatureExportButton/index.js +1 -3
  21. package/components/FeatureExportButton/index.js.map +7 -1
  22. package/components/FilterButton/FilterButton.js +41 -106
  23. package/components/FilterButton/FilterButton.js.map +7 -1
  24. package/components/FilterButton/index.js +1 -3
  25. package/components/FilterButton/index.js.map +7 -1
  26. package/components/FitExtent/FitExtent.js +17 -50
  27. package/components/FitExtent/FitExtent.js.map +7 -1
  28. package/components/FitExtent/index.js +1 -3
  29. package/components/FitExtent/index.js.map +7 -1
  30. package/components/FollowButton/FollowButton.js +41 -111
  31. package/components/FollowButton/FollowButton.js.map +7 -1
  32. package/components/FollowButton/index.js +1 -3
  33. package/components/FollowButton/index.js.map +7 -1
  34. package/components/Geolocation/Geolocation.js +104 -213
  35. package/components/Geolocation/Geolocation.js.map +7 -1
  36. package/components/Geolocation/index.js +1 -3
  37. package/components/Geolocation/index.js.map +7 -1
  38. package/components/LayerTree/LayerTree.js +204 -410
  39. package/components/LayerTree/LayerTree.js.map +7 -1
  40. package/components/LayerTree/index.js +1 -3
  41. package/components/LayerTree/index.js.map +7 -1
  42. package/components/MousePosition/MousePosition.js +61 -130
  43. package/components/MousePosition/MousePosition.js.map +7 -1
  44. package/components/MousePosition/index.js +1 -3
  45. package/components/MousePosition/index.js.map +7 -1
  46. package/components/NorthArrow/NorthArrow.js +22 -62
  47. package/components/NorthArrow/NorthArrow.js.map +7 -1
  48. package/components/NorthArrow/index.js +1 -3
  49. package/components/NorthArrow/index.js.map +7 -1
  50. package/components/Overlay/Overlay.js +83 -130
  51. package/components/Overlay/Overlay.js.map +7 -1
  52. package/components/Overlay/index.js +1 -3
  53. package/components/Overlay/index.js.map +7 -1
  54. package/components/Permalink/Permalink.js +149 -245
  55. package/components/Permalink/Permalink.js.map +7 -1
  56. package/components/Permalink/index.js +1 -3
  57. package/components/Permalink/index.js.map +7 -1
  58. package/components/Popup/Popup.js +106 -233
  59. package/components/Popup/Popup.js.map +7 -1
  60. package/components/Popup/index.js +1 -3
  61. package/components/Popup/index.js.map +7 -1
  62. package/components/ResizeHandler/ResizeHandler.js +58 -113
  63. package/components/ResizeHandler/ResizeHandler.js.map +7 -1
  64. package/components/ResizeHandler/index.js +1 -3
  65. package/components/ResizeHandler/index.js.map +7 -1
  66. package/components/RouteSchedule/RouteSchedule.js +150 -282
  67. package/components/RouteSchedule/RouteSchedule.js.map +7 -1
  68. package/components/RouteSchedule/index.js +1 -3
  69. package/components/RouteSchedule/index.js.map +7 -1
  70. package/components/ScaleLine/ScaleLine.js +21 -45
  71. package/components/ScaleLine/ScaleLine.js.map +7 -1
  72. package/components/ScaleLine/index.js +1 -3
  73. package/components/ScaleLine/index.js.map +7 -1
  74. package/components/Search/Search.js +122 -186
  75. package/components/Search/Search.js.map +7 -1
  76. package/components/Search/SearchService.js +45 -69
  77. package/components/Search/SearchService.js.map +7 -1
  78. package/components/Search/engines/Engine.js +18 -25
  79. package/components/Search/engines/Engine.js.map +7 -1
  80. package/components/Search/engines/StopFinder.js +21 -38
  81. package/components/Search/engines/StopFinder.js.map +7 -1
  82. package/components/Search/index.js +3 -6
  83. package/components/Search/index.js.map +7 -1
  84. package/components/StopsFinder/StopsFinder.js +123 -174
  85. package/components/StopsFinder/StopsFinder.js.map +7 -1
  86. package/components/StopsFinder/StopsFinderOption.js +37 -54
  87. package/components/StopsFinder/StopsFinderOption.js.map +7 -1
  88. package/components/StopsFinder/index.js +1 -3
  89. package/components/StopsFinder/index.js.map +7 -1
  90. package/components/TrackerControl/TrackerControl.js +73 -128
  91. package/components/TrackerControl/TrackerControl.js.map +7 -1
  92. package/components/TrackerControl/index.js +1 -3
  93. package/components/TrackerControl/index.js.map +7 -1
  94. package/components/Zoom/Zoom.js +69 -112
  95. package/components/Zoom/Zoom.js.map +7 -1
  96. package/components/Zoom/index.js +1 -3
  97. package/components/Zoom/index.js.map +7 -1
  98. package/package.json +27 -24
  99. package/themes/default/components.scss +0 -1
  100. package/themes/default/examples.scss +0 -1
  101. package/utils/GlobalsForOle.js +63 -64
  102. package/utils/GlobalsForOle.js.map +7 -1
  103. package/utils/KML.js +178 -364
  104. package/utils/KML.js.map +7 -1
  105. package/utils/KMLFormat.js +37 -73
  106. package/utils/KMLFormat.js.map +7 -1
  107. package/utils/Styles.js +24 -32
  108. package/utils/Styles.js.map +7 -1
  109. package/utils/getPolygonPattern.js +11 -44
  110. package/utils/getPolygonPattern.js.map +7 -1
  111. package/utils/timeUtils.js +16 -35
  112. package/utils/timeUtils.js.map +7 -1
  113. package/LayerService.js +0 -193
  114. package/LayerService.js.map +0 -1
  115. package/LayerService.test.js +0 -160
  116. package/LayerService.test.js.map +0 -1
  117. package/Projections.js +0 -16
  118. package/Projections.js.map +0 -1
  119. package/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js +0 -88
  120. package/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js.map +0 -1
  121. package/components/BaseLayerToggler/BaseLayerToggler.js +0 -490
  122. package/components/BaseLayerToggler/BaseLayerToggler.js.map +0 -1
  123. package/components/BaseLayerToggler/BaseLayerToggler.md.scss +0 -9
  124. package/components/BaseLayerToggler/BaseLayerToggler.scss +0 -49
  125. package/components/BaseLayerToggler/BaseLayerToggler.test.js +0 -127
  126. package/components/BaseLayerToggler/BaseLayerToggler.test.js.map +0 -1
  127. package/components/BaseLayerToggler/index.js +0 -3
  128. package/components/BaseLayerToggler/index.js.map +0 -1
  129. package/components/BasicMap/BasicMap.test.js +0 -288
  130. package/components/BasicMap/BasicMap.test.js.map +0 -1
  131. package/components/CanvasSaveButton/CanvasSaveButton.test.js +0 -173
  132. package/components/CanvasSaveButton/CanvasSaveButton.test.js.map +0 -1
  133. package/components/Copyright/Copyright.test.js +0 -133
  134. package/components/Copyright/Copyright.test.js.map +0 -1
  135. package/components/FeatureExportButton/FeatureExportButton.test.js +0 -407
  136. package/components/FeatureExportButton/FeatureExportButton.test.js.map +0 -1
  137. package/components/FilterButton/FilterButton.test.js +0 -48
  138. package/components/FilterButton/FilterButton.test.js.map +0 -1
  139. package/components/FitExtent/FitExtent.test.js +0 -44
  140. package/components/FitExtent/FitExtent.test.js.map +0 -1
  141. package/components/FollowButton/FollowButton.test.js +0 -57
  142. package/components/FollowButton/FollowButton.test.js.map +0 -1
  143. package/components/Geolocation/Geolocation.test.js +0 -263
  144. package/components/Geolocation/Geolocation.test.js.map +0 -1
  145. package/components/LayerTree/LayerTree.test.js +0 -323
  146. package/components/LayerTree/LayerTree.test.js.map +0 -1
  147. package/components/MousePosition/MousePosition.test.js +0 -125
  148. package/components/MousePosition/MousePosition.test.js.map +0 -1
  149. package/components/NorthArrow/NorthArrow.test.js +0 -106
  150. package/components/NorthArrow/NorthArrow.test.js.map +0 -1
  151. package/components/Overlay/Overlay.test.js +0 -145
  152. package/components/Overlay/Overlay.test.js.map +0 -1
  153. package/components/Permalink/Permalink.test.js +0 -267
  154. package/components/Permalink/Permalink.test.js.map +0 -1
  155. package/components/Popup/Popup.test.js +0 -291
  156. package/components/Popup/Popup.test.js.map +0 -1
  157. package/components/ResizeHandler/ResizeHandler.test.js +0 -410
  158. package/components/ResizeHandler/ResizeHandler.test.js.map +0 -1
  159. package/components/RouteSchedule/RouteSchedule.test.js +0 -102
  160. package/components/RouteSchedule/RouteSchedule.test.js.map +0 -1
  161. package/components/ScaleLine/ScaleLine.test.js +0 -32
  162. package/components/ScaleLine/ScaleLine.test.js.map +0 -1
  163. package/components/Search/Search.test.js +0 -15
  164. package/components/Search/Search.test.js.map +0 -1
  165. package/components/StopsFinder/StopsFinder.test.js +0 -19
  166. package/components/StopsFinder/StopsFinder.test.js.map +0 -1
  167. package/components/TrackerControl/TrackerControl.test.js +0 -17
  168. package/components/TrackerControl/TrackerControl.test.js.map +0 -1
  169. package/components/Zoom/Zoom.test.js +0 -150
  170. package/components/Zoom/Zoom.test.js.map +0 -1
  171. package/propTypes.js +0 -55
  172. package/propTypes.js.map +0 -1
  173. package/setupTests.js +0 -5
  174. package/setupTests.js.map +0 -1
  175. package/styleguidist/ComponentsList.js +0 -52
  176. package/styleguidist/ComponentsList.js.map +0 -1
  177. package/styleguidist/StyleGuide.js +0 -253
  178. package/styleguidist/StyleGuide.js.map +0 -1
  179. package/utils/KML.test.js +0 -163
  180. package/utils/KML.test.js.map +0 -1
  181. package/utils/KMLFormat.test.js +0 -22
  182. package/utils/KMLFormat.test.js.map +0 -1
  183. package/utils/getPolygonPattern.test.js +0 -66
  184. package/utils/getPolygonPattern.test.js.map +0 -1
  185. package/utils/timeUtils.test.js +0 -32
  186. package/utils/timeUtils.test.js.map +0 -1
@@ -1,303 +1,207 @@
1
- import { Component } from 'react';
2
- import PropTypes from 'prop-types';
3
- import qs from 'query-string';
4
- import OLMap from 'ol/Map';
5
- import { unByKey } from 'ol/Observable';
6
- import LayerService from '../../LayerService';
7
-
8
- var propTypes = {
9
- /**
10
- * Either 'react-router' history object:
11
- * https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/history.md<br>
12
- * or default fallback as HTML5 History:
13
- * https://developer.mozilla.org/en-US/docs/Web/API/History
14
- */
1
+ import { PureComponent } from "react";
2
+ import PropTypes from "prop-types";
3
+ import qs from "query-string";
4
+ import OLMap from "ol/Map";
5
+ import { unByKey } from "ol/Observable";
6
+ import { Layer, getLayersAsFlatArray } from "mobility-toolbox-js/ol";
7
+ const propTypes = {
15
8
  history: PropTypes.shape({
16
- replace: PropTypes.func,
9
+ replace: PropTypes.func
17
10
  }),
18
-
19
- /**
20
- * Layers provider.
21
- */
22
- layerService: PropTypes.instanceOf(LayerService),
23
-
24
- /**
25
- * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).
26
- */
11
+ layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),
27
12
  map: PropTypes.instanceOf(OLMap),
28
-
29
- /**
30
- * Params to be written in url.
31
- */
32
13
  params: PropTypes.object,
33
-
34
- /**
35
- * Maximum number of decimals allowed for coordinates.
36
- */
37
14
  coordinateDecimals: PropTypes.number,
38
-
39
- /**
40
- * Determine if the layer is hidden in the permalink or not.
41
- *
42
- * @param {object} item The item to hide or not.
43
- *
44
- * @return {bool} true if the item is not displayed in the permalink
45
- */
46
15
  isLayerHidden: PropTypes.func,
47
-
48
- /**
49
- * Custom function to be called when the permalink is updated.
50
- * This property has priority over the history parameter and window.history.replaceState calls.
51
- */
52
- replace: PropTypes.func,
16
+ isBaseLayer: PropTypes.func,
17
+ replace: PropTypes.func
53
18
  };
54
-
55
- var defaultProps = {
19
+ const defaultProps = {
56
20
  history: null,
57
- layerService: null,
21
+ replace: null,
22
+ layers: [],
58
23
  map: null,
59
24
  params: {},
60
25
  coordinateDecimals: 2,
61
- isLayerHidden: function () {
26
+ isLayerHidden: () => {
62
27
  return false;
63
28
  },
64
- replace: null,
29
+ isBaseLayer: (layer) => {
30
+ return layer.get("isBaseLayer");
31
+ }
65
32
  };
66
-
67
- /**
68
- * This component handles permalink logic. Injecting an
69
- * __[ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)__
70
- * will add the *map center* (x, y) and the *zoom* (z) parameters to the permalink.
71
- * Injecting a
72
- * __[layerService](https://github.com/geops/react-spatial/blob/master/src/LayerService.js)__
73
- * (including at least one layer)
74
- * will add the *baselayers* and/or *layers* parameters. Further parameters can
75
- * be added using __params__.
76
- */
77
- var Permalink = /*@__PURE__*/(function (Component) {
78
- function Permalink(props) {
79
- Component.call(this, props);
80
- this.state = {};
81
- this.moveEndRef = null;
82
- this.updateLayers = this.updateLayers.bind(this);
33
+ class Permalink extends PureComponent {
34
+ constructor(props) {
35
+ super(props);
36
+ this.state = { revision: 0 };
37
+ this.onMoveEndRef = null;
38
+ this.onPropertyChangeKeys = [];
83
39
  }
84
-
85
- if ( Component ) Permalink.__proto__ = Component;
86
- Permalink.prototype = Object.create( Component && Component.prototype );
87
- Permalink.prototype.constructor = Permalink;
88
-
89
- Permalink.prototype.componentDidMount = function componentDidMount () {
90
- var this$1 = this;
91
-
92
- var ref = this.props;
93
- var map = ref.map;
94
- var layerService = ref.layerService;
95
- var isLayerHidden = ref.isLayerHidden;
40
+ componentDidMount() {
41
+ const { map, layers, isLayerHidden, isBaseLayer } = this.props;
96
42
  if (map) {
97
- this.moveEndRef = map.on('moveend', function () {
98
- this$1.onMapMoved();
43
+ this.moveEndRef = map.on("moveend", () => {
44
+ this.onMapMoved();
99
45
  });
100
46
  }
101
-
102
- if (layerService) {
103
- this.updateLayerService();
104
-
105
- // set layer visibility based on 'layers' parameter.
106
- var urlParams = qs.parse(window.location.search);
107
-
47
+ if (layers) {
48
+ const urlParams = qs.parse(window.location.search);
108
49
  if (urlParams.layers) {
109
- var visibleLayers = urlParams.layers.split(',');
110
- layerService.getLayersAsFlatArray().forEach(function (l) {
50
+ const visibleLayers = urlParams.layers.split(",");
51
+ getLayersAsFlatArray(layers).forEach((l) => {
111
52
  if (visibleLayers.includes(l.key)) {
112
- l.setVisible(true);
113
- } else if (
114
- !l.isBaseLayer &&
115
- !l.hasVisibleChildren() &&
116
- !isLayerHidden(l)
117
- ) {
118
- l.setVisible(false);
53
+ if (l.setVisible) {
54
+ l.setVisible(true);
55
+ } else {
56
+ l.visible = true;
57
+ }
58
+ } else if (!l.isBaseLayer && !(l.hasVisibleChildren || l.children.some((ll) => {
59
+ return ll.visible;
60
+ })) && !isLayerHidden(l)) {
61
+ if (l.setVisible) {
62
+ l.setVisible(false);
63
+ } else {
64
+ l.visible = false;
65
+ }
119
66
  }
120
67
  });
121
68
  }
122
-
123
- // Set baser layer visibility based on 'baseLayers' parameter.
124
- var visibleBaseLayers = (urlParams.baselayers || '').split(',');
125
- layerService.getBaseLayers().forEach(function (baseLayer) {
69
+ const visibleBaseLayers = (urlParams.baselayers || "").split(",");
70
+ getLayersAsFlatArray(layers).filter(isBaseLayer).forEach((baseLayer) => {
126
71
  if (baseLayer.key === visibleBaseLayers[0]) {
127
- baseLayer.setVisible(true); // The radio group will hide the others baseLayers automatically
72
+ if (baseLayer.setVisible) {
73
+ baseLayer.setVisible(true);
74
+ } else {
75
+ baseLayer.visible = true;
76
+ }
128
77
  }
129
78
  });
79
+ this.updateLayers();
130
80
  }
131
- };
132
-
133
- Permalink.prototype.componentDidUpdate = function componentDidUpdate (prevProps) {
134
- var this$1 = this;
135
-
136
- var ref = this.props;
137
- var map = ref.map;
138
- var layerService = ref.layerService;
139
-
140
- if (layerService !== prevProps.layerService) {
141
- this.updateLayerService();
81
+ }
82
+ componentDidUpdate(prevProps, prevState) {
83
+ const { map, layers } = this.props;
84
+ const { revision } = this.state;
85
+ if (layers !== prevProps.layers || revision !== prevState.revision) {
86
+ this.updateLayers();
142
87
  }
143
-
144
88
  if (map !== prevProps.map) {
145
- this.moveEndRef = map.on('moveend', function () {
146
- return this$1.onMapMoved();
89
+ unByKey(this.moveEndRef);
90
+ this.moveEndRef = map.on("moveend", () => {
91
+ return this.onMapMoved();
147
92
  });
148
93
  }
149
-
150
94
  this.updateHistory();
151
- };
152
-
153
- Permalink.prototype.componentWillUnmount = function componentWillUnmount () {
154
- var ref = this.props;
155
- var layerService = ref.layerService;
156
- var map = ref.map;
157
-
95
+ }
96
+ componentWillUnmount() {
97
+ const { map } = this.props;
158
98
  if (map) {
159
99
  unByKey(this.moveEndRef);
160
100
  }
161
-
162
- if (layerService) {
163
- layerService.un('change:layers', this.updateLayers);
164
- layerService.un('change:visible', this.updateLayers);
165
- }
166
- };
167
-
168
- Permalink.prototype.onMapMoved = function onMapMoved () {
169
- var ref = this.props;
170
- var map = ref.map;
171
- var mapView = map.getView();
172
- var center = mapView.getCenter();
173
- var params = {};
174
-
175
- if (
176
- center !== undefined &&
177
- center[0] !== undefined &&
178
- center[1] !== undefined
179
- ) {
101
+ unByKey(this.onPropertyChangeKeys);
102
+ this.onPropertyChangeKeys = [];
103
+ }
104
+ onMapMoved() {
105
+ const { map } = this.props;
106
+ const mapView = map.getView();
107
+ const center = mapView.getCenter();
108
+ const params = {};
109
+ if (center !== void 0 && center[0] !== void 0 && center[1] !== void 0) {
180
110
  params.x = this.roundCoord(center[0]);
181
111
  params.y = this.roundCoord(center[1]);
182
112
  }
183
-
184
- this.setState(Object.assign({}, params,
185
- // rounds zoom to two digits max.
186
- {z: +((Math.round(((parseFloat(mapView.getZoom())) + "e+2"))) + "e-2")}));
187
- };
188
-
189
- Permalink.prototype.roundCoord = function roundCoord (val) {
190
- var ref = this.props;
191
- var coordinateDecimals = ref.coordinateDecimals;
113
+ this.setState({
114
+ ...params,
115
+ z: +`${Math.round(`${parseFloat(mapView.getZoom())}e+2`)}e-2`
116
+ });
117
+ }
118
+ roundCoord(val) {
119
+ const { coordinateDecimals } = this.props;
192
120
  return parseFloat(val.toFixed(coordinateDecimals));
193
- };
194
-
195
- Permalink.prototype.updateLayerService = function updateLayerService () {
196
- var ref = this.props;
197
- var layerService = ref.layerService;
198
- if (layerService) {
199
- layerService.un('change:visible', this.updateState);
200
- layerService.un('change:layers', this.updateLayers);
201
- this.updateLayers();
202
- layerService.on('change:layers', this.updateLayers);
203
- layerService.on('change:visible', this.updateLayers);
204
- }
205
- };
206
-
207
- Permalink.prototype.updateLayers = function updateLayers () {
208
- var ref = this.props;
209
- var layerService = ref.layerService;
210
- var isLayerHidden = ref.isLayerHidden;
211
- var baseLayers = layerService.getBaseLayers();
212
- var idx = baseLayers.findIndex(function (l) {
121
+ }
122
+ updateLayers() {
123
+ const { layers, isLayerHidden, isBaseLayer } = this.props;
124
+ const { revision } = this.state;
125
+ const rootLayer = new Layer({ children: layers });
126
+ unByKey(this.onPropertyChangeKeys);
127
+ getLayersAsFlatArray(rootLayer).forEach((layer) => {
128
+ this.onPropertyChangeKeys.push(
129
+ layer.on("change:visible", () => {
130
+ this.setState({ revision: revision + 1 });
131
+ })
132
+ );
133
+ });
134
+ const baseLayers = getLayersAsFlatArray(rootLayer).filter(isBaseLayer);
135
+ const idx = baseLayers.findIndex((l) => {
213
136
  return l.visible;
214
137
  });
215
138
  if (idx !== -1) {
216
- var baseLayerVisible = baseLayers.splice(idx, 1);
139
+ const baseLayerVisible = baseLayers.splice(idx, 1);
217
140
  baseLayers.unshift(baseLayerVisible[0]);
218
141
  }
219
-
220
- this.setState({
221
- layers: layerService
222
- .getLayersAsFlatArray()
223
- .filter(function (l) {
224
- return (
225
- !l.isBaseLayer &&
226
- l.visible &&
227
- (!l.hasVisibleChildren() ||
228
- (l.children || []).every(function (child) {
229
- return isLayerHidden(child);
230
- })) &&
231
- !isLayerHidden(l)
232
- );
233
- })
234
- .map(function (l) {
235
- return l.key;
236
- })
237
- .join(),
238
- baselayers:
239
- baseLayers.length > 1
240
- ? baseLayers
241
- .map(function (l) {
242
- return l.key;
243
- })
244
- .join()
245
- : undefined,
246
- });
247
- };
248
-
249
- Permalink.prototype.updateHistory = function updateHistory () {
250
- var ref = this.props;
251
- var params = ref.params;
252
- var history = ref.history;
253
- var replace = ref.replace;
254
- var oldParams = qs.parse(window.location.search);
255
- var parameters = Object.assign({}, oldParams, this.state, params);
256
-
257
- // Remove parameters that are undefined or null
258
- Object.entries(parameters).forEach(function (ref) {
259
- var key = ref[0];
260
- var value = ref[1];
261
-
262
- if (value === undefined || value === null) {
142
+ const layersParam = getLayersAsFlatArray(layers).filter((l) => {
143
+ const children = l.children || [];
144
+ const allChildrenHidden = children.every((child) => {
145
+ return isLayerHidden(child);
146
+ });
147
+ const hasVisibleChildren = children.some((child) => {
148
+ return child.visible;
149
+ });
150
+ return !isBaseLayer(l) && !isLayerHidden(l) && l.visible && (!hasVisibleChildren || allChildrenHidden);
151
+ }).map((l) => {
152
+ return l.key;
153
+ }).join();
154
+ const baseLayersParam = baseLayers.length > 1 ? baseLayers.sort((a, b) => {
155
+ if (a.visible === b.visible) {
156
+ return 0;
157
+ }
158
+ if (a.visible && !b.visible) {
159
+ return -1;
160
+ }
161
+ return 1;
162
+ }).map((l) => {
163
+ return l.key;
164
+ }).join() : void 0;
165
+ const state = {};
166
+ if (layers?.length) {
167
+ state.layers = layersParam;
168
+ }
169
+ if (baseLayers?.length) {
170
+ state.baselayers = baseLayersParam;
171
+ }
172
+ this.setState(state);
173
+ }
174
+ updateHistory() {
175
+ const { params, history, replace } = this.props;
176
+ const oldParams = qs.parse(window.location.search);
177
+ const parameters = { ...oldParams, ...this.state, ...params };
178
+ delete parameters.revision;
179
+ Object.entries(parameters).forEach(([key, value]) => {
180
+ if (value === void 0 || value === null) {
263
181
  delete parameters[key];
264
182
  }
265
183
  });
266
-
267
- // encodeURI to encode spaces, accents, etc. but not characters like ;,/?:@&=+$-_.!~*'()
268
- var qStr = encodeURI(qs.stringify(parameters, { encode: false }));
269
- var search = qStr ? ("?" + qStr) : '';
270
-
271
- if (
272
- (!qStr && window.location.search) ||
273
- (qStr && search !== window.location.search)
274
- ) {
184
+ const qStr = encodeURI(qs.stringify(parameters, { encode: false }));
185
+ const search = qStr ? `?${qStr}` : "";
186
+ if (!qStr && window.location.search || qStr && search !== window.location.search) {
275
187
  if (replace) {
276
- replace({ parameters: parameters, search: search });
188
+ replace({ parameters, search });
277
189
  } else if (history) {
278
- history.replace({ search: search });
190
+ history.replace({ search });
279
191
  } else {
280
- var ref$1 = window.location;
281
- var hash = ref$1.hash;
192
+ const { hash } = window.location;
282
193
  window.history.replaceState(
283
- undefined,
284
- undefined,
285
- ("" + search + (hash || ''))
194
+ void 0,
195
+ void 0,
196
+ `${search}${hash || ""}`
286
197
  );
287
198
  }
288
199
  }
289
- };
290
-
291
- Permalink.prototype.render = function render () {
200
+ }
201
+ render() {
292
202
  return null;
293
- };
294
-
295
- return Permalink;
296
- }(Component));
297
-
203
+ }
204
+ }
298
205
  Permalink.propTypes = propTypes;
299
206
  Permalink.defaultProps = defaultProps;
300
-
301
207
  export default Permalink;
302
-
303
- //# sourceMappingURL=Permalink.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"Permalink.js","sources":["../../../src/components/Permalink/Permalink.js"],"sourcesContent":["import { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport qs from 'query-string';\nimport OLMap from 'ol/Map';\nimport { unByKey } from 'ol/Observable';\nimport LayerService from '../../LayerService';\n\nconst propTypes = {\n /**\n * Either 'react-router' history object:\n * https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/history.md<br>\n * or default fallback as HTML5 History:\n * https://developer.mozilla.org/en-US/docs/Web/API/History\n */\n history: PropTypes.shape({\n replace: PropTypes.func,\n }),\n\n /**\n * Layers provider.\n */\n layerService: PropTypes.instanceOf(LayerService),\n\n /**\n * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).\n */\n map: PropTypes.instanceOf(OLMap),\n\n /**\n * Params to be written in url.\n */\n params: PropTypes.object,\n\n /**\n * Maximum number of decimals allowed for coordinates.\n */\n coordinateDecimals: PropTypes.number,\n\n /**\n * Determine if the layer is hidden in the permalink or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the permalink\n */\n isLayerHidden: PropTypes.func,\n\n /**\n * Custom function to be called when the permalink is updated.\n * This property has priority over the history parameter and window.history.replaceState calls.\n */\n replace: PropTypes.func,\n};\n\nconst defaultProps = {\n history: null,\n layerService: null,\n map: null,\n params: {},\n coordinateDecimals: 2,\n isLayerHidden: () => {\n return false;\n },\n replace: null,\n};\n\n/**\n * This component handles permalink logic. Injecting an\n * __[ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)__\n * will add the *map center* (x, y) and the *zoom* (z) parameters to the permalink.\n * Injecting a\n * __[layerService](https://github.com/geops/react-spatial/blob/master/src/LayerService.js)__\n * (including at least one layer)\n * will add the *baselayers* and/or *layers* parameters. Further parameters can\n * be added using __params__.\n */\nclass Permalink extends Component {\n constructor(props) {\n super(props);\n this.state = {};\n this.moveEndRef = null;\n this.updateLayers = this.updateLayers.bind(this);\n }\n\n componentDidMount() {\n const { map, layerService, isLayerHidden } = this.props;\n if (map) {\n this.moveEndRef = map.on('moveend', () => {\n this.onMapMoved();\n });\n }\n\n if (layerService) {\n this.updateLayerService();\n\n // set layer visibility based on 'layers' parameter.\n const urlParams = qs.parse(window.location.search);\n\n if (urlParams.layers) {\n const visibleLayers = urlParams.layers.split(',');\n layerService.getLayersAsFlatArray().forEach((l) => {\n if (visibleLayers.includes(l.key)) {\n l.setVisible(true);\n } else if (\n !l.isBaseLayer &&\n !l.hasVisibleChildren() &&\n !isLayerHidden(l)\n ) {\n l.setVisible(false);\n }\n });\n }\n\n // Set baser layer visibility based on 'baseLayers' parameter.\n const visibleBaseLayers = (urlParams.baselayers || '').split(',');\n layerService.getBaseLayers().forEach((baseLayer) => {\n if (baseLayer.key === visibleBaseLayers[0]) {\n baseLayer.setVisible(true); // The radio group will hide the others baseLayers automatically\n }\n });\n }\n }\n\n componentDidUpdate(prevProps) {\n const { map, layerService } = this.props;\n\n if (layerService !== prevProps.layerService) {\n this.updateLayerService();\n }\n\n if (map !== prevProps.map) {\n this.moveEndRef = map.on('moveend', () => {\n return this.onMapMoved();\n });\n }\n\n this.updateHistory();\n }\n\n componentWillUnmount() {\n const { layerService, map } = this.props;\n\n if (map) {\n unByKey(this.moveEndRef);\n }\n\n if (layerService) {\n layerService.un('change:layers', this.updateLayers);\n layerService.un('change:visible', this.updateLayers);\n }\n }\n\n onMapMoved() {\n const { map } = this.props;\n const mapView = map.getView();\n const center = mapView.getCenter();\n const params = {};\n\n if (\n center !== undefined &&\n center[0] !== undefined &&\n center[1] !== undefined\n ) {\n params.x = this.roundCoord(center[0]);\n params.y = this.roundCoord(center[1]);\n }\n\n this.setState({\n ...params,\n // rounds zoom to two digits max.\n z: +`${Math.round(`${parseFloat(mapView.getZoom())}e+2`)}e-2`,\n });\n }\n\n roundCoord(val) {\n const { coordinateDecimals } = this.props;\n return parseFloat(val.toFixed(coordinateDecimals));\n }\n\n updateLayerService() {\n const { layerService } = this.props;\n if (layerService) {\n layerService.un('change:visible', this.updateState);\n layerService.un('change:layers', this.updateLayers);\n this.updateLayers();\n layerService.on('change:layers', this.updateLayers);\n layerService.on('change:visible', this.updateLayers);\n }\n }\n\n updateLayers() {\n const { layerService, isLayerHidden } = this.props;\n const baseLayers = layerService.getBaseLayers();\n const idx = baseLayers.findIndex((l) => {\n return l.visible;\n });\n if (idx !== -1) {\n const baseLayerVisible = baseLayers.splice(idx, 1);\n baseLayers.unshift(baseLayerVisible[0]);\n }\n\n this.setState({\n layers: layerService\n .getLayersAsFlatArray()\n .filter((l) => {\n return (\n !l.isBaseLayer &&\n l.visible &&\n (!l.hasVisibleChildren() ||\n (l.children || []).every((child) => {\n return isLayerHidden(child);\n })) &&\n !isLayerHidden(l)\n );\n })\n .map((l) => {\n return l.key;\n })\n .join(),\n baselayers:\n baseLayers.length > 1\n ? baseLayers\n .map((l) => {\n return l.key;\n })\n .join()\n : undefined,\n });\n }\n\n updateHistory() {\n const { params, history, replace } = this.props;\n const oldParams = qs.parse(window.location.search);\n const parameters = { ...oldParams, ...this.state, ...params };\n\n // Remove parameters that are undefined or null\n Object.entries(parameters).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n delete parameters[key];\n }\n });\n\n // encodeURI to encode spaces, accents, etc. but not characters like ;,/?:@&=+$-_.!~*'()\n const qStr = encodeURI(qs.stringify(parameters, { encode: false }));\n const search = qStr ? `?${qStr}` : '';\n\n if (\n (!qStr && window.location.search) ||\n (qStr && search !== window.location.search)\n ) {\n if (replace) {\n replace({ parameters, search });\n } else if (history) {\n history.replace({ search });\n } else {\n const { hash } = window.location;\n window.history.replaceState(\n undefined,\n undefined,\n `${search}${hash || ''}`,\n );\n }\n }\n }\n\n render() {\n return null;\n }\n}\n\nPermalink.propTypes = propTypes;\nPermalink.defaultProps = defaultProps;\n\nexport default Permalink;\n"],"names":["const","super","this"],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Permalink/Permalink.js"],
4
+ "sourcesContent": ["import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport qs from 'query-string';\nimport OLMap from 'ol/Map';\nimport { unByKey } from 'ol/Observable';\nimport { Layer, getLayersAsFlatArray } from 'mobility-toolbox-js/ol';\n\nconst propTypes = {\n /**\n * Either 'react-router' history object:\n * https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/history.md<br>\n * or default fallback as HTML5 History:\n * https://developer.mozilla.org/en-US/docs/Web/API/History\n */\n history: PropTypes.shape({\n replace: PropTypes.func,\n }),\n\n /**\n * Layers provider.\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),\n\n /**\n * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).\n */\n map: PropTypes.instanceOf(OLMap),\n\n /**\n * Params to be written in url.\n */\n params: PropTypes.object,\n\n /**\n * Maximum number of decimals allowed for coordinates.\n */\n coordinateDecimals: PropTypes.number,\n\n /**\n * Determine if the layer is hidden in the permalink or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the permalink\n */\n isLayerHidden: PropTypes.func,\n\n /**\n * Determine if the layer appears in the baselayers permalink parameter or not.\n *\n * @param {object} item The item to hide or not.\n *\n * @return {bool} true if the item is not displayed in the baselayers permalink parameter\n */\n isBaseLayer: PropTypes.func,\n\n /**\n * Custom function to be called when the permalink is updated.\n * This property has priority over the history parameter and window.history.replaceState calls.\n */\n replace: PropTypes.func,\n};\n\nconst defaultProps = {\n history: null,\n replace: null,\n layers: [],\n map: null,\n params: {},\n coordinateDecimals: 2,\n isLayerHidden: () => {\n return false;\n },\n isBaseLayer: (layer) => {\n return layer.get('isBaseLayer');\n },\n};\n\n/**\n * This component handles permalink logic. Injecting an\n * __[ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html)__\n * will add the *map center* (x, y) and the *zoom* (z) parameters to the permalink.\n * Injecting layers will add the *baselayers* and/or *layers* parameters. Further parameters can\n * be added using __params__.\n */\nclass Permalink extends PureComponent {\n constructor(props) {\n super(props);\n this.state = { revision: 0 };\n this.onMoveEndRef = null;\n this.onPropertyChangeKeys = [];\n }\n\n componentDidMount() {\n const { map, layers, isLayerHidden, isBaseLayer } = this.props;\n if (map) {\n this.moveEndRef = map.on('moveend', () => {\n this.onMapMoved();\n });\n }\n\n if (layers) {\n // set layer visibility based on 'layers' parameter.\n const urlParams = qs.parse(window.location.search);\n\n if (urlParams.layers) {\n const visibleLayers = urlParams.layers.split(',');\n getLayersAsFlatArray(layers).forEach((l) => {\n if (visibleLayers.includes(l.key)) {\n if (l.setVisible) {\n l.setVisible(true);\n } else {\n // eslint-disable-next-line no-param-reassign\n l.visible = true;\n }\n } else if (\n !l.isBaseLayer &&\n !(\n l.hasVisibleChildren ||\n l.children.some((ll) => {\n return ll.visible;\n })\n ) &&\n !isLayerHidden(l)\n ) {\n if (l.setVisible) {\n l.setVisible(false);\n } else {\n // eslint-disable-next-line no-param-reassign\n l.visible = false;\n }\n }\n });\n }\n\n // Set baser layer visibility based on 'baseLayers' parameter.\n const visibleBaseLayers = (urlParams.baselayers || '').split(',');\n getLayersAsFlatArray(layers)\n .filter(isBaseLayer)\n .forEach((baseLayer) => {\n if (baseLayer.key === visibleBaseLayers[0]) {\n if (baseLayer.setVisible) {\n baseLayer.setVisible(true); // The radio group will hide the others baseLayers automatically\n } else {\n // eslint-disable-next-line no-param-reassign\n baseLayer.visible = true;\n }\n }\n });\n\n this.updateLayers();\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { map, layers } = this.props;\n const { revision } = this.state;\n\n if (layers !== prevProps.layers || revision !== prevState.revision) {\n this.updateLayers();\n }\n\n if (map !== prevProps.map) {\n unByKey(this.moveEndRef);\n this.moveEndRef = map.on('moveend', () => {\n return this.onMapMoved();\n });\n }\n\n this.updateHistory();\n }\n\n componentWillUnmount() {\n const { map } = this.props;\n\n if (map) {\n unByKey(this.moveEndRef);\n }\n unByKey(this.onPropertyChangeKeys);\n this.onPropertyChangeKeys = [];\n }\n\n onMapMoved() {\n const { map } = this.props;\n const mapView = map.getView();\n const center = mapView.getCenter();\n const params = {};\n\n if (\n center !== undefined &&\n center[0] !== undefined &&\n center[1] !== undefined\n ) {\n params.x = this.roundCoord(center[0]);\n params.y = this.roundCoord(center[1]);\n }\n\n this.setState({\n ...params,\n // rounds zoom to two digits max.\n z: +`${Math.round(`${parseFloat(mapView.getZoom())}e+2`)}e-2`,\n });\n }\n\n roundCoord(val) {\n const { coordinateDecimals } = this.props;\n return parseFloat(val.toFixed(coordinateDecimals));\n }\n\n updateLayers() {\n const { layers, isLayerHidden, isBaseLayer } = this.props;\n const { revision } = this.state;\n\n const rootLayer = new Layer({ children: layers });\n\n unByKey(this.onPropertyChangeKeys);\n getLayersAsFlatArray(rootLayer).forEach((layer) => {\n this.onPropertyChangeKeys.push(\n layer.on('change:visible', () => {\n this.setState({ revision: revision + 1 });\n }),\n );\n });\n const baseLayers = getLayersAsFlatArray(rootLayer).filter(isBaseLayer);\n const idx = baseLayers.findIndex((l) => {\n return l.visible;\n });\n if (idx !== -1) {\n const baseLayerVisible = baseLayers.splice(idx, 1);\n baseLayers.unshift(baseLayerVisible[0]);\n }\n\n const layersParam = getLayersAsFlatArray(layers)\n .filter((l) => {\n const children = l.children || [];\n const allChildrenHidden = children.every((child) => {\n return isLayerHidden(child);\n });\n const hasVisibleChildren = children.some((child) => {\n return child.visible;\n });\n return (\n !isBaseLayer(l) &&\n !isLayerHidden(l) &&\n l.visible &&\n (!hasVisibleChildren || allChildrenHidden)\n );\n })\n .map((l) => {\n return l.key;\n })\n .join();\n\n const baseLayersParam =\n baseLayers.length > 1\n ? baseLayers\n .sort((a, b) => {\n if (a.visible === b.visible) {\n return 0;\n }\n if (a.visible && !b.visible) {\n return -1;\n }\n return 1;\n })\n .map((l) => {\n return l.key;\n })\n .join()\n : undefined;\n\n // Only add parameters if there is actually some layers added.\n const state = {};\n\n if (layers?.length) {\n state.layers = layersParam;\n }\n if (baseLayers?.length) {\n state.baselayers = baseLayersParam;\n }\n\n this.setState(state);\n }\n\n updateHistory() {\n const { params, history, replace } = this.props;\n const oldParams = qs.parse(window.location.search);\n const parameters = { ...oldParams, ...this.state, ...params };\n\n delete parameters.revision;\n\n // Remove parameters that are undefined or null\n Object.entries(parameters).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n delete parameters[key];\n }\n });\n\n // encodeURI to encode spaces, accents, etc. but not characters like ;,/?:@&=+$-_.!~*'()\n const qStr = encodeURI(qs.stringify(parameters, { encode: false }));\n const search = qStr ? `?${qStr}` : '';\n\n if (\n (!qStr && window.location.search) ||\n (qStr && search !== window.location.search)\n ) {\n if (replace) {\n replace({ parameters, search });\n } else if (history) {\n history.replace({ search });\n } else {\n const { hash } = window.location;\n window.history.replaceState(\n undefined,\n undefined,\n `${search}${hash || ''}`,\n );\n }\n }\n }\n\n render() {\n return null;\n }\n}\n\nPermalink.propTypes = propTypes;\nPermalink.defaultProps = defaultProps;\n\nexport default Permalink;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,3 +1 @@
1
- export { default } from './Permalink';
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { default } from "./Permalink";
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Permalink/index.js"],"sourcesContent":["export { default } from './Permalink';\n"],"names":[],"mappings":"AAAA,SAAS,OAAO,QAAQ,aAAa,CAAC;"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Permalink/index.js"],
4
+ "sourcesContent": ["export { default } from './Permalink';\n"],
5
+ "mappings": "AAAA,wBAAwB;",
6
+ "names": []
7
+ }