mobility-toolbox-js 2.0.0-beta.1 → 2.0.0-beta.6

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 (303) hide show
  1. package/.babelrc +6 -0
  2. package/.esdoc.json +17 -0
  3. package/.eslintignore +1 -0
  4. package/.github/workflows/conventional-pr-title.yml +21 -0
  5. package/.github/workflows/cypress.yml +29 -0
  6. package/.github/workflows/nodejs.yml +28 -0
  7. package/.husky/commit-msg +4 -0
  8. package/.husky/post-checkout +4 -0
  9. package/.husky/post-merge +4 -0
  10. package/.husky/post-rebase +4 -0
  11. package/.husky/pre-commit +4 -0
  12. package/.neutrinorc.js +176 -0
  13. package/.nvmrc +1 -0
  14. package/CHANGELOG.md +10 -0
  15. package/LICENSE +21 -0
  16. package/Layer.js +2 -0
  17. package/Layer.js.map +7 -0
  18. package/README.md +7 -4
  19. package/__mocks__/mapbox-gl.js +81 -0
  20. package/__mocks__/maplibre-gl.js +81 -0
  21. package/commitlint.config.js +1 -0
  22. package/cypress/fixtures/example.json +5 -0
  23. package/cypress/integration/examples/api.spec.js +7 -0
  24. package/cypress/integration/examples/examples.spec.js +7 -0
  25. package/cypress/integration/examples/navigation.spec.js +29 -0
  26. package/cypress/plugins/index.js +21 -0
  27. package/cypress/support/commands.js +25 -0
  28. package/cypress/support/index.js +20 -0
  29. package/cypress.json +4 -0
  30. package/data/fetchRoute.json +292 -0
  31. package/data/fetchTrajectories.json +18 -0
  32. package/data/fetchTrajectoryById.json +3 -0
  33. package/data/fetchTrajectoryStations.json +18 -0
  34. package/data/stopsSearch.json +15 -0
  35. package/documentation.yml +4 -0
  36. package/esdoc/README.md +27 -0
  37. package/esdoc/plugins/MyPlugin.js +69 -0
  38. package/esdoc/plugins/dynamic-property-plugin/Plugin.js +50 -0
  39. package/esdoc/plugins/externals-plugin/Plugin.js +45 -0
  40. package/esdoc/plugins/externals-plugin/externals.js +96 -0
  41. package/global-setup.js +3 -0
  42. package/{ol/README.md → index.html} +0 -0
  43. package/indexweb.html +49 -0
  44. package/jest.config.js +5 -0
  45. package/package.json +34 -13
  46. package/pull_request_template.md +17 -0
  47. package/renovate.json +4 -0
  48. package/scripts/read-pkg-json.js +22 -0
  49. package/{api → src/api}/index.js +0 -1
  50. package/{api → src/api}/routing/RoutingAPI.js +0 -0
  51. package/{api → src/api}/routing/RoutingAPI.test.js +0 -0
  52. package/{api → src/api}/stops/StopsAPI.js +0 -0
  53. package/{api → src/api}/stops/StopsAPI.test.js +0 -0
  54. package/{api → src/api}/tralis/TralisAPI.js +1 -1
  55. package/{api → src/api}/tralis/TralisAPI.test.js +0 -0
  56. package/{api → src/api}/tralis/TralisAPIUtils.js +0 -0
  57. package/{api → src/api}/tralis/WebSocketConnector.js +0 -0
  58. package/{api → src/api}/tralis/WebSocketConnector.test.js +0 -0
  59. package/{api → src/api}/tralis/typedefs.js +0 -0
  60. package/src/assets/Lato-Black.ttf +0 -0
  61. package/src/assets/Lato-BlackItalic.ttf +0 -0
  62. package/src/assets/Lato-Bold.ttf +0 -0
  63. package/src/assets/Lato-BoldItalic.ttf +0 -0
  64. package/src/assets/Lato-Italic.ttf +0 -0
  65. package/src/assets/Lato-Light.ttf +0 -0
  66. package/src/assets/Lato-LightItalic.ttf +0 -0
  67. package/src/assets/Lato-Regular.ttf +0 -0
  68. package/src/assets/Lato-Thin.ttf +0 -0
  69. package/src/assets/Lato-ThinItalic.ttf +0 -0
  70. package/src/assets/OFL.txt +93 -0
  71. package/{common → src/common}/Tracker.js +0 -0
  72. package/{common → src/common}/api/api.js +0 -0
  73. package/{common → src/common}/api/api.test.js +0 -0
  74. package/{common → src/common}/controls/Control.js +4 -1
  75. package/{common → src/common}/controls/Control.test.js +0 -0
  76. package/{common → src/common}/layers/Layer.js +18 -49
  77. package/{common → src/common}/layers/Layer.test.js +2 -106
  78. package/{common → src/common}/mixins/CopyrightMixin.js +0 -0
  79. package/{common → src/common}/mixins/SearchMixin.js +1 -1
  80. package/{common/mixins/TrackerLayerMixin.js → src/common/mixins/TralisLayerMixin.js} +380 -195
  81. package/src/common/styles/index.js +4 -0
  82. package/{common/utils/delayTrackerStyle.js → src/common/styles/trackerDefaultStyle.js} +8 -8
  83. package/src/common/styles/trackerDelayStyle.js +17 -0
  84. package/src/common/styles/trackerSimpleStyle.js +22 -0
  85. package/{common → src/common}/trackerConfig.js +0 -0
  86. package/{common → src/common}/trackerConfig.test.js +0 -13
  87. package/{common → src/common}/typedefs.js +0 -0
  88. package/{common → src/common}/utils/createTrackerFilters.js +0 -0
  89. package/{common → src/common}/utils/createTrackerFilters.test.js +0 -0
  90. package/{common → src/common}/utils/getMapboxMapCopyrights.js +1 -0
  91. package/{common → src/common}/utils/getMapboxMapCopyrights.test.js +0 -0
  92. package/{common → src/common}/utils/getMapboxStyleUrl.js +0 -0
  93. package/{common → src/common}/utils/getVehiclePosition.js +0 -0
  94. package/{common → src/common}/utils/index.js +2 -3
  95. package/{common → src/common}/utils/removeDuplicate.js +0 -0
  96. package/{common → src/common}/utils/removeDuplicate.test.js +0 -0
  97. package/src/common/utils/sortByDelay.js +23 -0
  98. package/{common → src/common}/utils/timeUtils.js +0 -0
  99. package/{common → src/common}/utils/timeUtils.test.js +0 -0
  100. package/src/doc/App.js +116 -0
  101. package/src/doc/App.scss +51 -0
  102. package/src/doc/_redirects +2 -0
  103. package/src/doc/components/CodeSandboxButton.js +103 -0
  104. package/src/doc/components/Documentation.js +40 -0
  105. package/src/doc/components/Esdoc/Anchor.js +57 -0
  106. package/src/doc/components/Esdoc/ClassDoc.js +272 -0
  107. package/src/doc/components/Esdoc/DeprecatedHTML.js +16 -0
  108. package/src/doc/components/Esdoc/DetailDocs.js +281 -0
  109. package/src/doc/components/Esdoc/DetailHTML.js +33 -0
  110. package/src/doc/components/Esdoc/DirectSubclassHTML.js +30 -0
  111. package/src/doc/components/Esdoc/DocBuilderUtils.js +694 -0
  112. package/src/doc/components/Esdoc/DocLinkHTML.js +62 -0
  113. package/src/doc/components/Esdoc/DocsLinkHTML.js +38 -0
  114. package/src/doc/components/Esdoc/Esdoc.js +63 -0
  115. package/src/doc/components/Esdoc/EsdocContent.js +51 -0
  116. package/src/doc/components/Esdoc/EsdocNavigation.js +13 -0
  117. package/src/doc/components/Esdoc/EsdocSearch.js +81 -0
  118. package/src/doc/components/Esdoc/ExperimentalHTML.js +17 -0
  119. package/src/doc/components/Esdoc/ExtendsChainHTML.js +32 -0
  120. package/src/doc/components/Esdoc/FileDocLinkHTML.js +60 -0
  121. package/src/doc/components/Esdoc/IdentifiersDoc.js +113 -0
  122. package/src/doc/components/Esdoc/IndirectSubclassHTML.js +30 -0
  123. package/src/doc/components/Esdoc/InheritedSummaryDoc.js +70 -0
  124. package/src/doc/components/Esdoc/InheritedSummaryHTML.js +38 -0
  125. package/src/doc/components/Esdoc/MixinClassesHTML.js +29 -0
  126. package/src/doc/components/Esdoc/NavDoc.js +112 -0
  127. package/src/doc/components/Esdoc/OverrideMethod.js +44 -0
  128. package/src/doc/components/Esdoc/OverrideMethodDescription.js +35 -0
  129. package/src/doc/components/Esdoc/Properties.js +89 -0
  130. package/src/doc/components/Esdoc/README.md +45 -0
  131. package/src/doc/components/Esdoc/SignatureHTML.js +123 -0
  132. package/src/doc/components/Esdoc/SingleDoc.js +31 -0
  133. package/src/doc/components/Esdoc/SummaryDoc.js +160 -0
  134. package/src/doc/components/Esdoc/SummaryHTML.js +96 -0
  135. package/src/doc/components/Esdoc/TypeDocLinkHTML.js +249 -0
  136. package/src/doc/components/Esdoc/css/identifiers.css +38 -0
  137. package/src/doc/components/Esdoc/css/search.css +76 -0
  138. package/src/doc/components/Esdoc/css/style.css +603 -0
  139. package/src/doc/components/Esdoc/index.js +7 -0
  140. package/src/doc/components/Example.js +153 -0
  141. package/src/doc/components/Examples.js +183 -0
  142. package/src/doc/components/Home.js +106 -0
  143. package/src/doc/components/TrackerExample.js +38 -0
  144. package/src/doc/components/esm.min.js +2 -0
  145. package/src/doc/components/examples/assets/tralis-live-map/index.js +11 -0
  146. package/src/doc/components/examples/assets/tralis-live-map/s1kreis.svg +105 -0
  147. package/src/doc/components/examples/assets/tralis-live-map/s20kreis.svg +101 -0
  148. package/src/doc/components/examples/assets/tralis-live-map/s2kreis.svg +95 -0
  149. package/src/doc/components/examples/assets/tralis-live-map/s3kreis.svg +95 -0
  150. package/src/doc/components/examples/assets/tralis-live-map/s4kreis.svg +95 -0
  151. package/src/doc/components/examples/assets/tralis-live-map/s6kreis.svg +95 -0
  152. package/src/doc/components/examples/assets/tralis-live-map/s7kreis.svg +95 -0
  153. package/src/doc/components/examples/assets/tralis-live-map/s8kreis.svg +93 -0
  154. package/src/doc/components/examples/assets/tralis-live-map/unknown.svg +107 -0
  155. package/src/doc/components/examples/mb-copyright.html +26 -0
  156. package/src/doc/components/examples/mb-copyright.js +37 -0
  157. package/src/doc/components/examples/mb-tracker.html +1 -0
  158. package/src/doc/components/examples/mb-tracker.js +39 -0
  159. package/src/doc/components/examples/mb-tracker.md +1 -0
  160. package/src/doc/components/examples/mb-tralis.html +1 -0
  161. package/src/doc/components/examples/mb-tralis.js +34 -0
  162. package/src/doc/components/examples/ol-copyright.html +26 -0
  163. package/src/doc/components/examples/ol-copyright.js +43 -0
  164. package/src/doc/components/examples/ol-mapbox-layer.html +1 -0
  165. package/src/doc/components/examples/ol-mapbox-layer.js +28 -0
  166. package/src/doc/components/examples/ol-mapbox-layer.md +0 -0
  167. package/src/doc/components/examples/ol-mapbox-style-layer.html +12 -0
  168. package/src/doc/components/examples/ol-mapbox-style-layer.js +44 -0
  169. package/src/doc/components/examples/ol-query.html +32 -0
  170. package/src/doc/components/examples/ol-query.js +83 -0
  171. package/src/doc/components/examples/ol-routing.html +26 -0
  172. package/src/doc/components/examples/ol-routing.js +59 -0
  173. package/src/doc/components/examples/ol-routing.md +1 -0
  174. package/src/doc/components/examples/ol-stop-finder.html +15 -0
  175. package/src/doc/components/examples/ol-stop-finder.js +31 -0
  176. package/src/doc/components/examples/ol-stop-finder.md +1 -0
  177. package/src/doc/components/examples/ol-tracker.html +1 -0
  178. package/src/doc/components/examples/ol-tracker.js +44 -0
  179. package/src/doc/components/examples/ol-tracker.md +1 -0
  180. package/src/doc/components/examples/ol-tralis.html +5 -0
  181. package/src/doc/components/examples/ol-tralis.js +57 -0
  182. package/src/doc/components/examples/tralis-live-map.html +1 -0
  183. package/src/doc/components/examples/tralis-live-map.js +51 -0
  184. package/src/doc/components/examples/tralis-live-map.md +3 -0
  185. package/src/doc/examples/assets/tralis-live-map/index.js +11 -0
  186. package/src/doc/examples/assets/tralis-live-map/s1kreis.svg +105 -0
  187. package/src/doc/examples/assets/tralis-live-map/s20kreis.svg +101 -0
  188. package/src/doc/examples/assets/tralis-live-map/s2kreis.svg +95 -0
  189. package/src/doc/examples/assets/tralis-live-map/s3kreis.svg +95 -0
  190. package/src/doc/examples/assets/tralis-live-map/s4kreis.svg +95 -0
  191. package/src/doc/examples/assets/tralis-live-map/s6kreis.svg +95 -0
  192. package/src/doc/examples/assets/tralis-live-map/s7kreis.svg +95 -0
  193. package/src/doc/examples/assets/tralis-live-map/s8kreis.svg +93 -0
  194. package/src/doc/examples/assets/tralis-live-map/unknown.svg +107 -0
  195. package/src/doc/examples/mb-copyright.html +26 -0
  196. package/src/doc/examples/mb-copyright.js +37 -0
  197. package/src/doc/examples/mb-tracker.html +1 -0
  198. package/src/doc/examples/mb-tracker.js +39 -0
  199. package/src/doc/examples/mb-tracker.md +1 -0
  200. package/src/doc/examples/mb-tralis.html +1 -0
  201. package/src/doc/examples/mb-tralis.js +34 -0
  202. package/src/doc/examples/ol-copyright.html +26 -0
  203. package/src/doc/examples/ol-copyright.js +43 -0
  204. package/src/doc/examples/ol-mapbox-layer.html +1 -0
  205. package/src/doc/examples/ol-mapbox-layer.js +28 -0
  206. package/src/doc/examples/ol-mapbox-layer.md +0 -0
  207. package/src/doc/examples/ol-mapbox-style-layer.html +12 -0
  208. package/src/doc/examples/ol-mapbox-style-layer.js +44 -0
  209. package/src/doc/examples/ol-query.html +32 -0
  210. package/src/doc/examples/ol-query.js +83 -0
  211. package/src/doc/examples/ol-routing.html +26 -0
  212. package/src/doc/examples/ol-routing.js +59 -0
  213. package/src/doc/examples/ol-routing.md +1 -0
  214. package/src/doc/examples/ol-stop-finder.html +15 -0
  215. package/src/doc/examples/ol-stop-finder.js +31 -0
  216. package/src/doc/examples/ol-stop-finder.md +1 -0
  217. package/src/doc/examples/ol-tracker.html +1 -0
  218. package/src/doc/examples/ol-tracker.js +44 -0
  219. package/src/doc/examples/ol-tracker.md +1 -0
  220. package/src/doc/examples/ol-tralis.html +5 -0
  221. package/src/doc/examples/ol-tralis.js +57 -0
  222. package/src/doc/examples/tralis-live-map.html +1 -0
  223. package/src/doc/examples/tralis-live-map.js +51 -0
  224. package/src/doc/examples/tralis-live-map.md +3 -0
  225. package/src/doc/examples.js +107 -0
  226. package/src/doc/img/examples/live_tracker_mb.jpg +0 -0
  227. package/src/doc/img/examples/live_tracker_munich.jpg +0 -0
  228. package/src/doc/img/examples/live_tracker_ol.jpg +0 -0
  229. package/src/doc/img/examples/mapbox.jpg +0 -0
  230. package/src/doc/img/examples/mapbox_style.jpg +0 -0
  231. package/src/doc/img/examples/ol-copyright.png +0 -0
  232. package/src/doc/img/examples/query_objects.jpg +0 -0
  233. package/src/doc/img/examples/routing.jpg +0 -0
  234. package/src/doc/img/examples/simple_map.jpg +0 -0
  235. package/src/doc/img/examples/stops.jpg +0 -0
  236. package/src/doc/img/favico.ico +0 -0
  237. package/src/doc/index.js +21 -0
  238. package/src/iife.js +7 -0
  239. package/{module.js → src/index.js} +3 -9
  240. package/{mapbox → src/mapbox}/controls/CopyrightControl.js +5 -1
  241. package/{mapbox → src/mapbox}/index.js +0 -2
  242. package/{mapbox → src/mapbox}/layers/Layer.js +0 -0
  243. package/{mapbox → src/mapbox}/layers/Layer.test.js +2 -2
  244. package/{mapbox/layers/TrackerLayer.js → src/mapbox/layers/TralisLayer.js} +71 -24
  245. package/src/mapbox/layers/TralisLayer.test.js +40 -0
  246. package/{mapbox → src/mapbox}/utils.js +0 -0
  247. package/src/ol/README.md +0 -0
  248. package/{ol → src/ol}/controls/CopyrightControl.js +4 -4
  249. package/{ol → src/ol}/controls/CopyrightControl.test.js +16 -16
  250. package/{ol → src/ol}/controls/RoutingControl.js +9 -7
  251. package/{ol → src/ol}/controls/RoutingControl.test.js +1 -1
  252. package/{ol → src/ol}/controls/StopFinderControl.js +8 -6
  253. package/{ol → src/ol}/controls/StopFinderControl.test.js +1 -1
  254. package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen10.json +0 -0
  255. package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen100.json +0 -0
  256. package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen30.json +0 -0
  257. package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen5.json +0 -0
  258. package/{ol → src/ol}/controls/snapshots/RoutingControlRouteOSM.json +0 -0
  259. package/{ol → src/ol}/controls/snapshots/RoutingControlStation1.json +0 -0
  260. package/{ol → src/ol}/controls/snapshots/RoutingControlStation2.json +0 -0
  261. package/{ol → src/ol}/index.js +3 -3
  262. package/{ol → src/ol}/layers/Layer.js +9 -0
  263. package/{ol → src/ol}/layers/Layer.test.js +22 -7
  264. package/{ol → src/ol}/layers/MapboxLayer.js +39 -44
  265. package/{ol → src/ol}/layers/MapboxLayer.test.js +5 -5
  266. package/{ol → src/ol}/layers/MapboxStyleLayer.js +0 -6
  267. package/{ol → src/ol}/layers/MapboxStyleLayer.test.js +22 -6
  268. package/src/ol/layers/MaplibreLayer.js +280 -0
  269. package/{ol → src/ol}/layers/RoutingLayer.js +0 -0
  270. package/{ol → src/ol}/layers/RoutingLayer.test.js +1 -1
  271. package/{ol/layers/TrackerLayer.js → src/ol/layers/TralisLayer.js} +96 -33
  272. package/{ol → src/ol}/layers/TralisLayer.test.js +1 -49
  273. package/{ol → src/ol}/layers/VectorLayer.js +0 -0
  274. package/{ol → src/ol}/layers/VectorLayer.test.js +1 -1
  275. package/{ol → src/ol}/layers/WMSLayer.js +0 -0
  276. package/{ol → src/ol}/layers/WMSLayer.test.js +6 -2
  277. package/src/ol/styles/fullTrajectoryDelayStyle.js +35 -0
  278. package/src/ol/styles/fullTrajectoryStyle.js +51 -0
  279. package/src/ol/styles/index.js +2 -0
  280. package/src/setupTests.js +15 -0
  281. package/webpack.config.js +6 -0
  282. package/api/trajserv/TrajservAPI.js +0 -71
  283. package/api/trajserv/TrajservAPI.test.js +0 -171
  284. package/api/trajserv/TrajservAPIUtils.js +0 -191
  285. package/api/trajserv/TrajservAPIUtils.test.js +0 -40
  286. package/api/trajserv/typedefs.js +0 -44
  287. package/common/mixins/MapMixin.js +0 -103
  288. package/common/mixins/TrajservLayerMixin.js +0 -544
  289. package/common/mixins/TralisLayerMixin.js +0 -402
  290. package/common/utils/simpleTrackerStyle.js +0 -18
  291. package/index.js +0 -2
  292. package/index.js.map +0 -1
  293. package/mapbox/Map.js +0 -87
  294. package/mapbox/layers/TrackerLayer.test.js +0 -68
  295. package/mapbox/layers/TrajservLayer.js +0 -114
  296. package/mapbox/layers/TrajservLayer.test.js +0 -90
  297. package/mapbox/layers/TralisLayer.js +0 -64
  298. package/ol/Map.js +0 -109
  299. package/ol/Map.test.js +0 -34
  300. package/ol/layers/TrackerLayer.test.js +0 -70
  301. package/ol/layers/TrajservLayer.js +0 -190
  302. package/ol/layers/TrajservLayer.test.js +0 -113
  303. package/ol/layers/TralisLayer.js +0 -177
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable no-underscore-dangle */
2
2
  import { toLonLat } from 'ol/proj';
