react-spatial 1.12.0 → 1.12.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.
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js +51 -51
- package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +2 -2
- package/components/BasicMap/BasicMap.js +80 -80
- package/components/BasicMap/BasicMap.js.map +2 -2
- package/components/CanvasSaveButton/CanvasSaveButton.js +68 -68
- package/components/CanvasSaveButton/CanvasSaveButton.js.map +2 -2
- package/components/Copyright/Copyright.js +12 -12
- package/components/Copyright/Copyright.js.map +2 -2
- package/components/FeatureExportButton/FeatureExportButton.js +5 -5
- package/components/FeatureExportButton/FeatureExportButton.js.map +2 -2
- package/components/FitExtent/FitExtent.js +15 -15
- package/components/FitExtent/FitExtent.js.map +2 -2
- package/components/Geolocation/Geolocation.js +96 -96
- package/components/Geolocation/Geolocation.js.map +2 -2
- package/components/LayerTree/LayerTree.js +172 -172
- package/components/LayerTree/LayerTree.js.map +2 -2
- package/components/MousePosition/MousePosition.js +27 -27
- package/components/MousePosition/MousePosition.js.map +2 -2
- package/components/NorthArrow/NorthArrow.js +13 -13
- package/components/NorthArrow/NorthArrow.js.map +2 -2
- package/components/Overlay/Overlay.js +49 -49
- package/components/Overlay/Overlay.js.map +2 -2
- package/components/Permalink/Permalink.js +70 -70
- package/components/Permalink/Permalink.js.map +2 -2
- package/components/Popup/Popup.js +73 -73
- package/components/Popup/Popup.js.map +2 -2
- package/components/ResizeHandler/ResizeHandler.js +51 -49
- package/components/ResizeHandler/ResizeHandler.js.map +2 -2
- package/components/RouteSchedule/RouteSchedule.js +86 -74
- package/components/RouteSchedule/RouteSchedule.js.map +2 -2
- package/components/RouteSchedule/RouteSchedule.scss +0 -20
- package/components/ScaleLine/ScaleLine.js +2 -2
- package/components/ScaleLine/ScaleLine.js.map +2 -2
- package/components/StopsFinder/StopsFinder.js +21 -21
- package/components/StopsFinder/StopsFinder.js.map +2 -2
- package/components/StopsFinder/StopsFinderOption.js +3 -3
- package/components/StopsFinder/StopsFinderOption.js.map +2 -2
- package/components/Zoom/Zoom.js +35 -35
- package/components/Zoom/Zoom.js.map +2 -2
- package/package.json +33 -29
- package/propTypes.js +10 -10
- package/propTypes.js.map +2 -2
- package/utils/GlobalsForOle.js +57 -57
- package/utils/GlobalsForOle.js.map +2 -2
- package/utils/KML.js +32 -32
- package/utils/KML.js.map +2 -2
- package/utils/Styles.js +7 -7
- package/utils/Styles.js.map +2 -2
- package/utils/timeUtils.js +6 -6
- package/utils/timeUtils.js.map +2 -2
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import PropTypes from "prop-types";
|
|
1
|
+
import { getLayersAsFlatArray, Layer } from "mobility-toolbox-js/ol";
|
|
3
2
|
import OLMap from "ol/Map";
|
|
4
3
|
import { unByKey } from "ol/Observable";
|
|
5
|
-
import
|
|
4
|
+
import PropTypes from "prop-types";
|
|
5
|
+
import { PureComponent } from "react";
|
|
6
6
|
const propTypes = {
|
|
7
|
+
/**
|
|
8
|
+
* Maximum number of decimals allowed for coordinates.
|
|
9
|
+
*/
|
|
10
|
+
coordinateDecimals: PropTypes.number,
|
|
7
11
|
/**
|
|
8
12
|
* Either 'react-router' history object:
|
|
9
13
|
* https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/history.md<br>
|
|
@@ -14,21 +18,13 @@ const propTypes = {
|
|
|
14
18
|
replace: PropTypes.func
|
|
15
19
|
}),
|
|
16
20
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*
|
|
22
|
-
*/
|
|
23
|
-
map: PropTypes.instanceOf(OLMap),
|
|
24
|
-
/**
|
|
25
|
-
* Params to be written in url.
|
|
26
|
-
*/
|
|
27
|
-
params: PropTypes.object,
|
|
28
|
-
/**
|
|
29
|
-
* Maximum number of decimals allowed for coordinates.
|
|
21
|
+
* Determine if the layer appears in the baselayers permalink parameter or not.
|
|
22
|
+
*
|
|
23
|
+
* @param {object} item The item to hide or not.
|
|
24
|
+
*
|
|
25
|
+
* @return {bool} true if the item is not displayed in the baselayers permalink parameter
|
|
30
26
|
*/
|
|
31
|
-
|
|
27
|
+
isBaseLayer: PropTypes.func,
|
|
32
28
|
/**
|
|
33
29
|
* Determine if the layer is hidden in the permalink or not.
|
|
34
30
|
*
|
|
@@ -38,13 +34,17 @@ const propTypes = {
|
|
|
38
34
|
*/
|
|
39
35
|
isLayerHidden: PropTypes.func,
|
|
40
36
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* @param {object} item The item to hide or not.
|
|
44
|
-
*
|
|
45
|
-
* @return {bool} true if the item is not displayed in the baselayers permalink parameter
|
|
37
|
+
* Layers provider.
|
|
46
38
|
*/
|
|
47
|
-
|
|
39
|
+
layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)),
|
|
40
|
+
/**
|
|
41
|
+
* An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).
|
|
42
|
+
*/
|
|
43
|
+
map: PropTypes.instanceOf(OLMap),
|
|
44
|
+
/**
|
|
45
|
+
* Params to be written in url.
|
|
46
|
+
*/
|
|
47
|
+
params: PropTypes.object,
|
|
48
48
|
/**
|
|
49
49
|
* Custom function to be called when the permalink is updated.
|
|
50
50
|
* This property has priority over the history parameter and window.history.replaceState calls.
|
|
@@ -52,18 +52,18 @@ const propTypes = {
|
|
|
52
52
|
replace: PropTypes.func
|
|
53
53
|
};
|
|
54
54
|
const defaultProps = {
|
|
55
|
-
history: null,
|
|
56
|
-
replace: null,
|
|
57
|
-
layers: [],
|
|
58
|
-
map: null,
|
|
59
|
-
params: {},
|
|
60
55
|
coordinateDecimals: 2,
|
|
56
|
+
history: null,
|
|
57
|
+
isBaseLayer: (layer) => {
|
|
58
|
+
return layer.get("isBaseLayer");
|
|
59
|
+
},
|
|
61
60
|
isLayerHidden: () => {
|
|
62
61
|
return false;
|
|
63
62
|
},
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
63
|
+
layers: [],
|
|
64
|
+
map: null,
|
|
65
|
+
params: {},
|
|
66
|
+
replace: null
|
|
67
67
|
};
|
|
68
68
|
class Permalink extends PureComponent {
|
|
69
69
|
constructor(props) {
|
|
@@ -72,7 +72,7 @@ class Permalink extends PureComponent {
|
|
|
72
72
|
this.onPropertyChangeKeys = [];
|
|
73
73
|
}
|
|
74
74
|
componentDidMount() {
|
|
75
|
-
const {
|
|
75
|
+
const { isBaseLayer, isLayerHidden, layers, map } = this.props;
|
|
76
76
|
if (map) {
|
|
77
77
|
this.moveEndRef = map.on("moveend", () => {
|
|
78
78
|
this.onMapMoved();
|
|
@@ -117,7 +117,7 @@ class Permalink extends PureComponent {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
componentDidUpdate(prevProps, prevState) {
|
|
120
|
-
const {
|
|
120
|
+
const { layers, map } = this.props;
|
|
121
121
|
const { revision } = this.state;
|
|
122
122
|
if (layers !== prevProps.layers || revision !== prevState.revision) {
|
|
123
123
|
this.updateLayers();
|
|
@@ -153,12 +153,46 @@ class Permalink extends PureComponent {
|
|
|
153
153
|
z: +`${Math.round(`${parseFloat(mapView.getZoom())}e+2`)}e-2`
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
|
+
render() {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
156
159
|
roundCoord(val) {
|
|
157
160
|
const { coordinateDecimals } = this.props;
|
|
158
161
|
return parseFloat(val.toFixed(coordinateDecimals));
|
|
159
162
|
}
|
|
163
|
+
updateHistory() {
|
|
164
|
+
const { history, params, replace } = this.props;
|
|
165
|
+
const oldParams = new URLSearchParams(window.location.search);
|
|
166
|
+
const parameters = {
|
|
167
|
+
...Object.fromEntries(oldParams.entries()),
|
|
168
|
+
...this.state,
|
|
169
|
+
...params
|
|
170
|
+
};
|
|
171
|
+
delete parameters.revision;
|
|
172
|
+
Object.entries(parameters).forEach(([key, value]) => {
|
|
173
|
+
if (value === void 0 || value === null) {
|
|
174
|
+
delete parameters[key];
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
const qStr = new URLSearchParams(parameters).toString().replace(/%2C/g, ",");
|
|
178
|
+
const search = qStr ? `?${qStr}` : "";
|
|
179
|
+
if (!qStr && window.location.search || qStr && search !== window.location.search) {
|
|
180
|
+
if (replace) {
|
|
181
|
+
replace({ parameters, search });
|
|
182
|
+
} else if (history) {
|
|
183
|
+
history.replace({ search });
|
|
184
|
+
} else {
|
|
185
|
+
const { hash } = window.location;
|
|
186
|
+
window.history.replaceState(
|
|
187
|
+
void 0,
|
|
188
|
+
void 0,
|
|
189
|
+
`${search}${hash || ""}`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
160
194
|
updateLayers() {
|
|
161
|
-
const {
|
|
195
|
+
const { isBaseLayer, isLayerHidden, layers } = this.props;
|
|
162
196
|
const { revision } = this.state;
|
|
163
197
|
unByKey(this.onPropertyChangeKeys);
|
|
164
198
|
this.onPropertyChangeKeys = getLayersAsFlatArray(layers).map((layer) => {
|
|
@@ -203,43 +237,9 @@ class Permalink extends PureComponent {
|
|
|
203
237
|
}).join();
|
|
204
238
|
}
|
|
205
239
|
this.setState({
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
updateHistory() {
|
|
211
|
-
const { params, history, replace } = this.props;
|
|
212
|
-
const oldParams = new URLSearchParams(window.location.search);
|
|
213
|
-
const parameters = {
|
|
214
|
-
...Object.fromEntries(oldParams.entries()),
|
|
215
|
-
...this.state,
|
|
216
|
-
...params
|
|
217
|
-
};
|
|
218
|
-
delete parameters.revision;
|
|
219
|
-
Object.entries(parameters).forEach(([key, value]) => {
|
|
220
|
-
if (value === void 0 || value === null) {
|
|
221
|
-
delete parameters[key];
|
|
222
|
-
}
|
|
240
|
+
baselayers: baseLayersParam,
|
|
241
|
+
layers: layersParam
|
|
223
242
|
});
|
|
224
|
-
const qStr = new URLSearchParams(parameters).toString().replace(/%2C/g, ",");
|
|
225
|
-
const search = qStr ? `?${qStr}` : "";
|
|
226
|
-
if (!qStr && window.location.search || qStr && search !== window.location.search) {
|
|
227
|
-
if (replace) {
|
|
228
|
-
replace({ parameters, search });
|
|
229
|
-
} else if (history) {
|
|
230
|
-
history.replace({ search });
|
|
231
|
-
} else {
|
|
232
|
-
const { hash } = window.location;
|
|
233
|
-
window.history.replaceState(
|
|
234
|
-
void 0,
|
|
235
|
-
void 0,
|
|
236
|
-
`${search}${hash || ""}`
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
render() {
|
|
242
|
-
return null;
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
Permalink.propTypes = propTypes;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/Permalink/Permalink.js"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { getLayersAsFlatArray, Layer } from \"mobility-toolbox-js/ol\";\nimport OLMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport PropTypes from \"prop-types\";\nimport { PureComponent } from \"react\";\n\nconst propTypes = {\n /**\n * Maximum number of decimals allowed for coordinates.\n */\n coordinateDecimals: PropTypes.number,\n\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 * 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 * 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 * 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 * 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 coordinateDecimals: 2,\n history: null,\n isBaseLayer: (layer) => {\n return layer.get(\"isBaseLayer\");\n },\n isLayerHidden: () => {\n return false;\n },\n layers: [],\n map: null,\n params: {},\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 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.onPropertyChangeKeys = [];\n }\n\n componentDidMount() {\n const { isBaseLayer, isLayerHidden, layers, map } = 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 = new URLSearchParams(window.location.search);\n\n if (urlParams.get(\"layers\")) {\n const visibleLayers = urlParams.get(\"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 !isBaseLayer(l) &&\n !isLayerHidden(l) &&\n !l.children.some((ll) => {\n return ll.visible;\n })\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 // Show the first of the list then hide the others\n const visibleBaseLayer = (urlParams.get(\"baselayers\") || \"\").split(\n \",\",\n )[0];\n if (visibleBaseLayer) {\n getLayersAsFlatArray(layers)\n .filter(isBaseLayer)\n .forEach((baseLayer) => {\n const visible = baseLayer.key === visibleBaseLayer;\n if (baseLayer.setVisible) {\n baseLayer.setVisible(visible);\n } else {\n // eslint-disable-next-line no-param-reassign\n baseLayer.visible = visible;\n }\n });\n }\n this.updateLayers();\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { layers, map } = 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 render() {\n return null;\n }\n\n roundCoord(val) {\n const { coordinateDecimals } = this.props;\n return parseFloat(val.toFixed(coordinateDecimals));\n }\n\n updateHistory() {\n const { history, params, replace } = this.props;\n const oldParams = new URLSearchParams(window.location.search);\n const parameters = {\n ...Object.fromEntries(oldParams.entries()),\n ...this.state,\n ...params,\n };\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 // We don't encode the , to leave the permalink lisible\n const qStr = new URLSearchParams(parameters)\n .toString()\n .replace(/%2C/g, \",\");\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 updateLayers() {\n const { isBaseLayer, isLayerHidden, layers } = this.props;\n const { revision } = this.state;\n\n unByKey(this.onPropertyChangeKeys);\n this.onPropertyChangeKeys = getLayersAsFlatArray(layers).map((layer) => {\n return layer.on(\"change:visible\", () => {\n this.setState({ revision: revision + 1 });\n });\n });\n\n // layers param\n let layersParam;\n if (layers.length) {\n 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\n // baselayers param\n let baseLayersParam;\n const baseLayers = getLayersAsFlatArray(layers).filter(isBaseLayer);\n if (baseLayers.length) {\n // First baselayers in order of visibility, top layer is first\n const visibleBaseLayers = (\n baseLayers.filter((l) => {\n return l.visible;\n }) || []\n ).reverse();\n const nonVisibleBaseLayers =\n baseLayers.filter((l) => {\n return !l.visible;\n }) || [];\n baseLayersParam = [...visibleBaseLayers, ...nonVisibleBaseLayers]\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 }\n\n // Only add parameters if there is actually some layers added.\n this.setState({\n baselayers: baseLayersParam,\n layers: layersParam,\n });\n }\n}\n\nPermalink.propTypes = propTypes;\nPermalink.defaultProps = defaultProps;\n\nexport default Permalink;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import React, { PureComponent } from "react";
|
|
2
|
-
import PropTypes from "prop-types";
|
|
3
|
-
import { MdClose } from "react-icons/md";
|
|
4
|
-
import OLMap from "ol/Map";
|
|
5
|
-
import Feature from "ol/Feature";
|
|
6
1
|
import { getCenter } from "ol/extent";
|
|
2
|
+
import Feature from "ol/Feature";
|
|
3
|
+
import OLMap from "ol/Map";
|
|
7
4
|
import { unByKey } from "ol/Observable";
|
|
5
|
+
import PropTypes from "prop-types";
|
|
6
|
+
import React, { PureComponent } from "react";
|
|
7
|
+
import { MdClose } from "react-icons/md";
|
|
8
8
|
const propTypes = {
|
|
9
9
|
/**
|
|
10
10
|
* React Children.
|
|
11
11
|
*/
|
|
12
12
|
children: PropTypes.node.isRequired,
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
14
|
+
* Class name of the popup.
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
className: PropTypes.string,
|
|
17
17
|
/**
|
|
18
18
|
* An [ol/Feature](https://openlayers.org/en/latest/apidoc/module-ol_Feature-Feature.html).
|
|
19
19
|
*/
|
|
@@ -22,6 +22,14 @@ const propTypes = {
|
|
|
22
22
|
* Popup title.
|
|
23
23
|
*/
|
|
24
24
|
header: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
|
|
25
|
+
/**
|
|
26
|
+
* An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).
|
|
27
|
+
*/
|
|
28
|
+
map: PropTypes.instanceOf(OLMap).isRequired,
|
|
29
|
+
/**
|
|
30
|
+
* Function triggered on close button click.
|
|
31
|
+
*/
|
|
32
|
+
onCloseClick: PropTypes.func,
|
|
25
33
|
/**
|
|
26
34
|
* If true, the popup is panned in the map's viewport.
|
|
27
35
|
*/
|
|
@@ -36,85 +44,77 @@ const propTypes = {
|
|
|
36
44
|
*/
|
|
37
45
|
popupCoordinate: PropTypes.arrayOf(PropTypes.number),
|
|
38
46
|
/**
|
|
39
|
-
*
|
|
40
|
-
*/
|
|
41
|
-
className: PropTypes.string,
|
|
42
|
-
/**
|
|
43
|
-
* Title HTML attributes.
|
|
44
|
-
*/
|
|
45
|
-
titles: PropTypes.shape({
|
|
46
|
-
closeButton: PropTypes.string
|
|
47
|
-
}),
|
|
48
|
-
/**
|
|
49
|
-
* Function triggered on close button click.
|
|
47
|
+
* Render the close button
|
|
50
48
|
*/
|
|
51
|
-
|
|
49
|
+
renderCloseButton: PropTypes.func,
|
|
52
50
|
/**
|
|
53
|
-
*
|
|
51
|
+
* Render the footer
|
|
54
52
|
*/
|
|
55
|
-
|
|
53
|
+
renderFooter: PropTypes.func,
|
|
56
54
|
/**
|
|
57
55
|
* Render the header
|
|
58
56
|
*/
|
|
59
57
|
renderHeader: PropTypes.func,
|
|
60
58
|
/**
|
|
61
|
-
*
|
|
59
|
+
* HTML tabIndex attribute.
|
|
62
60
|
*/
|
|
63
|
-
|
|
61
|
+
tabIndex: PropTypes.string,
|
|
64
62
|
/**
|
|
65
|
-
*
|
|
63
|
+
* Title HTML attributes.
|
|
66
64
|
*/
|
|
67
|
-
|
|
65
|
+
titles: PropTypes.shape({
|
|
66
|
+
closeButton: PropTypes.string
|
|
67
|
+
})
|
|
68
68
|
};
|
|
69
69
|
const defaultProps = {
|
|
70
|
-
|
|
70
|
+
className: "rs-popup",
|
|
71
71
|
feature: null,
|
|
72
|
+
header: null,
|
|
73
|
+
onCloseClick: () => {
|
|
74
|
+
},
|
|
72
75
|
panIntoView: false,
|
|
73
76
|
panRect: null,
|
|
74
77
|
popupCoordinate: null,
|
|
75
|
-
className: "rs-popup",
|
|
76
|
-
tabIndex: "",
|
|
77
|
-
titles: { closeButton: "Close" },
|
|
78
|
-
onCloseClick: () => {
|
|
79
|
-
},
|
|
80
|
-
renderHeader: null,
|
|
81
78
|
renderCloseButton: null,
|
|
82
79
|
renderFooter: () => {
|
|
83
80
|
return null;
|
|
84
|
-
}
|
|
81
|
+
},
|
|
82
|
+
renderHeader: null,
|
|
83
|
+
tabIndex: "",
|
|
84
|
+
titles: { closeButton: "Close" }
|
|
85
85
|
};
|
|
86
86
|
class Popup extends PureComponent {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
constructor(props) {
|
|
88
|
+
super(props);
|
|
89
|
+
this.state = {
|
|
90
|
+
left: 0,
|
|
91
|
+
popupElement: null,
|
|
92
|
+
top: 0
|
|
93
|
+
};
|
|
94
|
+
this.postrenderKey = null;
|
|
90
95
|
}
|
|
91
96
|
static renderCloseButton({ onCloseClick, titles }) {
|
|
92
97
|
return /* @__PURE__ */ React.createElement(
|
|
93
98
|
"div",
|
|
94
99
|
{
|
|
95
|
-
role: "button",
|
|
96
|
-
tabIndex: 0,
|
|
97
|
-
className: "rs-popup-close-bt",
|
|
98
|
-
title: titles.closeButton,
|
|
99
100
|
"aria-label": titles.closeButton,
|
|
101
|
+
className: "rs-popup-close-bt",
|
|
100
102
|
onClick: () => {
|
|
101
103
|
return onCloseClick();
|
|
102
104
|
},
|
|
103
105
|
onKeyPress: (evt) => {
|
|
104
106
|
return evt.which === 13 && onCloseClick();
|
|
105
|
-
}
|
|
107
|
+
},
|
|
108
|
+
role: "button",
|
|
109
|
+
tabIndex: 0,
|
|
110
|
+
title: titles.closeButton
|
|
106
111
|
},
|
|
107
112
|
/* @__PURE__ */ React.createElement(MdClose, { focusable: false })
|
|
108
113
|
);
|
|
109
114
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
popupElement: null,
|
|
114
|
-
top: 0,
|
|
115
|
-
left: 0
|
|
116
|
-
};
|
|
117
|
-
this.postrenderKey = null;
|
|
115
|
+
static renderHeader(props) {
|
|
116
|
+
const { header, renderCloseButton } = props;
|
|
117
|
+
return /* @__PURE__ */ React.createElement("div", { className: "rs-popup-header" }, header, (renderCloseButton || Popup.renderCloseButton)(props));
|
|
118
118
|
}
|
|
119
119
|
componentDidMount() {
|
|
120
120
|
const { map } = this.props;
|
|
@@ -160,32 +160,16 @@ class Popup extends PureComponent {
|
|
|
160
160
|
map.getView().animate({ center: newCenter, duration: 500 });
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
-
updatePixelPosition() {
|
|
164
|
-
const { map, feature, popupCoordinate } = this.props;
|
|
165
|
-
let coord = popupCoordinate;
|
|
166
|
-
if (feature && !coord) {
|
|
167
|
-
coord = getCenter(feature.getGeometry().getExtent());
|
|
168
|
-
}
|
|
169
|
-
if (coord) {
|
|
170
|
-
const pos = map.getPixelFromCoordinate(coord);
|
|
171
|
-
if (pos && pos.length === 2) {
|
|
172
|
-
this.setState({
|
|
173
|
-
left: pos[0],
|
|
174
|
-
top: pos[1]
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
163
|
render() {
|
|
180
164
|
const {
|
|
181
|
-
feature,
|
|
182
|
-
popupCoordinate,
|
|
183
165
|
children,
|
|
166
|
+
feature,
|
|
184
167
|
header,
|
|
185
|
-
|
|
186
|
-
tabIndex,
|
|
187
|
-
renderHeader,
|
|
168
|
+
popupCoordinate,
|
|
188
169
|
renderFooter,
|
|
170
|
+
renderHeader,
|
|
171
|
+
tabIndex,
|
|
172
|
+
titles,
|
|
189
173
|
...other
|
|
190
174
|
} = this.props;
|
|
191
175
|
if (!feature && !popupCoordinate) {
|
|
@@ -197,7 +181,7 @@ class Popup extends PureComponent {
|
|
|
197
181
|
delete other.header;
|
|
198
182
|
delete other.onCloseClick;
|
|
199
183
|
delete other.renderCloseButton;
|
|
200
|
-
const {
|
|
184
|
+
const { left, top } = this.state;
|
|
201
185
|
const key = feature ? feature.getId() : popupCoordinate.join();
|
|
202
186
|
return /* @__PURE__ */ React.createElement(
|
|
203
187
|
"div",
|
|
@@ -213,11 +197,11 @@ class Popup extends PureComponent {
|
|
|
213
197
|
"div",
|
|
214
198
|
{
|
|
215
199
|
className: "rs-popup-container",
|
|
216
|
-
tabIndex,
|
|
217
200
|
key,
|
|
218
201
|
ref: (popupElement) => {
|
|
219
202
|
this.setState({ popupElement });
|
|
220
|
-
}
|
|
203
|
+
},
|
|
204
|
+
tabIndex
|
|
221
205
|
},
|
|
222
206
|
(renderHeader || Popup.renderHeader)(this.props),
|
|
223
207
|
/* @__PURE__ */ React.createElement("div", { className: "rs-popup-body" }, children),
|
|
@@ -225,6 +209,22 @@ class Popup extends PureComponent {
|
|
|
225
209
|
)
|
|
226
210
|
);
|
|
227
211
|
}
|
|
212
|
+
updatePixelPosition() {
|
|
213
|
+
const { feature, map, popupCoordinate } = this.props;
|
|
214
|
+
let coord = popupCoordinate;
|
|
215
|
+
if (feature && !coord) {
|
|
216
|
+
coord = getCenter(feature.getGeometry().getExtent());
|
|
217
|
+
}
|
|
218
|
+
if (coord) {
|
|
219
|
+
const pos = map.getPixelFromCoordinate(coord);
|
|
220
|
+
if (pos && pos.length === 2) {
|
|
221
|
+
this.setState({
|
|
222
|
+
left: pos[0],
|
|
223
|
+
top: pos[1]
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
228
|
}
|
|
229
229
|
Popup.propTypes = propTypes;
|
|
230
230
|
Popup.defaultProps = defaultProps;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/Popup/Popup.js"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "AAAA,
|
|
4
|
+
"sourcesContent": ["import { getCenter } from \"ol/extent\";\nimport Feature from \"ol/Feature\";\nimport OLMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport PropTypes from \"prop-types\";\nimport React, { PureComponent } from \"react\";\nimport { MdClose } from \"react-icons/md\";\n\nconst propTypes = {\n /**\n * React Children.\n */\n children: PropTypes.node.isRequired,\n\n /**\n * Class name of the popup.\n */\n className: PropTypes.string,\n\n /**\n * An [ol/Feature](https://openlayers.org/en/latest/apidoc/module-ol_Feature-Feature.html).\n */\n feature: PropTypes.instanceOf(Feature),\n\n /**\n * Popup title.\n */\n header: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n\n /**\n * An [ol/map](https://openlayers.org/en/latest/apidoc/module-ol_Map-Map.html).\n */\n map: PropTypes.instanceOf(OLMap).isRequired,\n\n /**\n * Function triggered on close button click.\n */\n onCloseClick: PropTypes.func,\n\n /**\n * If true, the popup is panned in the map's viewport.\n */\n panIntoView: PropTypes.bool,\n\n /**\n * Custom BoundingClientRect to fit popup into.\n * Use if panIntoView is true. Default is the map's BoundingClientRect.\n */\n panRect: PropTypes.objectOf(PropTypes.number),\n\n /**\n * Coordinate position of the popup.\n */\n popupCoordinate: PropTypes.arrayOf(PropTypes.number),\n\n /**\n * Render the close button\n */\n renderCloseButton: PropTypes.func,\n\n /**\n * Render the footer\n */\n renderFooter: PropTypes.func,\n\n /**\n * Render the header\n */\n renderHeader: PropTypes.func,\n\n /**\n * HTML tabIndex attribute.\n */\n tabIndex: PropTypes.string,\n\n /**\n * Title HTML attributes.\n */\n titles: PropTypes.shape({\n closeButton: PropTypes.string,\n }),\n};\n\nconst defaultProps = {\n className: \"rs-popup\",\n feature: null,\n header: null,\n onCloseClick: () => {},\n panIntoView: false,\n panRect: null,\n popupCoordinate: null,\n renderCloseButton: null,\n renderFooter: () => {\n return null;\n },\n renderHeader: null,\n tabIndex: \"\",\n titles: { closeButton: \"Close\" },\n};\n\n/**\n * The Popup component renders a popup over an\n * [ol/Feature](https://openlayers.org/en/latest/apidoc/module-ol_Feature-Feature.html)\n * on click.\n */\nclass Popup extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n left: 0,\n popupElement: null,\n top: 0,\n };\n this.postrenderKey = null;\n }\n\n static renderCloseButton({ onCloseClick, titles }) {\n return (\n <div\n aria-label={titles.closeButton}\n className=\"rs-popup-close-bt\"\n onClick={() => {\n return onCloseClick();\n }}\n onKeyPress={(evt) => {\n return evt.which === 13 && onCloseClick();\n }}\n role=\"button\"\n tabIndex={0}\n title={titles.closeButton}\n >\n <MdClose focusable={false} />\n </div>\n );\n }\n\n static renderHeader(props) {\n const { header, renderCloseButton } = props;\n return (\n <div className=\"rs-popup-header\">\n {header}\n {(renderCloseButton || Popup.renderCloseButton)(props)}\n </div>\n );\n }\n\n componentDidMount() {\n const { map } = this.props;\n this.updatePixelPosition();\n\n this.postrenderKey = map.on(\"postrender\", () => {\n this.updatePixelPosition();\n });\n }\n\n componentDidUpdate(prevProps, prevState) {\n const { feature, panIntoView, popupCoordinate } = this.props;\n const { popupElement } = this.state;\n if (\n feature !== prevProps.feature ||\n popupCoordinate !== prevProps.popupCoordinate\n ) {\n this.updatePixelPosition();\n }\n\n if (\n panIntoView &&\n popupElement &&\n popupElement !== prevState.popupElement\n ) {\n this.panIntoView();\n }\n }\n\n componentWillUnmount() {\n unByKey(this.postrenderKey);\n }\n\n panIntoView() {\n const { map, panRect } = this.props;\n const { popupElement } = this.state;\n\n const mapRect = panRect || map.getTarget().getBoundingClientRect();\n const popupRect = popupElement.getBoundingClientRect();\n const [x, y] = map.getView().getCenter();\n const res = map.getView().getResolution();\n const newCenter = [x, y];\n\n if (mapRect.top > popupRect.top) {\n newCenter[1] = y + (mapRect.top - popupRect.top) * res;\n }\n\n if (mapRect.left > popupRect.left) {\n newCenter[0] = x - (mapRect.left - popupRect.left) * res;\n }\n\n if (mapRect.right < popupRect.right) {\n newCenter[0] = x + (popupRect.right - mapRect.right) * res;\n }\n\n if (mapRect.bottom < popupRect.bottom) {\n newCenter[1] = y - (popupRect.bottom - mapRect.bottom) * res;\n }\n\n if (newCenter[0] !== x || newCenter[1] !== y) {\n map.getView().animate({ center: newCenter, duration: 500 });\n }\n }\n\n render() {\n const {\n children,\n feature,\n header,\n popupCoordinate,\n renderFooter,\n renderHeader,\n tabIndex,\n titles,\n ...other\n } = this.props;\n\n if (!feature && !popupCoordinate) {\n return null;\n }\n\n delete other.panIntoView;\n delete other.panRect;\n delete other.map;\n delete other.header;\n delete other.onCloseClick;\n delete other.renderCloseButton;\n\n const { left, top } = this.state;\n\n // force re-render if the feature or the coordinate changes.\n // this is needed to update the popupElement ref\n const key = feature ? feature.getId() : popupCoordinate.join();\n return (\n <div\n className=\"rs-popup\"\n style={{\n left,\n top,\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...other}\n >\n <div\n className=\"rs-popup-container\"\n key={key}\n ref={(popupElement) => {\n this.setState({ popupElement });\n }}\n tabIndex={tabIndex}\n >\n {(renderHeader || Popup.renderHeader)(this.props)}\n <div className=\"rs-popup-body\">{children}</div>\n {renderFooter(this.props)}\n </div>\n </div>\n );\n }\n\n updatePixelPosition() {\n const { feature, map, popupCoordinate } = this.props;\n let coord = popupCoordinate;\n\n if (feature && !coord) {\n coord = getCenter(feature.getGeometry().getExtent());\n }\n\n if (coord) {\n const pos = map.getPixelFromCoordinate(coord);\n\n if (pos && pos.length === 2) {\n this.setState({\n left: pos[0],\n top: pos[1],\n });\n }\n }\n }\n}\n\nPopup.propTypes = propTypes;\nPopup.defaultProps = defaultProps;\n\nexport default Popup;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|