react-spatial 2.0.0-beta.1 → 2.0.0-beta.2

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 (213) hide show
  1. package/README.md +5 -10
  2. package/components/BaseLayerSwitcher/BaseLayerSwitcher.js +243 -220
  3. package/components/BaseLayerSwitcher/BaseLayerSwitcher.js.map +7 -1
  4. package/components/BaseLayerSwitcher/BaseLayerSwitcher.scss +6 -5
  5. package/components/BaseLayerSwitcher/index.js +1 -3
  6. package/components/BaseLayerSwitcher/index.js.map +7 -1
  7. package/components/BasicMap/BasicMap.js +165 -285
  8. package/components/BasicMap/BasicMap.js.map +7 -1
  9. package/components/BasicMap/index.js +1 -3
  10. package/components/BasicMap/index.js.map +7 -1
  11. package/components/CanvasSaveButton/CanvasSaveButton.js +434 -556
  12. package/components/CanvasSaveButton/CanvasSaveButton.js.map +7 -1
  13. package/components/CanvasSaveButton/CanvasSaveButton.md.scss +1 -1
  14. package/components/CanvasSaveButton/index.js +1 -3
  15. package/components/CanvasSaveButton/index.js.map +7 -1
  16. package/components/Copyright/Copyright.js +44 -77
  17. package/components/Copyright/Copyright.js.map +7 -1
  18. package/components/Copyright/index.js +1 -3
  19. package/components/Copyright/index.js.map +7 -1
  20. package/components/FeatureExportButton/FeatureExportButton.js +44 -92
  21. package/components/FeatureExportButton/FeatureExportButton.js.map +7 -1
  22. package/components/FeatureExportButton/index.js +1 -3
  23. package/components/FeatureExportButton/index.js.map +7 -1
  24. package/components/FitExtent/FitExtent.js +31 -46
  25. package/components/FitExtent/FitExtent.js.map +7 -1
  26. package/components/FitExtent/index.js +1 -3
  27. package/components/FitExtent/index.js.map +7 -1
  28. package/components/Geolocation/Geolocation.js +158 -228
  29. package/components/Geolocation/Geolocation.js.map +7 -1
  30. package/components/Geolocation/Geolocation.scss +7 -5
  31. package/components/Geolocation/index.js +1 -3
  32. package/components/Geolocation/index.js.map +7 -1
  33. package/components/LayerTree/LayerTree.js +359 -357
  34. package/components/LayerTree/LayerTree.js.map +7 -1
  35. package/components/LayerTree/LayerTree.scss +4 -6
  36. package/components/LayerTree/index.js +1 -3
  37. package/components/LayerTree/index.js.map +7 -1
  38. package/components/MousePosition/MousePosition.js +71 -109
  39. package/components/MousePosition/MousePosition.js.map +7 -1
  40. package/components/MousePosition/index.js +1 -3
  41. package/components/MousePosition/index.js.map +7 -1
  42. package/components/NorthArrow/NorthArrow.js +37 -61
  43. package/components/NorthArrow/NorthArrow.js.map +7 -1
  44. package/components/NorthArrow/index.js +1 -3
  45. package/components/NorthArrow/index.js.map +7 -1
  46. package/components/Overlay/Overlay.js +93 -123
  47. package/components/Overlay/Overlay.js.map +7 -1
  48. package/components/Overlay/index.js +1 -3
  49. package/components/Overlay/index.js.map +7 -1
  50. package/components/Permalink/Permalink.js +194 -229
  51. package/components/Permalink/Permalink.js.map +7 -1
  52. package/components/Permalink/index.js +1 -3
  53. package/components/Permalink/index.js.map +7 -1
  54. package/components/Popup/Popup.js +139 -215
  55. package/components/Popup/Popup.js.map +7 -1
  56. package/components/Popup/Popup.md.scss +1 -0
  57. package/components/Popup/Popup.scss +3 -1
  58. package/components/Popup/index.js +1 -3
  59. package/components/Popup/index.js.map +7 -1
  60. package/components/ResizeHandler/ResizeHandler.js +88 -137
  61. package/components/ResizeHandler/ResizeHandler.js.map +7 -1
  62. package/components/ResizeHandler/index.js +1 -3
  63. package/components/ResizeHandler/index.js.map +7 -1
  64. package/components/RouteSchedule/RouteSchedule.js +227 -277
  65. package/components/RouteSchedule/RouteSchedule.js.map +7 -1
  66. package/components/RouteSchedule/RouteSchedule.md.scss +4 -2
  67. package/components/RouteSchedule/RouteSchedule.scss +12 -23
  68. package/components/RouteSchedule/index.js +1 -3
  69. package/components/RouteSchedule/index.js.map +7 -1
  70. package/components/ScaleLine/ScaleLine.js +17 -39
  71. package/components/ScaleLine/ScaleLine.js.map +7 -1
  72. package/components/ScaleLine/ScaleLine.scss +6 -4
  73. package/components/ScaleLine/index.js +1 -3
  74. package/components/ScaleLine/index.js.map +7 -1
  75. package/components/StopsFinder/StopsFinder.js +134 -162
  76. package/components/StopsFinder/StopsFinder.js.map +7 -1
  77. package/components/StopsFinder/StopsFinderOption.js +30 -60
  78. package/components/StopsFinder/StopsFinderOption.js.map +7 -1
  79. package/components/StopsFinder/index.js +1 -3
  80. package/components/StopsFinder/index.js.map +7 -1
  81. package/components/Zoom/Zoom.js +102 -106
  82. package/components/Zoom/Zoom.js.map +7 -1
  83. package/components/Zoom/Zoom.md.scss +3 -1
  84. package/components/Zoom/Zoom.scss +7 -5
  85. package/components/Zoom/index.js +1 -3
  86. package/components/Zoom/index.js.map +7 -1
  87. package/images/geops_qr.png +0 -0
  88. package/package.json +88 -182
  89. package/propTypes.js +36 -24
  90. package/propTypes.js.map +7 -1
  91. package/setupTests.js +21 -4
  92. package/setupTests.js.map +7 -1
  93. package/themes/README.md +26 -0
  94. package/themes/default/components.scss +9 -14
  95. package/themes/default/examples.scss +20 -20
  96. package/themes/default/index.scss +3 -3
  97. package/themes/default/mixins.scss +7 -5
  98. package/themes/default/variables.scss +27 -25
  99. package/utils/GlobalsForOle.js +72 -73
  100. package/utils/GlobalsForOle.js.map +7 -1
  101. package/utils/KML.js +320 -381
  102. package/utils/KML.js.map +7 -1
  103. package/utils/Styles.js +25 -33
  104. package/utils/Styles.js.map +7 -1
  105. package/utils/getLayersAsFlatArray.js +14 -0
  106. package/utils/getLayersAsFlatArray.js.map +7 -0
  107. package/utils/getPolygonPattern.js +11 -44
  108. package/utils/getPolygonPattern.js.map +7 -1
  109. package/utils/timeUtils.js +20 -35
  110. package/utils/timeUtils.js.map +7 -1
  111. package/LayerService.js +0 -193
  112. package/LayerService.js.map +0 -1
  113. package/LayerService.test.js +0 -160
  114. package/LayerService.test.js.map +0 -1
  115. package/Projections.js +0 -16
  116. package/Projections.js.map +0 -1
  117. package/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js +0 -88
  118. package/components/BaseLayerSwitcher/BaseLayerSwitcher.test.js.map +0 -1
  119. package/components/BaseLayerToggler/BaseLayerToggler.js +0 -490
  120. package/components/BaseLayerToggler/BaseLayerToggler.js.map +0 -1
  121. package/components/BaseLayerToggler/BaseLayerToggler.md.scss +0 -9
  122. package/components/BaseLayerToggler/BaseLayerToggler.scss +0 -49
  123. package/components/BaseLayerToggler/BaseLayerToggler.test.js +0 -127
  124. package/components/BaseLayerToggler/BaseLayerToggler.test.js.map +0 -1
  125. package/components/BaseLayerToggler/index.js +0 -3
  126. package/components/BaseLayerToggler/index.js.map +0 -1
  127. package/components/BasicMap/BasicMap.test.js +0 -288
  128. package/components/BasicMap/BasicMap.test.js.map +0 -1
  129. package/components/CanvasSaveButton/CanvasSaveButton.test.js +0 -173
  130. package/components/CanvasSaveButton/CanvasSaveButton.test.js.map +0 -1
  131. package/components/Copyright/Copyright.test.js +0 -133
  132. package/components/Copyright/Copyright.test.js.map +0 -1
  133. package/components/FeatureExportButton/FeatureExportButton.test.js +0 -407
  134. package/components/FeatureExportButton/FeatureExportButton.test.js.map +0 -1
  135. package/components/FilterButton/FilterButton.js +0 -131
  136. package/components/FilterButton/FilterButton.js.map +0 -1
  137. package/components/FilterButton/FilterButton.scss +0 -36
  138. package/components/FilterButton/FilterButton.test.js +0 -48
  139. package/components/FilterButton/FilterButton.test.js.map +0 -1
  140. package/components/FilterButton/index.js +0 -3
  141. package/components/FilterButton/index.js.map +0 -1
  142. package/components/FitExtent/FitExtent.test.js +0 -44
  143. package/components/FitExtent/FitExtent.test.js.map +0 -1
  144. package/components/FollowButton/FollowButton.js +0 -143
  145. package/components/FollowButton/FollowButton.js.map +0 -1
  146. package/components/FollowButton/FollowButton.scss +0 -36
  147. package/components/FollowButton/FollowButton.test.js +0 -57
  148. package/components/FollowButton/FollowButton.test.js.map +0 -1
  149. package/components/FollowButton/index.js +0 -3
  150. package/components/FollowButton/index.js.map +0 -1
  151. package/components/Geolocation/Geolocation.test.js +0 -263
  152. package/components/Geolocation/Geolocation.test.js.map +0 -1
  153. package/components/LayerTree/LayerTree.test.js +0 -323
  154. package/components/LayerTree/LayerTree.test.js.map +0 -1
  155. package/components/MousePosition/MousePosition.test.js +0 -125
  156. package/components/MousePosition/MousePosition.test.js.map +0 -1
  157. package/components/NorthArrow/NorthArrow.test.js +0 -106
  158. package/components/NorthArrow/NorthArrow.test.js.map +0 -1
  159. package/components/Overlay/Overlay.test.js +0 -145
  160. package/components/Overlay/Overlay.test.js.map +0 -1
  161. package/components/Permalink/Permalink.test.js +0 -267
  162. package/components/Permalink/Permalink.test.js.map +0 -1
  163. package/components/Popup/Popup.test.js +0 -291
  164. package/components/Popup/Popup.test.js.map +0 -1
  165. package/components/ResizeHandler/ResizeHandler.test.js +0 -410
  166. package/components/ResizeHandler/ResizeHandler.test.js.map +0 -1
  167. package/components/RouteSchedule/RouteSchedule.test.js +0 -102
  168. package/components/RouteSchedule/RouteSchedule.test.js.map +0 -1
  169. package/components/ScaleLine/ScaleLine.test.js +0 -32
  170. package/components/ScaleLine/ScaleLine.test.js.map +0 -1
  171. package/components/Search/Search.js +0 -230
  172. package/components/Search/Search.js.map +0 -1
  173. package/components/Search/Search.md.scss +0 -4
  174. package/components/Search/Search.scss +0 -78
  175. package/components/Search/Search.test.js +0 -15
  176. package/components/Search/Search.test.js.map +0 -1
  177. package/components/Search/SearchService.js +0 -72
  178. package/components/Search/SearchService.js.map +0 -1
  179. package/components/Search/engines/Engine.js +0 -26
  180. package/components/Search/engines/Engine.js.map +0 -1
  181. package/components/Search/engines/StopFinder.js +0 -47
  182. package/components/Search/engines/StopFinder.js.map +0 -1
  183. package/components/Search/index.js +0 -6
  184. package/components/Search/index.js.map +0 -1
  185. package/components/StopsFinder/StopsFinder.test.js +0 -19
  186. package/components/StopsFinder/StopsFinder.test.js.map +0 -1
  187. package/components/TrackerControl/TrackerControl.js +0 -171
  188. package/components/TrackerControl/TrackerControl.js.map +0 -1
  189. package/components/TrackerControl/TrackerControl.scss +0 -30
  190. package/components/TrackerControl/TrackerControl.test.js +0 -17
  191. package/components/TrackerControl/TrackerControl.test.js.map +0 -1
  192. package/components/TrackerControl/index.js +0 -3
  193. package/components/TrackerControl/index.js.map +0 -1
  194. package/components/Zoom/Zoom.test.js +0 -150
  195. package/components/Zoom/Zoom.test.js.map +0 -1
  196. package/images/FilterButton/filter.svg +0 -1
  197. package/images/FollowButton/follow.svg +0 -1
  198. package/images/baselayer/osm.baselayer.hot.png +0 -0
  199. package/images/baselayer/osm.baselayer.png +0 -0
  200. package/styleguidist/ComponentsList.js +0 -52
  201. package/styleguidist/ComponentsList.js.map +0 -1
  202. package/styleguidist/StyleGuide.js +0 -253
  203. package/styleguidist/StyleGuide.js.map +0 -1
  204. package/utils/KML.test.js +0 -163
  205. package/utils/KML.test.js.map +0 -1
  206. package/utils/KMLFormat.js +0 -105
  207. package/utils/KMLFormat.js.map +0 -1
  208. package/utils/KMLFormat.test.js +0 -22
  209. package/utils/KMLFormat.test.js.map +0 -1
  210. package/utils/getPolygonPattern.test.js +0 -66
  211. package/utils/getPolygonPattern.test.js.map +0 -1
  212. package/utils/timeUtils.test.js +0 -32
  213. package/utils/timeUtils.test.js.map +0 -1