3
- import mapboxgl from 'maplibre-gl';
3
+ import { Map } from 'mapbox-gl';
4
4
  import Source from 'ol/source/Source';
5
5
  import OLLayer from 'ol/layer/Layer';
6
6
  import GeoJSON from 'ol/format/GeoJSON';
@@ -114,7 +114,7 @@ export default class MapboxLayer extends Layer {
114
114
  }
115
115
  }
116
116
 
117
- return canvas;
117
+ return this.mbMap.getContainer();
118
118
  },
119
119
  });
120
120
 
@@ -186,6 +186,22 @@ export default class MapboxLayer extends Layer {
186
186
  );
187
187
  }
188
188
 
189
+ /**
190
+ * Terminate what was initialized in init function. Remove layer, events...
191
+ */
192
+ terminate() {
193
+ if (this.mbMap) {
194
+ this.mbMap.off('idle', this.updateAttribution);
195
+ // Some asynchrone repaints are triggered even if the mbMap has been removed,
196
+ // to avoid display of errors we set an empty function.
197
+ this.mbMap.triggerRepaint = () => {};
198
+ this.mbMap.remove();
199
+ this.mbMap = null;
200
+ }
201
+ this.loaded = false;
202
+ super.terminate();
203
+ }
204
+
189
205
  /**
190
206
  * Returns a style URL with apiKey & apiKeyName infos.
191
207
  * @private
@@ -227,28 +243,23 @@ export default class MapboxLayer extends Layer {
227
243
  y = 0;
228
244
  }
229
245
 
230
- const style = this.createStyleUrl();
231
- try {
232
- /**
233
- * A mapbox map
234
- * @type {mapboxgl.Map}
235
- */
236
- this.mbMap = new mapboxgl.Map({
237
- style,
238
- attributionControl: false,
239
- boxZoom: false,
240
- center: toLonLat([x, y]),
241
- container: this.map.getTargetElement(),
242
- interactive: false,
243
- fadeDuration:
244
- 'fadeDuration' in this.options ? this.options.fadeDuration : 300,
245
- // Needs to be true to able to export the canvas, but could lead to performance issue on mobile.
246
- preserveDrawingBuffer: this.options.preserveDrawingBuffer || false,
247
- });
248
- } catch (err) {
249
- // eslint-disable-next-line no-console
250
- console.warn('Failed creating mapbox map: ', err);
251
- }
246
+ const container = document.createElement('div');
247
+ container.style.position = 'absolute';
248
+ container.style.width = '100%';
249
+ container.style.height = '100%';
250
+
251
+ /**
252
+ * A mapbox map
253
+ * @type {mapboxgl.Map}
254
+ */
255
+ this.mbMap = new Map({
256
+ style: this.createStyleUrl(),
257
+ container,
258
+ interactive: false,
259
+ trackResize: false,
260
+ attributionControl: false,
261
+ ...(this.options.mapOptions || {}),
262
+ });
252
263
 
253
264
  // Options the last render run did happen. If something changes
254
265
  // we have to render again
@@ -263,6 +274,7 @@ export default class MapboxLayer extends Layer {
263
274
  };
264
275
 
265
276
  this.mbMap.once('load', () => {
277
+ this.mbMap.resize();
266
278
  /**
267
279
  * Is the map loaded.
268
280
  * @type {boolean}
@@ -270,8 +282,7 @@ export default class MapboxLayer extends Layer {
270
282
  this.loaded = true;
271
283
 
272
284
  /** @ignore */
273
- this.copyrights =
274
- this.copyrights || getMapboxMapCopyrights(this.mbMap) || [];
285
+ this.copyrights = getMapboxMapCopyrights(this.mbMap) || [];
275
286
 
276
287
  this.olLayer.getSource().setAttributions(this.copyrights);
277
288
 
@@ -300,9 +311,9 @@ export default class MapboxLayer extends Layer {
300
311
  * @private
301
312
  */
302
313
  updateAttribution(evt) {
303
- const newAttributions =
304
- this.copyrights || getMapboxMapCopyrights(evt.target) || [];
314
+ const newAttributions = getMapboxMapCopyrights(evt.target) || [];
305
315
  if (this.copyrights.toString() !== newAttributions.toString()) {
316
+ this.copyrights = newAttributions;
306
317
  this.olLayer.getSource().setAttributions(newAttributions);
307
318
  }
308
319
  }
@@ -356,22 +367,6 @@ export default class MapboxLayer extends Layer {
356
367
  });
357
368
  }
358
369
 
359
- /**
360
- * Terminate what was initialized in init function. Remove layer, events...
361
- */
362
- terminate() {
363
- if (this.mbMap) {
364
- this.mbMap.off('idle', this.updateAttribution);
365
- // Some asynchrone repaints are triggered even if the mbMap has been removed,
366
- // to avoid display of errors we set an empty function.
367
- this.mbMap.triggerRepaint = () => {};
368
- this.mbMap.remove();
369
- this.mbMap = null;
370
- }
371
- this.loaded = false;
372
- super.terminate();
373
- }
374
-
375
370
  /**
376
371
  * Create a copy of the MapboxLayer.
377
372
  * @param {Object} newOptions Options to override
@@ -1,6 +1,6 @@
1
- import Map from 'ol/Map';
1
+ import OlMap from 'ol/Map';
2
2
  import View from 'ol/View';
3
- import maplibre from 'maplibre-gl';
3
+ import gllib from 'mapbox-gl';
4
4
  import MapboxLayer from './MapboxLayer';
5
5
 
6
6
  let layer;
@@ -19,7 +19,7 @@ describe('MapboxLayer', () => {
19
19
  name: 'Layer',
20
20
  url: styleUrl,
21
21
  });
22
- map = new Map({
22
+ map = new OlMap({
23
23
  target: document.createElement('div'),
24
24
  view: new View({ center: [0, 0] }),
25
25
  });
@@ -37,7 +37,7 @@ describe('MapboxLayer', () => {
37
37
 
38
38
  test('should initalized mapbox map and warn the user if there is no api key defined.', () => {
39
39
  layer.init(map);
40
- expect(layer.mbMap).toBeInstanceOf(maplibre.Map);
40
+ expect(layer.mbMap).toBeInstanceOf(gllib.Map);
41
41
  expect(consoleOutput[0]).toBe(
42
42
  'No apiKey is defined for request to foo.com/styles',
43
43
  );
@@ -64,7 +64,7 @@ describe('MapboxLayer', () => {
64
64
  url: styleUrl,
65
65
  apiKey: 'apiKey',
66
66
  });
67
- map = new Map({
67
+ map = new OlMap({
68
68
  target: document.createElement('div'),
69
69
  view: new View({ center: [0, 0] }),
70
70
  });
@@ -127,12 +127,6 @@ class MapboxStyleLayer extends Layer {
127
127
  init(map) {
128
128
  if (!this.mapboxLayer.map) {
129
129
  this.mapboxLayer.init(map);
130
- /**
131
- * An OpenLayers Layer.
132
- * @type {ol/layer/Layer~Layer}
133
- * @private
134
- */
135
- this.olLayer = this.mapboxLayer.olLayer;
136
130
  }
137
131
  super.init(map);
138
132
 
@@ -1,8 +1,8 @@
1
- import Map from 'ol/Map';
1
+ import OlMap from 'ol/Map';
2
2
  import View from 'ol/View';
3
- import maplibre from 'maplibre-gl';
3
+ import gllib from 'maplibre-gl';
4
4
  import Layer from './Layer';
5
- import MapboxLayer from './MapboxLayer';
5
+ import MaplibreLayer from './MaplibreLayer';
6
6
  import MapboxStyleLayer from './MapboxStyleLayer';
7
7
 
8
8
  let source;
@@ -17,7 +17,7 @@ const styleLayer = {
17
17
  describe('MapboxStyleLayer', () => {
18
18
  beforeEach(() => {
19
19
  onClick = jest.fn();
20
- source = new MapboxLayer({
20
+ source = new MaplibreLayer({
21
21
  name: 'Layer',
22
22
  apiKey: false,
23
23
  });
@@ -28,12 +28,21 @@ describe('MapboxStyleLayer', () => {
28
28
  styleLayer,
29
29
  onClick,
30
30
  });
31
- map = new Map({
31
+ map = new OlMap({
32
32
  target: document.createElement('div'),
33
33
  view: new View({ center: [0, 0] }),
34
34
  });
35
35
  });
36
36
 
37
+ afterEach(() => {
38
+ if (layer.map) {
39
+ layer.terminate(map);
40
+ }
41
+ if (source.map) {
42
+ source.terminate(map);
43
+ }
44
+ });
45
+
37
46
  test('should be instanced.', () => {
38
47
  expect(layer).toBeInstanceOf(MapboxStyleLayer);
39
48
  expect(layer.styleLayers[0]).toBe(styleLayer);
@@ -43,12 +52,15 @@ describe('MapboxStyleLayer', () => {
43
52
  test('should not initalized mapbox map.', () => {
44
53
  layer.init();
45
54
  expect(layer.mbMap).toBe();
55
+ layer.terminate();
46
56
  });
47
57
 
48
58
  test('should initalized mapbox map.', () => {
49
59
  source.init(map);
50
60
  layer.init(map);
51
- expect(layer.mapboxLayer.mbMap).toBeInstanceOf(maplibre.Map);
61
+ expect(layer.mapboxLayer.mbMap).toBeInstanceOf(gllib.Map);
62
+ layer.terminate();
63
+ source.terminate();
52
64
  });
53
65
 
54
66
  test('should add onClick callback.', () => {
@@ -61,6 +73,7 @@ describe('MapboxStyleLayer', () => {
61
73
  const spy = jest.spyOn(layer, 'terminate');
62
74
  layer.init();
63
75
  expect(spy).toHaveBeenCalledTimes(1);
76
+ layer.terminate(map);
64
77
  });
65
78
 
66
79
  test('should return coordinates, features and a layer instance.', async () => {
@@ -70,6 +83,8 @@ describe('MapboxStyleLayer', () => {
70
83
  expect(data.coordinate).toEqual([50, 50]);
71
84
  expect(data.features).toEqual([]);
72
85
  expect(data.layer).toBeInstanceOf(MapboxStyleLayer);
86
+ layer.terminate(map);
87
+ source.terminate(map);
73
88
  });
74
89
 
75
90
  test('should call onClick callback', async () => {
@@ -81,6 +96,7 @@ describe('MapboxStyleLayer', () => {
81
96
  await map.dispatchEvent(evt);
82
97
  expect(onClick).toHaveBeenCalledTimes(1);
83
98
  expect(onClick).toHaveBeenCalledWith(features, layer, coordinate);
99
+ layer.terminate();
84
100
  });
85
101
 
86
102
  test('should call super class terminate function.', () => {
@@ -0,0 +1,280 @@
1
+ /* eslint-disable no-underscore-dangle */
2
+ import { toLonLat } from 'ol/proj';
3
+ import { Map } from 'maplibre-gl';
4
+ import Source from 'ol/source/Source';
5
+ import OLLayer from 'ol/layer/Layer';
6
+ import GeoJSON from 'ol/format/GeoJSON';
7
+ import { toDegrees } from 'ol/math';
8
+ import Layer from './Layer';
9
+ import { getMapboxMapCopyrights, getMapboxStyleUrl } from '../../common/utils';
10
+
11
+ /**
12
+ * A class representing MaplibreLayer to display on BasicMap
13
+ *
14
+ * @example
15
+ * import { MaplibreLayer } from 'mobility-toolbox-js/ol';
16
+ *
17
+ * const layer = new MaplibreLayer({
18
+ * url: 'https://maps.geops.io/styles/travic_v2/style.json',
19
+ * apikey: 'yourApiKey',
20
+ * });
21
+ *
22
+ * @classproperty {ol/Map~Map} map - The map where the layer is displayed.
23
+ * @extends {Layer}
24
+ */
25
+ export default class MaplibreLayer extends Layer {
26
+ /**
27
+ * Constructor.
28
+ *
29
+ * @param {Object} options
30
+ * @param {boolean} [options.preserveDrawingBuffer=false] If true able to export the canvas.
31
+ * @param {number} [options.fadeDuration=300] Duration of the fade effect in ms.
32
+ */
33
+ constructor(options = {}) {
34
+ const mbLayer = new OLLayer({
35
+ source: new Source({}),
36
+ render: (frameState) => {
37
+ if (!this.mbMap) {
38
+ // eslint-disable-next-line no-console
39
+ console.warn("Mapbox map doesn't exist.");
40
+ return null;
41
+ }
42
+
43
+ const canvas = this.mbMap.getCanvas();
44
+ const { viewState } = frameState;
45
+
46
+ const opacity = this.olLayer.getOpacity();
47
+ canvas.style.opacity = opacity;
48
+
49
+ // adjust view parameters in mapbox
50
+ this.mbMap.jumpTo({
51
+ center: toLonLat(viewState.center),
52
+ zoom: viewState.zoom - 1,
53
+ bearing: toDegrees(-viewState.rotation),
54
+ animate: false,
55
+ });
56
+
57
+ if (!canvas.isConnected) {
58
+ // The canvas is not connected to the DOM, request a map rendering at the next animation frame
59
+ // to set the canvas size.
60
+ this.map.render();
61
+ } else if (
62
+ canvas.width !== frameState.size[0] ||
63
+ canvas.height !== frameState.size[1]
64
+ ) {
65
+ this.mbMap.resize();
66
+ }
67
+
68
+ this.mbMap.redraw();
69
+
70
+ return this.mbMap.getContainer();
71
+ },
72
+ });
73
+
74
+ super({
75
+ ...options,
76
+ olLayer: mbLayer,
77
+ });
78
+
79
+ /**
80
+ * Url of the mapbox style.
81
+ * @type {string}
82
+ * @private
83
+ */
84
+ this.styleUrl = options.url;
85
+
86
+ /**
87
+ * Api key for the url of the mapbox style.
88
+ * If set to false, the apiKey is not required.
89
+ * @type {string}
90
+ * @private
91
+ */
92
+ this.apiKey = options.apiKey;
93
+
94
+ /**
95
+ * Name of the apiKey to set in the url request.
96
+ * Default is 'key'.
97
+ * @type {string}
98
+ * @private
99
+ */
100
+ this.apiKeyName = options.apiKeyName || 'key';
101
+
102
+ /** @ignore */
103
+ this.updateAttribution = this.updateAttribution.bind(this);
104
+ }
105
+
106
+ /**
107
+ * Initialize the layer and listen to feature clicks.
108
+ * @param {ol/Map~Map} map
109
+ */
110
+ init(map) {
111
+ super.init(map);
112
+
113
+ if (!this.map) {
114
+ return;
115
+ }
116
+
117
+ /**
118
+ * The feature format.
119
+ * @type {ol/format/GeoJSON}
120
+ */
121
+ this.format = new GeoJSON({
122
+ featureProjection: this.map.getView().getProjection(),
123
+ });
124
+
125
+ this.loadMbMap();
126
+ }
127
+
128
+ /**
129
+ * Terminate what was initialized in init function. Remove layer, events...
130
+ */
131
+ terminate() {
132
+ if (this.mbMap) {
133
+ this.mbMap.off('idle', this.updateAttribution);
134
+ // Some asynchrone repaints are triggered even if the mbMap has been removed,
135
+ // to avoid display of errors we set an empty function.
136
+ this.mbMap.triggerRepaint = () => {};
137
+ this.mbMap.remove();
138
+ this.mbMap = null;
139
+ }
140
+ this.loaded = false;
141
+ super.terminate();
142
+ }
143
+
144
+ /**
145
+ * Returns a style URL with apiKey & apiKeyName infos.
146
+ * @private
147
+ */
148
+ createStyleUrl() {
149
+ return getMapboxStyleUrl(this.apiKey, this.apiKeyName, this.styleUrl);
150
+ }
151
+
152
+ /**
153
+ * Create the mapbox map.
154
+ * @private
155
+ */
156
+ loadMbMap() {
157
+ this.olListenersKeys.push(
158
+ this.map.on('change:target', () => {
159
+ this.loadMbMap();
160
+ }),
161
+ );
162
+
163
+ if (!this.map.getTargetElement()) {
164
+ return;
165
+ }
166
+
167
+ if (!this.visible) {
168
+ // On next change of visibility we load the map
169
+ this.olListenersKeys.push(
170
+ this.once('change:visible', () => {
171
+ this.loadMbMap();
172
+ }),
173
+ );
174
+ return;
175
+ }
176
+
177
+ const container = document.createElement('div');
178
+ container.style.position = 'absolute';
179
+ container.style.width = '100%';
180
+ container.style.height = '100%';
181
+
182
+ /**
183
+ * A mapbox map
184
+ * @type {mapboxgl.Map}
185
+ */
186
+ this.mbMap = new Map({
187
+ style: this.createStyleUrl(),
188
+ container,
189
+ interactive: false,
190
+ trackResize: false,
191
+ attributionControl: false,
192
+ ...(this.options.mapOptions || {}),
193
+ });
194
+
195
+ this.mbMap.once('load', () => {
196
+ /**
197
+ * Is the map loaded.
198
+ * @type {boolean}
199
+ */
200
+ this.loaded = true;
201
+
202
+ this.dispatchEvent({
203
+ type: 'load',
204
+ target: this,
205
+ });
206
+ });
207
+
208
+ this.mbMap.on('idle', this.updateAttribution);
209
+ }
210
+
211
+ /**
212
+ * Update attributions of the source.
213
+ * @private
214
+ */
215
+ updateAttribution(evt) {
216
+ const newAttributions = getMapboxMapCopyrights(evt.target) || [];
217
+ if (this.copyrights?.toString() !== newAttributions.toString()) {
218
+ this.copyrights = newAttributions;
219
+ this.olLayer.getSource().setAttributions(newAttributions);
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Request feature information for a given coordinate.
225
+ * @param {ol/coordinate~Coordinate} coordinate Coordinate to request the information at.
226
+ * @param {Object} options A [mapboxgl.Map#queryrenderedfeatures](https://docs.mapbox.com/mapbox-gl-js/api/map/#map#queryrenderedfeatures) options parameter.
227
+ * @return {Promise<FeatureInfo>} Promise with features, layer and coordinate. The original Mapbox feature is available as a property named 'mapboxFeature'.
228
+ */
229
+ getFeatureInfoAtCoordinate(coordinate, options) {
230
+ // Ignore the getFeatureInfo until the mapbox map is loaded
231
+ if (
232
+ !options ||
233
+ !this.format ||
234
+ !this.mbMap ||
235
+ !this.mbMap.isStyleLoaded()
236
+ ) {
237
+ return Promise.resolve({ coordinate, features: [], layer: this });
238
+ }
239
+
240
+ let pixel = coordinate && this.mbMap.project(toLonLat(coordinate));
241
+
242
+ if (this.hitTolerance) {
243
+ const { x, y } = pixel;
244
+ pixel = [
245
+ { x: x - this.hitTolerance, y: y - this.hitTolerance },
246
+ { x: x + this.hitTolerance, y: y + this.hitTolerance },
247
+ ];
248
+ }
249
+
250
+ // At this point we get GeoJSON Mapbox feature, we transform it to an OpenLayers
251
+ // feature to be consistent with other layers.
252
+ const features = this.mbMap
253
+ .queryRenderedFeatures(pixel, options)
254
+ .map((feature) => {
255
+ const olFeature = this.format.readFeature(feature);
256
+ if (olFeature) {
257
+ // We save the original mapbox feature to avoid losing informations
258
+ // potentially needed for other functionnality like highlighting
259
+ // (id, layer id, source, sourceLayer ...)
260
+ olFeature.set('mapboxFeature', feature);
261
+ }
262
+ return olFeature;
263
+ });
264
+
265
+ return Promise.resolve({
266
+ layer: this,
267
+ features,
268
+ coordinate,
269
+ });
270
+ }
271
+
272
+ /**
273
+ * Create a copy of the MapboxLayer.
274
+ * @param {Object} newOptions Options to override
275
+ * @return {MapboxLayer} A MapboxLayer
276
+ */
277
+ clone(newOptions) {
278
+ return new MaplibreLayer({ ...this.options, ...newOptions });
279
+ }
280
+ }
File without changes
@@ -7,7 +7,7 @@ let layer;
7
7
  let onClick;
8
8
  let olMap;
9
9
 
10
- describe('TrajservLayer', () => {
10
+ describe('RoutingLayer', () => {
11
11
  beforeEach(() => {
12
12
  global.fetch = fetch;
13
13
  fetch.resetMocks();