package/README.md CHANGED
@@ -2,22 +2,21 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/react-spatial.svg?style=flat-square)](https://www.npmjs.com/package/react-spatial)
4
4
  [![build](https://github.com/geops/react-spatial/workflows/main/badge.svg)](https://github.com/geops/react-spatial/actions?query=workflow%3Amain)
5
- [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com)
6
5
  [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
7
- [![Netlify Status](https://api.netlify.com/api/v1/badges/8f7b7082-8998-4e1f-9a34-4d8cd18e6003/deploy-status)](https://app.netlify.com/sites/react-spatial/deploys)
6
+ ![Vercel](https://vercelbadge.vercel.app/api/geops/react-spatial)
8
7
 
9
- This library provides React components to build web applications and to visualize real-time geographical information based on [OpenLayers](https://openlayers.org/) and [Mapbox GL](https://docs.mapbox.com/mapbox-gl-js/api/).
8
+ This library provides React components to build web applications and to visualize real-time geographical information based on [OpenLayers](https://openlayers.org/) and [MapLibre GL JS](https://maplibre.org/maplibre-gl-js/).
10
9
 
11
- This library uses the [mobility-toolbox-js](https://mobility-toolbox-js.geops.io/) library.
10
+ This library uses the [mobility-toolbox-js](https://mobility-toolbox-js.geops.io/) library for some components.
12
11
 
13
- Documentation and examples at https://react-spatial.geops.de.
12
+ Documentation and examples at https://react-spatial.geops.io.
14
13
 
15
14
  ## Getting Started
16
15
 
17
16
  Install the [react-spatial](https://www.npmjs.com/package/react-spatial) package:
18
17
 
19
18
  ```bash
20
- yarn add mobility-toolbox-js mapbox-gl ol react-spatial
19
+ yarn add maplibre-gl ol mobility-toolbox-js react-spatial
21
20
  ```
22
21
 
23
22
  Your build pipeline needs to support ES6 modules and SASS.
@@ -37,7 +36,3 @@ import 'react-spatial/themes/default/index.scss';
37
36
  ## Bugs
38
37
 
39
38
  Please use the [GitHub issue tracker](https://github.com/geops/react-spatial/issues) for all bugs and feature requests. Before creating a new issue, do a quick search to see if the problem has been reported already.
40
-
41
- ## Version 1.x.x
42
-
43
- The master branch is now open for the version 2 development. The version 1 is now available in 1.x.x branch.
@@ -1,276 +1,299 @@
1
- /* eslint-disable jsx-a11y/interactive-supports-focus */
2
- import React, { useState, useEffect } from 'react';
3
- import PropTypes from 'prop-types';
4
- import { FaChevronLeft } from 'react-icons/fa';
5
- import { Layer } from 'mobility-toolbox-js/ol';
6
-
7
- import './BaseLayerSwitcher.scss';
8
-
9
- var propTypes = {
1
+ import Layer from "ol/layer/Layer";
2
+ import { unByKey } from "ol/Observable";
3
+ import PropTypes from "prop-types";
4
+ import React, { useEffect, useState } from "react";
5
+ import { FaChevronLeft } from "react-icons/fa";
6
+ const propTypes = {
10
7
  /**
11
- * An array of [mobility-toolbox-js layers](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers).
8
+ * CSS class to apply on the container.
12
9
  */
13
- layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)).isRequired,
14
-
10
+ className: PropTypes.string,
11
+ /**
12
+ * Image (node) rendered in the switcher close button.
13
+ */
14
+ closeButtonImage: PropTypes.node,
15
+ /**
16
+ * Function that returns the alternative text if the layer's image is not found.
17
+ */
18
+ getAltText: PropTypes.func,
19
+ /**
20
+ * Function that returns the label to display att the bootm of the layer's image and as title attribute.
21
+ */
22
+ getLayerLabel: PropTypes.func,
15
23
  /**
16
24
  * Object containing relative paths to the base layer images. Object
17
25
  * keys need to correspond to layer keys
18
26
  */
19
27
  layerImages: PropTypes.objectOf(PropTypes.string),
20
-
21
28
  /**
22
- * CSS class to apply on the container.
29
+ * An array of [mobility-toolbox-js layers](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers).
23
30
  */
24
- className: PropTypes.string,
25
-
31
+ layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)).isRequired,
26
32
  /**
27
- * Alternative text rendered if layer images can't be loaded
33
+ * Callback function on close button click.
34
+ * @param {function} Callback function triggered when a switcher button is clicked. Takes the event as argument.
28
35
  */
29
- altText: PropTypes.string,
30
-
36
+ onCloseButtonClick: PropTypes.func,
31
37
  /**
32
- * Button titles.
38
+ * Callback function on layer button click.
39
+ * @param {function} Callback function triggered when a switcher button is clicked. Takes the event and the layer as arguments.
33
40
  */
34
- titles: PropTypes.shape({
35
- button: PropTypes.string,
36
- openSwitcher: PropTypes.string,
37
- closeSwitcher: PropTypes.string,
38
- }),
39
-
41
+ onLayerButtonClick: PropTypes.func,
40
42
  /**
41
- * Image (node) rendered in the switcher close button.
43
+ * Callback function on main switcher button click.
44
+ * @param {function} Callback function triggered when a switcher button is clicked. Takes the event as argument.
42
45
  */
43
- closeButtonImage: PropTypes.node,
44
-
46
+ onSwitcherButtonClick: PropTypes.func,
45
47
  /**
46
- * Translation function.
47
- * @param {function} Translation function returning the translated string.
48
+ * Button titles.
48
49
  */
49
- t: PropTypes.func,
50
- };
51
-
52
- var defaultProps = {
53
- className: 'rs-base-layer-switcher',
54
- altText: 'Source not found',
55
- titles: {
56
- button: 'Base layers',
57
- openSwitcher: 'Open Baselayer-Switcher',
58
- closeSwitcher: 'Close Baselayer-Switcher',
59
- },
60
- closeButtonImage: React.createElement( FaChevronLeft, null ),
61
- layerImages: undefined,
62
- t: function (s) {
63
- return s;
64
- },
50
+ titles: PropTypes.shape({
51
+ button: PropTypes.string,
52
+ closeSwitcher: PropTypes.string,
53
+ openSwitcher: PropTypes.string
54
+ })
65
55
  };
66
-
67
- var getVisibleLayer = function (layers) {
68
- return layers.find(function (layer) {
69
- return layer.visible;
56
+ const getVisibleLayer = (layers) => {
57
+ return layers.find((layer) => {
58
+ return layer.getVisible ? layer.getVisible() : layer.visible;
70
59
  });
71
60
  };
72
-
73
- var getNextImage = function (currentLayer, layers, layerImages) {
74
- var currentIndex = layers.indexOf(
75
- layers.find(function (layer) {
61
+ const getNextImage = (currentLayer, layers, layerImages) => {
62
+ const currentIndex = layers.indexOf(
63
+ layers.find((layer) => {
76
64
  return layer === currentLayer;
77
65
  })
78
66
  );
79
- var nextIndex = currentIndex + 1 === layers.length ? 0 : currentIndex + 1;
67
+ const nextIndex = currentIndex + 1 === layers.length ? 0 : currentIndex + 1;
80
68
  return layerImages[nextIndex];
81
69
  };
82
-
83
- var getImageStyle = function (url) {
84
- return url
85
- ? {
86
- backgroundImage: ("url(" + url + ")"),
87
- backgroundSize: 'cover',
88
- backgroundRepeat: 'no-repeat',
89
- backgroundPosition: 'center',
90
- }
91
- : null;
70
+ const getImageStyle = (url) => {
71
+ return url ? {
72
+ backgroundImage: `url(${url})`,
73
+ backgroundPosition: "center",
74
+ backgroundRepeat: "no-repeat",
75
+ backgroundSize: "cover"
76
+ } : null;
92
77
  };
93
-
94
- /**
95
- * The BaseLayerSwitcher component renders a button interface for switching the visible
96
- * [mobility-toolbox-js layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers)
97
- * when defined as base layer.
98
- */
99
-
100
- function BaseLayerSwitcher(ref) {
101
- var layers = ref.layers;
102
- var layerImages = ref.layerImages;
103
- var className = ref.className;
104
- var altText = ref.altText;
105
- var titles = ref.titles;
106
- var closeButtonImage = ref.closeButtonImage;
107
- var t = ref.t;
108
-
109
- var baseLayers = layers.filter(function (layer) {
110
- return layer.isBaseLayer;
111
- });
112
- var ref$1 = useState(false);
113
- var switcherOpen = ref$1[0];
114
- var setSwitcherOpen = ref$1[1];
115
- var ref$2 = useState(true);
116
- var isClosed = ref$2[0];
117
- var setIsClosed = ref$2[1];
118
- var ref$3 = useState(
119
- getVisibleLayer(baseLayers) || baseLayers[0]
78
+ function CloseButton({ children, onClick, tabIndex, title }) {
79
+ return /* @__PURE__ */ React.createElement(
80
+ "div",
81
+ {
82
+ "aria-label": title,
83
+ className: "rs-base-layer-switcher-close-btn",
84
+ onClick,
85
+ onKeyPress: (e) => {
86
+ return e.which === 13 && onClick();
87
+ },
88
+ role: "button",
89
+ tabIndex,
90
+ title
91
+ },
92
+ children
120
93
  );
121
- var currentLayer = ref$3[0];
122
- var setCurrentLayer = ref$3[1];
123
-
124
- /* Images are loaded from props if provided, fallback from layer */
125
- var images = layerImages
126
- ? Object.keys(layerImages).map(function (layerImage) {
127
- return layerImages[layerImage];
128
- })
129
- : baseLayers.map(function (layer) {
130
- return layer.get('previewImage');
131
- });
132
-
133
- var openClass = switcherOpen ? ' rs-open' : '';
134
- var hiddenStyle = switcherOpen && !isClosed ? 'visible' : 'hidden';
135
-
136
- var handleSwitcherClick = function () {
137
- if (baseLayers.length === 2) {
138
- /* On only two layer options the opener becomes a layer toggle button */
139
- var nextLayer = baseLayers.find(function (layer) {
140
- return !layer.visible;
141
- });
142
- currentLayer.setVisible(false);
94
+ }
95
+ CloseButton.propTypes = {
96
+ children: PropTypes.node.isRequired,
97
+ onClick: PropTypes.func.isRequired,
98
+ tabIndex: PropTypes.string.isRequired,
99
+ title: PropTypes.string.isRequired
100
+ };
101
+ const defaultTitles = {
102
+ button: "Base layers",
103
+ closeSwitcher: "Close Baselayer-Switcher",
104
+ openSwitcher: "Open Baselayer-Switcher"
105
+ };
106
+ const getDefaultLabel = (layer) => {
107
+ return layer?.get("name") || "";
108
+ };
109
+ const getDefaultAltText = () => {
110
+ return "Source not found";
111
+ };
112
+ function BaseLayerSwitcher({
113
+ className = "rs-base-layer-switcher",
114
+ closeButtonImage = /* @__PURE__ */ React.createElement(FaChevronLeft, null),
115
+ getAltText = getDefaultAltText,
116
+ getLayerLabel = getDefaultLabel,
117
+ layerImages,
118
+ layers,
119
+ onCloseButtonClick,
120
+ onLayerButtonClick,
121
+ onSwitcherButtonClick,
122
+ titles = defaultTitles
123
+ }) {
124
+ const [switcherOpen, setSwitcherOpen] = useState(false);
125
+ const [isClosed, setIsClosed] = useState(true);
126
+ const [currentLayer, setCurrentLayer] = useState(
127
+ getVisibleLayer(layers) || layers[0]
128
+ );
129
+ const images = layerImages ? Object.keys(layerImages).map((layerImage) => {
130
+ return layerImages[layerImage];
131
+ }) : layers.map((layer) => {
132
+ return layer.get("previewImage");
133
+ });
134
+ const openClass = switcherOpen ? " rs-open" : "";
135
+ const hiddenStyle = switcherOpen && !isClosed ? "visible" : "hidden";
136
+ const handleSwitcherClick = (evt) => {
137
+ const nextLayer = layers.find((layer) => {
138
+ return !(layer.getVisible ? layer.getVisible() : layer.visible);
139
+ });
140
+ const onButtonClick = layers.length === 2 ? onLayerButtonClick : onSwitcherButtonClick;
141
+ if (onButtonClick) {
142
+ onButtonClick(evt, nextLayer);
143
+ }
144
+ if (layers.length === 2) {
145
+ if (currentLayer.setVisible) {
146
+ currentLayer.setVisible(false);
147
+ } else {
148
+ currentLayer.visible = false;
149
+ }
143
150
  setCurrentLayer(nextLayer);
144
- nextLayer.setVisible(true);
151
+ if (nextLayer.setVisible) {
152
+ nextLayer.setVisible(true);
153
+ } else {
154
+ nextLayer.visible = true;
155
+ }
145
156
  return;
146
157
  }
147
- // eslint-disable-next-line consistent-return
148
158
  return setSwitcherOpen(true) && setIsClosed(false);
149
159
  };
150
-
151
- var onLayerSelect = function (layer) {
160
+ const onLayerSelect = (layer, evt) => {
161
+ if (onLayerButtonClick) {
162
+ onLayerButtonClick(evt, layer);
163
+ }
152
164
  if (!switcherOpen) {
153
165
  setSwitcherOpen(true);
154
166
  return;
155
167
  }
156
168
  setCurrentLayer(layer);
157
- layer.setVisible(true);
158
- baseLayers
159
- .filter(function (l) {
160
- return l !== layer;
161
- })
162
- .forEach(function (l) {
163
- return l.setVisible(false);
164
- });
169
+ if (layer.setVisible) {
170
+ layer.setVisible(true);
171
+ } else {
172
+ layer.visible = true;
173
+ }
174
+ layers.filter((l) => {
175
+ return l !== layer;
176
+ }).forEach((l) => {
177
+ if (l.setVisible) {
178
+ l.setVisible(false);
179
+ } else {
180
+ l.visible = false;
181
+ }
182
+ });
165
183
  setSwitcherOpen(false);
166
184
  };
167
-
168
- /* Get next image for closed button */
169
- var nextImage = getNextImage(currentLayer, baseLayers, images);
170
-
171
- useEffect(function () {
172
- /* Ensure correct layer is active on app load */
173
- if (currentLayer !== getVisibleLayer(baseLayers)) {
174
- setCurrentLayer(getVisibleLayer(baseLayers) || baseLayers[0]);
185
+ const nextImage = getNextImage(currentLayer, layers, images);
186
+ useEffect(() => {
187
+ if (currentLayer !== getVisibleLayer(layers)) {
188
+ setCurrentLayer(getVisibleLayer(layers) || layers[0]);
175
189
  }
176
- }, [currentLayer, baseLayers]);
177
-
178
- useEffect(function () {
179
- /* Used for correct layer image render with animation */
180
- var timeout;
190
+ }, [currentLayer, layers]);
191
+ useEffect(() => {
192
+ let timeout;
181
193
  if (!switcherOpen) {
182
- timeout = setTimeout(function () {
194
+ timeout = setTimeout(() => {
183
195
  setIsClosed(true);
184
196
  }, 200);
185
197
  } else {
186
- timeout = setTimeout(function () {
198
+ timeout = setTimeout(() => {
187
199
  setIsClosed(false);
188
200
  }, 800);
189
201
  }
190
- return function () {
202
+ return () => {
191
203
  return clearTimeout(timeout);
192
204
  };
193
205
  }, [switcherOpen]);
194
-
195
- if (!baseLayers || baseLayers.length < 2 || !currentLayer) {
206
+ useEffect(() => {
207
+ const olKeys = (layers || []).map((layer) => {
208
+ return layer.on("change:visible", (evt) => {
209
+ const vis = evt.target.getVisible ? evt.target.getVisible() : evt.target.visible;
210
+ if (vis && currentLayer !== evt.target) {
211
+ setCurrentLayer(evt.target);
212
+ }
213
+ });
214
+ });
215
+ return () => {
216
+ unByKey(olKeys);
217
+ };
218
+ }, [currentLayer, layers]);
219
+ if (!layers || layers.length < 2 || !currentLayer) {
196
220
  return null;
197
221
  }
198
-
199
- var toggleBtn = (
200
- React.createElement( 'div', { className: "rs-base-layer-switcher-btn-wrapper" },
201
- React.createElement( 'div', {
202
- className: "rs-base-layer-switcher-close-btn", role: "button", onClick: function () {
203
- return setSwitcherOpen(false);
204
- }, onKeyPress: function (e) {
205
- return e.which === 13 && setSwitcherOpen(false);
206
- }, tabIndex: switcherOpen ? '0' : '-1', 'aria-label': titles.closeSwitcher, title: titles.closeSwitcher },
207
- closeButtonImage
222
+ const firstNonVisibleLayer = layers.find((layer) => {
223
+ return !(layer.getVisible ? layer.getVisible() : layer.visible);
224
+ });
225
+ return /* @__PURE__ */ React.createElement("div", { className: `${className}${openClass}` }, /* @__PURE__ */ React.createElement(
226
+ "div",
227
+ {
228
+ "aria-label": titles.openSwitcher,
229
+ className: `rs-base-layer-switcher-button rs-opener${openClass}`,
230
+ onClick: handleSwitcherClick,
231
+ onKeyPress: (e) => {
232
+ if (e.which === 13) {
233
+ handleSwitcherClick();
234
+ }
235
+ },
236
+ role: "button",
237
+ style: getImageStyle(nextImage),
238
+ tabIndex: "0",
239
+ title: titles.openSwitcher
240
+ },
241
+ /* @__PURE__ */ React.createElement("div", { className: "rs-base-layer-switcher-title" }, layers.length !== 2 ? titles.button : firstNonVisibleLayer && getLayerLabel(firstNonVisibleLayer)),
242
+ nextImage ? null : /* @__PURE__ */ React.createElement("span", { className: "rs-alt-text" }, getAltText(firstNonVisibleLayer))
243
+ ), layers.map((layer, idx) => {
244
+ const layerName = getLayerLabel(layer);
245
+ const activeClass = layerName === currentLayer.get("name") ? " rs-active" : "";
246
+ const imageStyle = getImageStyle(
247
+ layerImages ? layerImages[`${layer.get("key") || layer.key}`] : layer.get("previewImage")
248
+ );
249
+ return /* @__PURE__ */ React.createElement(
250
+ "div",
251
+ {
252
+ className: "rs-base-layer-switcher-btn-wrapper",
253
+ key: layer.key,
254
+ style: {
255
+ /* stylelint-disable-next-line value-keyword-case */
256
+ overflow: hiddenStyle,
257
+ /* stylelint-disable-next-line value-keyword-case */
258
+ zIndex: layers.length - idx
259
+ }
260
+ },
261
+ /* @__PURE__ */ React.createElement(
262
+ "div",
263
+ {
264
+ "aria-label": layerName,
265
+ className: `rs-base-layer-switcher-button${openClass}`,
266
+ onClick: (evt) => {
267
+ return onLayerSelect(layer, evt);
268
+ },
269
+ onKeyPress: (evt) => {
270
+ if (evt.which === 13) {
271
+ onLayerSelect(layer, evt);
272
+ }
273
+ },
274
+ role: "button",
275
+ style: imageStyle,
276
+ tabIndex: switcherOpen ? "0" : "-1",
277
+ title: layerName
278
+ },
279
+ /* @__PURE__ */ React.createElement("div", { className: `rs-base-layer-switcher-title${activeClass}` }, layerName),
280
+ imageStyle ? null : /* @__PURE__ */ React.createElement("span", { className: "rs-alt-text" }, getAltText(layer))
208
281
  )
209
- )
210
- );
211
-
212
- return (
213
- React.createElement( 'div', { className: ("" + className + openClass) },
214
- React.createElement( 'div', {
215
- className: ("rs-base-layer-switcher-button rs-opener" + openClass), role: "button", title: titles.openSwitcher, 'aria-label': titles.openSwitcher, onClick: handleSwitcherClick, onKeyPress: function (e) {
216
- if (e.which === 13) {
217
- handleSwitcherClick();
218
- }
219
- }, style: getImageStyle(nextImage), tabIndex: "0" },
220
- React.createElement( 'div', { className: "rs-base-layer-switcher-title" },
221
- baseLayers.length !== 2
222
- ? titles.button
223
- : baseLayers.find(function (layer) {
224
- return !layer.visible;
225
- }) &&
226
- t(
227
- baseLayers.find(function (layer) {
228
- return !layer.visible;
229
- }).name
230
- )
231
- ),
232
- nextImage ? null : React.createElement( 'span', { className: "rs-alt-text" }, t(altText))
233
- ),
234
- baseLayers.map(function (layer, idx) {
235
- var layerName = layer.name;
236
- var activeClass = layerName === currentLayer.name ? ' rs-active' : '';
237
- var imageStyle = getImageStyle(
238
- layerImages ? layerImages[("" + (layer.key))] : layer.get('previewImage')
239
- );
240
- return (
241
- React.createElement( 'div', {
242
- key: layer.key, className: "rs-base-layer-switcher-btn-wrapper", style: {
243
- /* stylelint-disable-next-line value-keyword-case */
244
- overflow: hiddenStyle,
245
- /* stylelint-disable-next-line value-keyword-case */
246
- zIndex: baseLayers.length - idx,
247
- } },
248
- React.createElement( 'div', {
249
- className: ("rs-base-layer-switcher-button" + openClass), role: "button", title: t(layerName), 'aria-label': t(layerName), onClick: function () {
250
- return onLayerSelect(layer);
251
- }, onKeyPress: function (e) {
252
- if (e.which === 13) {
253
- onLayerSelect(layer);
254
- }
255
- }, style: imageStyle, tabIndex: switcherOpen ? '0' : '-1' },
256
- React.createElement( 'div', { className: ("rs-base-layer-switcher-title" + activeClass) },
257
- t(layerName)
258
- ),
259
- imageStyle ? null : (
260
- React.createElement( 'span', { className: "rs-alt-text" }, t(altText))
261
- )
262
- )
263
- )
264
- );
265
- }),
266
- toggleBtn
267
- )
268
- );
282
+ );
283
+ }), /* @__PURE__ */ React.createElement(
284
+ CloseButton,
285
+ {
286
+ onClick: (evt) => {
287
+ if (onCloseButtonClick) {
288
+ onCloseButtonClick(evt);
289
+ }
290
+ setSwitcherOpen(false);
291
+ },
292
+ tabIndex: switcherOpen ? "0" : "-1",
293
+ title: titles.closeSwitcher
294
+ },
295
+ closeButtonImage
296
+ ));
269
297
  }
270
-
271
298
  BaseLayerSwitcher.propTypes = propTypes;
272
- BaseLayerSwitcher.defaultProps = defaultProps;
273
-
274
299
  export default BaseLayerSwitcher;
275
-
276
- //# sourceMappingURL=BaseLayerSwitcher.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"BaseLayerSwitcher.js","sources":["../../../src/components/BaseLayerSwitcher/BaseLayerSwitcher.js"],"sourcesContent":["/* eslint-disable jsx-a11y/interactive-supports-focus */\nimport React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { FaChevronLeft } from 'react-icons/fa';\nimport { Layer } from 'mobility-toolbox-js/ol';\n\nimport './BaseLayerSwitcher.scss';\n\nconst propTypes = {\n /**\n * An array of [mobility-toolbox-js layers](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers).\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)).isRequired,\n\n /**\n * Object containing relative paths to the base layer images. Object\n * keys need to correspond to layer keys\n */\n layerImages: PropTypes.objectOf(PropTypes.string),\n\n /**\n * CSS class to apply on the container.\n */\n className: PropTypes.string,\n\n /**\n * Alternative text rendered if layer images can't be loaded\n */\n altText: PropTypes.string,\n\n /**\n * Button titles.\n */\n titles: PropTypes.shape({\n button: PropTypes.string,\n openSwitcher: PropTypes.string,\n closeSwitcher: PropTypes.string,\n }),\n\n /**\n * Image (node) rendered in the switcher close button.\n */\n closeButtonImage: PropTypes.node,\n\n /**\n * Translation function.\n * @param {function} Translation function returning the translated string.\n */\n t: PropTypes.func,\n};\n\nconst defaultProps = {\n className: 'rs-base-layer-switcher',\n altText: 'Source not found',\n titles: {\n button: 'Base layers',\n openSwitcher: 'Open Baselayer-Switcher',\n closeSwitcher: 'Close Baselayer-Switcher',\n },\n closeButtonImage: <FaChevronLeft />,\n layerImages: undefined,\n t: (s) => {\n return s;\n },\n};\n\nconst getVisibleLayer = (layers) => {\n return layers.find((layer) => {\n return layer.visible;\n });\n};\n\nconst getNextImage = (currentLayer, layers, layerImages) => {\n const currentIndex = layers.indexOf(\n layers.find((layer) => {\n return layer === currentLayer;\n }),\n );\n const nextIndex = currentIndex + 1 === layers.length ? 0 : currentIndex + 1;\n return layerImages[nextIndex];\n};\n\nconst getImageStyle = (url) => {\n return url\n ? {\n backgroundImage: `url(${url})`,\n backgroundSize: 'cover',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center',\n }\n : null;\n};\n\n/**\n * The BaseLayerSwitcher component renders a button interface for switching the visible\n * [mobility-toolbox-js layer](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers)\n * when defined as base layer.\n */\n\nfunction BaseLayerSwitcher({\n layers,\n layerImages,\n className,\n altText,\n titles,\n closeButtonImage,\n t,\n}) {\n const baseLayers = layers.filter((layer) => {\n return layer.isBaseLayer;\n });\n const [switcherOpen, setSwitcherOpen] = useState(false);\n const [isClosed, setIsClosed] = useState(true);\n const [currentLayer, setCurrentLayer] = useState(\n getVisibleLayer(baseLayers) || baseLayers[0],\n );\n\n /* Images are loaded from props if provided, fallback from layer */\n const images = layerImages\n ? Object.keys(layerImages).map((layerImage) => {\n return layerImages[layerImage];\n })\n : baseLayers.map((layer) => {\n return layer.get('previewImage');\n });\n\n const openClass = switcherOpen ? ' rs-open' : '';\n const hiddenStyle = switcherOpen && !isClosed ? 'visible' : 'hidden';\n\n const handleSwitcherClick = () => {\n if (baseLayers.length === 2) {\n /* On only two layer options the opener becomes a layer toggle button */\n const nextLayer = baseLayers.find((layer) => {\n return !layer.visible;\n });\n currentLayer.setVisible(false);\n setCurrentLayer(nextLayer);\n nextLayer.setVisible(true);\n return;\n }\n // eslint-disable-next-line consistent-return\n return setSwitcherOpen(true) && setIsClosed(false);\n };\n\n const onLayerSelect = (layer) => {\n if (!switcherOpen) {\n setSwitcherOpen(true);\n return;\n }\n setCurrentLayer(layer);\n layer.setVisible(true);\n baseLayers\n .filter((l) => {\n return l !== layer;\n })\n .forEach((l) => {\n return l.setVisible(false);\n });\n setSwitcherOpen(false);\n };\n\n /* Get next image for closed button */\n const nextImage = getNextImage(currentLayer, baseLayers, images);\n\n useEffect(() => {\n /* Ensure correct layer is active on app load */\n if (currentLayer !== getVisibleLayer(baseLayers)) {\n setCurrentLayer(getVisibleLayer(baseLayers) || baseLayers[0]);\n }\n }, [currentLayer, baseLayers]);\n\n useEffect(() => {\n /* Used for correct layer image render with animation */\n let timeout;\n if (!switcherOpen) {\n timeout = setTimeout(() => {\n setIsClosed(true);\n }, 200);\n } else {\n timeout = setTimeout(() => {\n setIsClosed(false);\n }, 800);\n }\n return () => {\n return clearTimeout(timeout);\n };\n }, [switcherOpen]);\n\n if (!baseLayers || baseLayers.length < 2 || !currentLayer) {\n return null;\n }\n\n const toggleBtn = (\n <div className=\"rs-base-layer-switcher-btn-wrapper\">\n <div\n className=\"rs-base-layer-switcher-close-btn\"\n role=\"button\"\n onClick={() => {\n return setSwitcherOpen(false);\n }}\n onKeyPress={(e) => {\n return e.which === 13 && setSwitcherOpen(false);\n }}\n tabIndex={switcherOpen ? '0' : '-1'}\n aria-label={titles.closeSwitcher}\n title={titles.closeSwitcher}\n >\n {closeButtonImage}\n </div>\n </div>\n );\n\n return (\n <div className={`${className}${openClass}`}>\n <div\n className={`rs-base-layer-switcher-button rs-opener${openClass}`}\n role=\"button\"\n title={titles.openSwitcher}\n aria-label={titles.openSwitcher}\n onClick={handleSwitcherClick}\n onKeyPress={(e) => {\n if (e.which === 13) {\n handleSwitcherClick();\n }\n }}\n style={getImageStyle(nextImage)}\n tabIndex=\"0\"\n >\n <div className=\"rs-base-layer-switcher-title\">\n {baseLayers.length !== 2\n ? titles.button\n : baseLayers.find((layer) => {\n return !layer.visible;\n }) &&\n t(\n baseLayers.find((layer) => {\n return !layer.visible;\n }).name,\n )}\n </div>\n {nextImage ? null : <span className=\"rs-alt-text\">{t(altText)}</span>}\n </div>\n {baseLayers.map((layer, idx) => {\n const layerName = layer.name;\n const activeClass = layerName === currentLayer.name ? ' rs-active' : '';\n const imageStyle = getImageStyle(\n layerImages ? layerImages[`${layer.key}`] : layer.get('previewImage'),\n );\n return (\n <div\n key={layer.key}\n className=\"rs-base-layer-switcher-btn-wrapper\"\n style={{\n /* stylelint-disable-next-line value-keyword-case */\n overflow: hiddenStyle,\n /* stylelint-disable-next-line value-keyword-case */\n zIndex: baseLayers.length - idx,\n }}\n >\n <div\n className={`rs-base-layer-switcher-button${openClass}`}\n role=\"button\"\n title={t(layerName)}\n aria-label={t(layerName)}\n onClick={() => {\n return onLayerSelect(layer);\n }}\n onKeyPress={(e) => {\n if (e.which === 13) {\n onLayerSelect(layer);\n }\n }}\n style={imageStyle}\n tabIndex={switcherOpen ? '0' : '-1'}\n >\n <div className={`rs-base-layer-switcher-title${activeClass}`}>\n {t(layerName)}\n </div>\n {imageStyle ? null : (\n <span className=\"rs-alt-text\">{t(altText)}</span>\n )}\n </div>\n </div>\n );\n })}\n {toggleBtn}\n </div>\n );\n}\n\nBaseLayerSwitcher.propTypes = propTypes;\nBaseLayerSwitcher.defaultProps = defaultProps;\n\nexport default BaseLayerSwitcher;\n"],"names":["const","let"],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/BaseLayerSwitcher/BaseLayerSwitcher.js"],
4
+ "sourcesContent": ["import Layer from \"ol/layer/Layer\";\nimport { unByKey } from \"ol/Observable\";\nimport PropTypes from \"prop-types\";\n/* eslint-disable jsx-a11y/interactive-supports-focus */\nimport React, { useEffect, useState } from \"react\";\nimport { FaChevronLeft } from \"react-icons/fa\";\n\nconst propTypes = {\n /**\n * CSS class to apply on the container.\n */\n className: PropTypes.string,\n\n /**\n * Image (node) rendered in the switcher close button.\n */\n closeButtonImage: PropTypes.node,\n\n /**\n * Function that returns the alternative text if the layer's image is not found.\n */\n getAltText: PropTypes.func,\n\n /**\n * Function that returns the label to display att the bootm of the layer's image and as title attribute.\n */\n getLayerLabel: PropTypes.func,\n\n /**\n * Object containing relative paths to the base layer images. Object\n * keys need to correspond to layer keys\n */\n layerImages: PropTypes.objectOf(PropTypes.string),\n\n /**\n * An array of [mobility-toolbox-js layers](https://mobility-toolbox-js.geops.io/api/identifiers%20html#ol-layers).\n */\n layers: PropTypes.arrayOf(PropTypes.instanceOf(Layer)).isRequired,\n\n /**\n * Callback function on close button click.\n * @param {function} Callback function triggered when a switcher button is clicked. Takes the event as argument.\n */\n onCloseButtonClick: PropTypes.func,\n\n /**\n * Callback function on layer button click.\n * @param {function} Callback function triggered when a switcher button is clicked. Takes the event and the layer as arguments.\n */\n onLayerButtonClick: PropTypes.func,\n\n /**\n * Callback function on main switcher button click.\n * @param {function} Callback function triggered when a switcher button is clicked. Takes the event as argument.\n */\n onSwitcherButtonClick: PropTypes.func,\n\n /**\n * Button titles.\n */\n titles: PropTypes.shape({\n button: PropTypes.string,\n closeSwitcher: PropTypes.string,\n openSwitcher: PropTypes.string,\n }),\n};\n\nconst getVisibleLayer = (layers) => {\n return layers.find((layer) => {\n return layer.getVisible ? layer.getVisible() : layer.visible;\n });\n};\n\nconst getNextImage = (currentLayer, layers, layerImages) => {\n const currentIndex = layers.indexOf(\n layers.find((layer) => {\n return layer === currentLayer;\n }),\n );\n const nextIndex = currentIndex + 1 === layers.length ? 0 : currentIndex + 1;\n return layerImages[nextIndex];\n};\n\nconst getImageStyle = (url) => {\n return url\n ? {\n backgroundImage: `url(${url})`,\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\",\n }\n : null;\n};\n\nfunction CloseButton({ children, onClick, tabIndex, title }) {\n return (\n <div\n aria-label={title}\n className=\"rs-base-layer-switcher-close-btn\"\n onClick={onClick}\n onKeyPress={(e) => {\n return e.which === 13 && onClick();\n }}\n role=\"button\"\n tabIndex={tabIndex}\n title={title}\n >\n {children}\n </div>\n );\n}\n\nCloseButton.propTypes = {\n children: PropTypes.node.isRequired,\n onClick: PropTypes.func.isRequired,\n tabIndex: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n};\n\nconst defaultTitles = {\n button: \"Base layers\",\n closeSwitcher: \"Close Baselayer-Switcher\",\n openSwitcher: \"Open Baselayer-Switcher\",\n};\n\nconst getDefaultLabel = (layer) => {\n return layer?.get(\"name\") || \"\";\n};\n\nconst getDefaultAltText = () => {\n return \"Source not found\";\n};\n\n/**\n * The BaseLayerSwitcher component renders a button interface for switching the visible\n * when defined as base layer.\n */\n\nfunction BaseLayerSwitcher({\n className = \"rs-base-layer-switcher\",\n closeButtonImage = <FaChevronLeft />,\n getAltText = getDefaultAltText,\n getLayerLabel = getDefaultLabel,\n layerImages,\n layers,\n onCloseButtonClick,\n onLayerButtonClick,\n onSwitcherButtonClick,\n titles = defaultTitles,\n}) {\n const [switcherOpen, setSwitcherOpen] = useState(false);\n const [isClosed, setIsClosed] = useState(true);\n const [currentLayer, setCurrentLayer] = useState(\n getVisibleLayer(layers) || layers[0],\n );\n\n /* Images are loaded from props if provided, fallback from layer */\n const images = layerImages\n ? Object.keys(layerImages).map((layerImage) => {\n return layerImages[layerImage];\n })\n : layers.map((layer) => {\n return layer.get(\"previewImage\");\n });\n\n const openClass = switcherOpen ? \" rs-open\" : \"\";\n const hiddenStyle = switcherOpen && !isClosed ? \"visible\" : \"hidden\";\n\n const handleSwitcherClick = (evt) => {\n const nextLayer = layers.find((layer) => {\n return !(layer.getVisible ? layer.getVisible() : layer.visible);\n });\n const onButtonClick =\n layers.length === 2 ? onLayerButtonClick : onSwitcherButtonClick;\n if (onButtonClick) {\n onButtonClick(evt, nextLayer);\n }\n if (layers.length === 2) {\n /* On only two layer options the opener becomes a layer toggle button */\n if (currentLayer.setVisible) {\n currentLayer.setVisible(false);\n } else {\n currentLayer.visible = false;\n }\n setCurrentLayer(nextLayer);\n if (nextLayer.setVisible) {\n nextLayer.setVisible(true);\n } else {\n nextLayer.visible = true;\n }\n return;\n }\n // eslint-disable-next-line consistent-return\n return setSwitcherOpen(true) && setIsClosed(false);\n };\n\n const onLayerSelect = (layer, evt) => {\n if (onLayerButtonClick) {\n onLayerButtonClick(evt, layer);\n }\n if (!switcherOpen) {\n setSwitcherOpen(true);\n return;\n }\n setCurrentLayer(layer);\n if (layer.setVisible) {\n layer.setVisible(true);\n } else {\n // eslint-disable-next-line no-param-reassign\n layer.visible = true;\n }\n layers\n .filter((l) => {\n return l !== layer;\n })\n .forEach((l) => {\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 setSwitcherOpen(false);\n };\n\n /* Get next image for closed button */\n const nextImage = getNextImage(currentLayer, layers, images);\n\n useEffect(() => {\n /* Ensure correct layer is active on app load */\n if (currentLayer !== getVisibleLayer(layers)) {\n setCurrentLayer(getVisibleLayer(layers) || layers[0]);\n }\n }, [currentLayer, layers]);\n\n useEffect(() => {\n /* Used for correct layer image render with animation */\n let timeout;\n if (!switcherOpen) {\n timeout = setTimeout(() => {\n setIsClosed(true);\n }, 200);\n } else {\n timeout = setTimeout(() => {\n setIsClosed(false);\n }, 800);\n }\n return () => {\n return clearTimeout(timeout);\n };\n }, [switcherOpen]);\n\n useEffect(() => {\n // Update the layer selected when a visibility changes.\n const olKeys = (layers || []).map((layer) => {\n return layer.on(\"change:visible\", (evt) => {\n const vis = evt.target.getVisible\n ? evt.target.getVisible()\n : evt.target.visible;\n if (vis && currentLayer !== evt.target) {\n setCurrentLayer(evt.target);\n }\n });\n });\n return () => {\n unByKey(olKeys);\n };\n }, [currentLayer, layers]);\n\n if (!layers || layers.length < 2 || !currentLayer) {\n return null;\n }\n\n const firstNonVisibleLayer = layers.find((layer) => {\n return !(layer.getVisible ? layer.getVisible() : layer.visible);\n });\n\n return (\n <div className={`${className}${openClass}`}>\n <div\n aria-label={titles.openSwitcher}\n className={`rs-base-layer-switcher-button rs-opener${openClass}`}\n onClick={handleSwitcherClick}\n onKeyPress={(e) => {\n if (e.which === 13) {\n handleSwitcherClick();\n }\n }}\n role=\"button\"\n style={getImageStyle(nextImage)}\n tabIndex=\"0\"\n title={titles.openSwitcher}\n >\n <div className=\"rs-base-layer-switcher-title\">\n {layers.length !== 2\n ? titles.button\n : firstNonVisibleLayer && getLayerLabel(firstNonVisibleLayer)}\n </div>\n {nextImage ? null : (\n <span className=\"rs-alt-text\">\n {getAltText(firstNonVisibleLayer)}\n </span>\n )}\n </div>\n {layers.map((layer, idx) => {\n const layerName = getLayerLabel(layer);\n const activeClass =\n layerName === currentLayer.get(\"name\") ? \" rs-active\" : \"\";\n const imageStyle = getImageStyle(\n layerImages\n ? layerImages[`${layer.get(\"key\") || layer.key}`]\n : layer.get(\"previewImage\"),\n );\n return (\n <div\n className=\"rs-base-layer-switcher-btn-wrapper\"\n key={layer.key}\n style={{\n /* stylelint-disable-next-line value-keyword-case */\n overflow: hiddenStyle,\n /* stylelint-disable-next-line value-keyword-case */\n zIndex: layers.length - idx,\n }}\n >\n <div\n aria-label={layerName}\n className={`rs-base-layer-switcher-button${openClass}`}\n onClick={(evt) => {\n return onLayerSelect(layer, evt);\n }}\n onKeyPress={(evt) => {\n if (evt.which === 13) {\n onLayerSelect(layer, evt);\n }\n }}\n role=\"button\"\n style={imageStyle}\n tabIndex={switcherOpen ? \"0\" : \"-1\"}\n title={layerName}\n >\n <div className={`rs-base-layer-switcher-title${activeClass}`}>\n {layerName}\n </div>\n {imageStyle ? null : (\n <span className=\"rs-alt-text\">{getAltText(layer)}</span>\n )}\n </div>\n </div>\n );\n })}\n <CloseButton\n onClick={(evt) => {\n if (onCloseButtonClick) {\n onCloseButtonClick(evt);\n }\n setSwitcherOpen(false);\n }}\n tabIndex={switcherOpen ? \"0\" : \"-1\"}\n title={titles.closeSwitcher}\n >\n {closeButtonImage}\n </CloseButton>\n </div>\n );\n}\n\nBaseLayerSwitcher.propTypes = propTypes;\n\nexport default BaseLayerSwitcher;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }