mobility-toolbox-js 2.3.9 → 2.3.10

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 (471) hide show
  1. package/.esdoc.js +18 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc.js +25 -0
  4. package/.fixpackrc +20 -0
  5. package/.github/workflows/build.yml +16 -0
  6. package/.github/workflows/conventional-pr-title.yml +16 -0
  7. package/.github/workflows/cypress.yml +101 -0
  8. package/.github/workflows/test.yml +17 -0
  9. package/.husky/commit-msg +4 -0
  10. package/.husky/post-checkout +4 -0
  11. package/.husky/post-merge +4 -0
  12. package/.husky/post-rebase +4 -0
  13. package/.husky/pre-commit +4 -0
  14. package/.lintstagedrc.js +10 -0
  15. package/.nvmrc +1 -0
  16. package/.prettierrc.js +5 -0
  17. package/.stylelintrc.js +4 -0
  18. package/CHANGELOG.md +132 -0
  19. package/LICENSE +21 -0
  20. package/MIGRATION-V2.md +248 -0
  21. package/README.md +42 -0
  22. package/__mocks__/mapbox-gl.js +81 -0
  23. package/__mocks__/maplibre-gl.js +81 -0
  24. package/babel.config.js +9 -0
  25. package/commitlint.config.js +1 -0
  26. package/cypress/e2e/examples/api.cy.js +7 -0
  27. package/cypress/e2e/examples/examples.cy.js +7 -0
  28. package/cypress/e2e/examples/navigation.cy.js +29 -0
  29. package/cypress/fixtures/example.json +5 -0
  30. package/cypress/plugins/index.js +21 -0
  31. package/cypress/support/commands.js +25 -0
  32. package/cypress/support/e2e.js +20 -0
  33. package/cypress.config.ts +15 -0
  34. package/data/fetchRoute.json +292 -0
  35. package/data/fetchTrajectories.json +18 -0
  36. package/data/fetchTrajectoryById.json +3 -0
  37. package/data/fetchTrajectoryStations.json +18 -0
  38. package/data/stopsSearch.json +15 -0
  39. package/dependabot.yml +15 -0
  40. package/doc/.eslintrc.json +1 -0
  41. package/doc/README.md +34 -0
  42. package/doc/next.config.js +16 -0
  43. package/doc/package.json +41 -0
  44. package/doc/pages/404.js +5 -0
  45. package/doc/pages/_app.js +61 -0
  46. package/doc/pages/_document.js +64 -0
  47. package/doc/pages/doc/[...slug].js +23 -0
  48. package/doc/pages/doc.js +23 -0
  49. package/doc/pages/example/[example].js +52 -0
  50. package/doc/pages/examples.js +34 -0
  51. package/doc/pages/index.js +25 -0
  52. package/doc/public/README.md +15 -0
  53. package/doc/public/favicon.ico +0 -0
  54. package/doc/public/static/assets/Lato-Black.ttf +0 -0
  55. package/doc/public/static/assets/Lato-BlackItalic.ttf +0 -0
  56. package/doc/public/static/assets/Lato-Bold.ttf +0 -0
  57. package/doc/public/static/assets/Lato-BoldItalic.ttf +0 -0
  58. package/doc/public/static/assets/Lato-Italic.ttf +0 -0
  59. package/doc/public/static/assets/Lato-Light.ttf +0 -0
  60. package/doc/public/static/assets/Lato-LightItalic.ttf +0 -0
  61. package/doc/public/static/assets/Lato-Regular.ttf +0 -0
  62. package/doc/public/static/assets/Lato-Thin.ttf +0 -0
  63. package/doc/public/static/assets/Lato-ThinItalic.ttf +0 -0
  64. package/doc/public/static/assets/OFL.txt +93 -0
  65. package/doc/public/static/examples/assets/tralis-live-map/index.js +11 -0
  66. package/doc/public/static/examples/assets/tralis-live-map/s1kreis.svg +105 -0
  67. package/doc/public/static/examples/assets/tralis-live-map/s20kreis.svg +101 -0
  68. package/doc/public/static/examples/assets/tralis-live-map/s2kreis.svg +95 -0
  69. package/doc/public/static/examples/assets/tralis-live-map/s3kreis.svg +95 -0
  70. package/doc/public/static/examples/assets/tralis-live-map/s4kreis.svg +95 -0
  71. package/doc/public/static/examples/assets/tralis-live-map/s6kreis.svg +95 -0
  72. package/doc/public/static/examples/assets/tralis-live-map/s7kreis.svg +95 -0
  73. package/doc/public/static/examples/assets/tralis-live-map/s8kreis.svg +93 -0
  74. package/doc/public/static/examples/assets/tralis-live-map/unknown.svg +107 -0
  75. package/doc/public/static/examples/layers.html +11 -0
  76. package/doc/public/static/examples/layers.js +97 -0
  77. package/doc/public/static/examples/mb-copyright.html +26 -0
  78. package/doc/public/static/examples/mb-copyright.js +37 -0
  79. package/doc/public/static/examples/mb-tracker.html +1 -0
  80. package/doc/public/static/examples/mb-tracker.js +40 -0
  81. package/doc/public/static/examples/mb-tracker.md +1 -0
  82. package/doc/public/static/examples/mb-tralis.html +1 -0
  83. package/doc/public/static/examples/mb-tralis.js +34 -0
  84. package/doc/public/static/examples/ol-copyright.html +26 -0
  85. package/doc/public/static/examples/ol-copyright.js +43 -0
  86. package/doc/public/static/examples/ol-mapbox-layer.html +1 -0
  87. package/doc/public/static/examples/ol-mapbox-layer.js +28 -0
  88. package/doc/public/static/examples/ol-mapbox-style-layer.html +12 -0
  89. package/doc/public/static/examples/ol-mapbox-style-layer.js +48 -0
  90. package/doc/public/static/examples/ol-query.html +32 -0
  91. package/doc/public/static/examples/ol-query.js +83 -0
  92. package/doc/public/static/examples/ol-routing.html +26 -0
  93. package/doc/public/static/examples/ol-routing.js +65 -0
  94. package/doc/public/static/examples/ol-routing.md +1 -0
  95. package/doc/public/static/examples/ol-stop-finder.html +15 -0
  96. package/doc/public/static/examples/ol-stop-finder.js +35 -0
  97. package/doc/public/static/examples/ol-stop-finder.md +1 -0
  98. package/doc/public/static/examples/ol-tracker.html +1 -0
  99. package/doc/public/static/examples/ol-tracker.js +41 -0
  100. package/doc/public/static/examples/ol-tracker.md +1 -0
  101. package/doc/public/static/examples/ol-tralis.html +5 -0
  102. package/doc/public/static/examples/ol-tralis.js +62 -0
  103. package/doc/public/static/examples/tralis-live-map.html +1 -0
  104. package/doc/public/static/examples/tralis-live-map.js +67 -0
  105. package/doc/public/static/examples/tralis-live-map.md +3 -0
  106. package/doc/public/static/img/live_tracker_mb.jpg +0 -0
  107. package/doc/public/static/img/live_tracker_munich.jpg +0 -0
  108. package/doc/public/static/img/live_tracker_ol.jpg +0 -0
  109. package/doc/public/static/img/mapbox.jpg +0 -0
  110. package/doc/public/static/img/mapbox_style.jpg +0 -0
  111. package/doc/public/static/img/ol-copyright.png +0 -0
  112. package/doc/public/static/img/query_objects.jpg +0 -0
  113. package/doc/public/static/img/routing.jpg +0 -0
  114. package/doc/public/static/img/simple_map.jpg +0 -0
  115. package/doc/public/static/img/stops.jpg +0 -0
  116. package/doc/public/vercel.svg +4 -0
  117. package/doc/src/components/CodeSandboxButton.js +102 -0
  118. package/doc/src/components/Documentation.js +42 -0
  119. package/doc/src/components/Esdoc/Anchor.js +57 -0
  120. package/doc/src/components/Esdoc/ClassDoc.js +272 -0
  121. package/doc/src/components/Esdoc/DeprecatedHTML.js +16 -0
  122. package/doc/src/components/Esdoc/DetailDocs.js +279 -0
  123. package/doc/src/components/Esdoc/DetailHTML.js +33 -0
  124. package/doc/src/components/Esdoc/DirectSubclassHTML.js +30 -0
  125. package/doc/src/components/Esdoc/DocBuilderUtils.js +697 -0
  126. package/doc/src/components/Esdoc/DocLinkHTML.js +63 -0
  127. package/doc/src/components/Esdoc/DocsLinkHTML.js +38 -0
  128. package/doc/src/components/Esdoc/Esdoc.js +63 -0
  129. package/doc/src/components/Esdoc/EsdocContent.js +56 -0
  130. package/doc/src/components/Esdoc/EsdocNavigation.js +13 -0
  131. package/doc/src/components/Esdoc/EsdocSearch.js +78 -0
  132. package/doc/src/components/Esdoc/ExperimentalHTML.js +17 -0
  133. package/doc/src/components/Esdoc/ExtendsChainHTML.js +32 -0
  134. package/doc/src/components/Esdoc/FileDocLinkHTML.js +62 -0
  135. package/doc/src/components/Esdoc/IdentifiersDoc.js +113 -0
  136. package/doc/src/components/Esdoc/IndirectSubclassHTML.js +30 -0
  137. package/doc/src/components/Esdoc/InheritedSummaryDoc.js +70 -0
  138. package/doc/src/components/Esdoc/InheritedSummaryHTML.js +38 -0
  139. package/doc/src/components/Esdoc/MixinClassesHTML.js +29 -0
  140. package/doc/src/components/Esdoc/NavDoc.js +112 -0
  141. package/doc/src/components/Esdoc/OverrideMethod.js +44 -0
  142. package/doc/src/components/Esdoc/OverrideMethodDescription.js +35 -0
  143. package/doc/src/components/Esdoc/Properties.js +89 -0
  144. package/doc/src/components/Esdoc/README.md +45 -0
  145. package/doc/src/components/Esdoc/SignatureHTML.js +123 -0
  146. package/doc/src/components/Esdoc/SingleDoc.js +31 -0
  147. package/doc/src/components/Esdoc/SummaryDoc.js +160 -0
  148. package/doc/src/components/Esdoc/SummaryHTML.js +96 -0
  149. package/doc/src/components/Esdoc/TypeDocLinkHTML.js +251 -0
  150. package/doc/src/components/Esdoc/index.js +7 -0
  151. package/doc/src/components/Esdoc/taffydb.js +2070 -0
  152. package/doc/src/components/Example.js +200 -0
  153. package/doc/src/components/ExampleCard.js +126 -0
  154. package/doc/src/components/Examples.js +78 -0
  155. package/doc/src/components/Home.js +121 -0
  156. package/doc/src/components/TrackerExample.js +39 -0
  157. package/doc/src/examples.js +117 -0
  158. package/doc/styles/App.scss +53 -0
  159. package/doc/styles/identifiers.css +38 -0
  160. package/doc/styles/search.css +76 -0
  161. package/doc/styles/style.css +603 -0
  162. package/esdoc/README.md +27 -0
  163. package/esdoc/plugins/MyPlugin.js +69 -0
  164. package/esdoc/plugins/dynamic-property-plugin/Plugin.js +50 -0
  165. package/esdoc/plugins/externals-plugin/Plugin.js +45 -0
  166. package/esdoc/plugins/externals-plugin/externals.js +93 -0
  167. package/esdoc/plugins/optional-chaining-plugin/Plugin.js +8 -0
  168. package/global-setup.js +3 -0
  169. package/jest.config.js +24 -0
  170. package/package.json +18 -18
  171. package/pull_request_template.md +17 -0
  172. package/scripts/read-pkg-json.js +22 -0
  173. package/src/api/RealtimeAPI.test.js +144 -0
  174. package/src/api/RealtimeAPI.ts +712 -0
  175. package/src/api/RoutingAPI.test.js +41 -0
  176. package/src/api/RoutingAPI.ts +47 -0
  177. package/src/api/StopsAPI.test.js +34 -0
  178. package/src/api/StopsAPI.ts +45 -0
  179. package/{api → src/api}/typedefs.js +11 -1
  180. package/src/common/api/HttpAPI.test.js +68 -0
  181. package/src/common/api/HttpAPI.ts +77 -0
  182. package/src/common/api/WebSocketAPI.test.js +421 -0
  183. package/src/common/api/WebSocketAPI.ts +515 -0
  184. package/src/common/controls/ControlCommon.test.js +106 -0
  185. package/src/common/controls/ControlCommon.ts +194 -0
  186. package/src/common/controls/CopyrightControlCommon.ts +41 -0
  187. package/src/common/controls/StopFinderControlCommon.ts +192 -0
  188. package/src/common/layers/LayerCommon.test.js +158 -0
  189. package/src/common/layers/LayerCommon.ts +321 -0
  190. package/src/common/mixins/RealtimeLayerMixin.ts +1168 -0
  191. package/src/common/mixins/UserInteractionsLayerMixin.test.js +227 -0
  192. package/src/common/mixins/UserInteractionsLayerMixin.ts +352 -0
  193. package/src/common/styles/realtimeDefaultStyle.ts +436 -0
  194. package/src/common/styles/realtimeDelayStyle.ts +27 -0
  195. package/src/common/styles/realtimeHeadingStyle.ts +138 -0
  196. package/src/common/styles/realtimeSimpleStyle.ts +25 -0
  197. package/{common → src/common}/typedefs.js +1 -1
  198. package/src/common/utils/compareDepartures.ts +46 -0
  199. package/src/common/utils/createCanvas.ts +33 -0
  200. package/src/common/utils/createRealtimeFilters.test.js +100 -0
  201. package/src/common/utils/createRealtimeFilters.ts +96 -0
  202. package/src/common/utils/debounceDeparturesMessages.ts +52 -0
  203. package/src/common/utils/debounceWebsocketMessages.ts +47 -0
  204. package/src/common/utils/getLayersAsFlatArray.ts +17 -0
  205. package/src/common/utils/getMapboxMapCopyrights.test.js +47 -0
  206. package/src/common/utils/getMapboxMapCopyrights.ts +52 -0
  207. package/src/common/utils/getMapboxRender.ts +104 -0
  208. package/src/common/utils/getMaplibreRender.ts +54 -0
  209. package/{common/utils/getRealtimeModeSuffix.d.ts → src/common/utils/getRealtimeModeSuffix.ts} +4 -2
  210. package/src/common/utils/getUrlWithParams.ts +21 -0
  211. package/src/common/utils/getVehiclePosition.ts +92 -0
  212. package/{common → src/common}/utils/index.js +1 -2
  213. package/src/common/utils/realtimeConfig.test.js +57 -0
  214. package/src/common/utils/realtimeConfig.ts +228 -0
  215. package/src/common/utils/removeDuplicate.test.js +22 -0
  216. package/src/common/utils/removeDuplicate.ts +22 -0
  217. package/src/common/utils/renderTrajectories.ts +194 -0
  218. package/src/common/utils/sortAndFilterDepartures.ts +78 -0
  219. package/src/common/utils/sortByDelay.ts +29 -0
  220. package/src/common/utils/timeUtils.test.js +16 -0
  221. package/src/common/utils/timeUtils.ts +45 -0
  222. package/{iife.js → src/iife.js} +3 -1
  223. package/src/index.js +10 -0
  224. package/{mapbox/controls/CopyrightControl.js → src/mapbox/controls/CopyrightControl.ts} +26 -21
  225. package/src/mapbox/layers/Layer.test.js +217 -0
  226. package/src/mapbox/layers/Layer.ts +144 -0
  227. package/src/mapbox/layers/RealtimeLayer.test.js +13 -0
  228. package/src/mapbox/layers/RealtimeLayer.ts +350 -0
  229. package/src/mapbox/utils/getMercatorResolution.ts +21 -0
  230. package/src/mapbox/utils/getSourceCoordinates.ts +34 -0
  231. package/src/ol/README.md +0 -0
  232. package/src/ol/controls/CopyrightControl.test.js +211 -0
  233. package/src/ol/controls/CopyrightControl.ts +82 -0
  234. package/src/ol/controls/RoutingControl.test.js +205 -0
  235. package/src/ol/controls/RoutingControl.ts +869 -0
  236. package/src/ol/controls/StopFinderControl.test.js +59 -0
  237. package/{ol/controls/StopFinderControl.js → src/ol/controls/StopFinderControl.ts} +10 -7
  238. package/src/ol/controls/snapshots/RoutingControlRouteGen10.json +58 -0
  239. package/src/ol/controls/snapshots/RoutingControlRouteGen100.json +292 -0
  240. package/src/ol/controls/snapshots/RoutingControlRouteGen30.json +69 -0
  241. package/src/ol/controls/snapshots/RoutingControlRouteGen5.json +58 -0
  242. package/src/ol/controls/snapshots/RoutingControlRouteOSM.json +759 -0
  243. package/src/ol/controls/snapshots/RoutingControlStation1.json +60 -0
  244. package/src/ol/controls/snapshots/RoutingControlStation2.json +49 -0
  245. package/src/ol/layers/Layer.test.js +212 -0
  246. package/src/ol/layers/Layer.ts +252 -0
  247. package/src/ol/layers/MapGlLayer.ts +294 -0
  248. package/src/ol/layers/MapboxLayer.test.js +190 -0
  249. package/src/ol/layers/MapboxLayer.ts +136 -0
  250. package/src/ol/layers/MapboxStyleLayer.test.js +258 -0
  251. package/src/ol/layers/MapboxStyleLayer.ts +466 -0
  252. package/{ol/layers/MaplibreLayer.d.ts → src/ol/layers/MaplibreLayer.ts} +21 -10
  253. package/src/ol/layers/RealtimeLayer.test.js +84 -0
  254. package/src/ol/layers/RealtimeLayer.ts +465 -0
  255. package/src/ol/layers/RoutingLayer.test.js +48 -0
  256. package/src/ol/layers/RoutingLayer.ts +113 -0
  257. package/src/ol/layers/VectorLayer.test.js +87 -0
  258. package/src/ol/layers/VectorLayer.ts +48 -0
  259. package/src/ol/layers/WMSLayer.test.js +65 -0
  260. package/src/ol/layers/WMSLayer.ts +114 -0
  261. package/src/ol/styles/fullTrajectoryDelayStyle.ts +37 -0
  262. package/src/ol/styles/fullTrajectoryStyle.ts +56 -0
  263. package/{setupTests.js → src/setupTests.js} +12 -7
  264. package/tsconfig.json +23 -0
  265. package/api/RealtimeAPI.d.ts +0 -290
  266. package/api/RealtimeAPI.d.ts.map +0 -1
  267. package/api/RealtimeAPI.js +0 -483
  268. package/api/RoutingAPI.d.ts +0 -37
  269. package/api/RoutingAPI.d.ts.map +0 -1
  270. package/api/RoutingAPI.js +0 -35
  271. package/api/StopsAPI.d.ts +0 -38
  272. package/api/StopsAPI.d.ts.map +0 -1
  273. package/api/StopsAPI.js +0 -36
  274. package/api/index.d.ts +0 -4
  275. package/api/index.d.ts.map +0 -1
  276. package/api/typedefs.d.ts +0 -179
  277. package/api/typedefs.d.ts.map +0 -1
  278. package/common/api/HttpAPI.d.ts +0 -31
  279. package/common/api/HttpAPI.d.ts.map +0 -1
  280. package/common/api/HttpAPI.js +0 -57
  281. package/common/api/WebSocketAPI.d.ts +0 -153
  282. package/common/api/WebSocketAPI.d.ts.map +0 -1
  283. package/common/api/WebSocketAPI.js +0 -341
  284. package/common/controls/ControlCommon.d.ts +0 -76
  285. package/common/controls/ControlCommon.d.ts.map +0 -1
  286. package/common/controls/ControlCommon.js +0 -150
  287. package/common/controls/CopyrightControlCommon.d.ts +0 -13
  288. package/common/controls/CopyrightControlCommon.d.ts.map +0 -1
  289. package/common/controls/CopyrightControlCommon.js +0 -34
  290. package/common/controls/StopFinderControlCommon.d.ts +0 -55
  291. package/common/controls/StopFinderControlCommon.d.ts.map +0 -1
  292. package/common/controls/StopFinderControlCommon.js +0 -144
  293. package/common/index.d.ts +0 -3
  294. package/common/index.d.ts.map +0 -1
  295. package/common/layers/LayerCommon.d.ts +0 -94
  296. package/common/layers/LayerCommon.d.ts.map +0 -1
  297. package/common/layers/LayerCommon.js +0 -244
  298. package/common/mixins/RealtimeLayerMixin.d.ts +0 -288
  299. package/common/mixins/RealtimeLayerMixin.d.ts.map +0 -1
  300. package/common/mixins/RealtimeLayerMixin.js +0 -779
  301. package/common/mixins/UserInteractionsLayerMixin.d.ts +0 -60
  302. package/common/mixins/UserInteractionsLayerMixin.d.ts.map +0 -1
  303. package/common/mixins/UserInteractionsLayerMixin.js +0 -241
  304. package/common/styles/index.d.ts +0 -5
  305. package/common/styles/index.d.ts.map +0 -1
  306. package/common/styles/realtimeDefaultStyle.d.ts +0 -36
  307. package/common/styles/realtimeDefaultStyle.d.ts.map +0 -1
  308. package/common/styles/realtimeDefaultStyle.js +0 -276
  309. package/common/styles/realtimeDelayStyle.d.ts +0 -12
  310. package/common/styles/realtimeDelayStyle.d.ts.map +0 -1
  311. package/common/styles/realtimeDelayStyle.js +0 -13
  312. package/common/styles/realtimeHeadingStyle.d.ts +0 -12
  313. package/common/styles/realtimeHeadingStyle.d.ts.map +0 -1
  314. package/common/styles/realtimeHeadingStyle.js +0 -87
  315. package/common/styles/realtimeSimpleStyle.d.ts +0 -4
  316. package/common/styles/realtimeSimpleStyle.d.ts.map +0 -1
  317. package/common/styles/realtimeSimpleStyle.js +0 -23
  318. package/common/typedefs.d.ts +0 -183
  319. package/common/typedefs.d.ts.map +0 -1
  320. package/common/utils/compareDepartures.d.ts +0 -11
  321. package/common/utils/compareDepartures.d.ts.map +0 -1
  322. package/common/utils/compareDepartures.js +0 -35
  323. package/common/utils/createCanvas.d.ts +0 -11
  324. package/common/utils/createCanvas.d.ts.map +0 -1
  325. package/common/utils/createCanvas.js +0 -28
  326. package/common/utils/createRealtimeFilters.d.ts +0 -13
  327. package/common/utils/createRealtimeFilters.d.ts.map +0 -1
  328. package/common/utils/createRealtimeFilters.js +0 -74
  329. package/common/utils/debounceDeparturesMessages.d.ts +0 -13
  330. package/common/utils/debounceDeparturesMessages.d.ts.map +0 -1
  331. package/common/utils/debounceDeparturesMessages.js +0 -28
  332. package/common/utils/debounceWebsocketMessages.d.ts +0 -12
  333. package/common/utils/debounceWebsocketMessages.d.ts.map +0 -1
  334. package/common/utils/debounceWebsocketMessages.js +0 -30
  335. package/common/utils/getLayersAsFlatArray.d.ts +0 -4
  336. package/common/utils/getLayersAsFlatArray.d.ts.map +0 -1
  337. package/common/utils/getLayersAsFlatArray.js +0 -16
  338. package/common/utils/getMapboxMapCopyrights.d.ts +0 -18
  339. package/common/utils/getMapboxMapCopyrights.d.ts.map +0 -1
  340. package/common/utils/getMapboxMapCopyrights.js +0 -30
  341. package/common/utils/getMapboxRender.d.ts +0 -8
  342. package/common/utils/getMapboxRender.d.ts.map +0 -1
  343. package/common/utils/getMapboxRender.js +0 -88
  344. package/common/utils/getMaplibreRender.d.ts +0 -9
  345. package/common/utils/getMaplibreRender.d.ts.map +0 -1
  346. package/common/utils/getMaplibreRender.js +0 -40
  347. package/common/utils/getRealtimeModeSuffix.d.ts.map +0 -1
  348. package/common/utils/getRealtimeModeSuffix.js +0 -7
  349. package/common/utils/getUrlWithParams.d.ts +0 -9
  350. package/common/utils/getUrlWithParams.d.ts.map +0 -1
  351. package/common/utils/getUrlWithParams.js +0 -18
  352. package/common/utils/getVehiclePosition.d.ts +0 -16
  353. package/common/utils/getVehiclePosition.d.ts.map +0 -1
  354. package/common/utils/getVehiclePosition.js +0 -72
  355. package/common/utils/index.d.ts +0 -18
  356. package/common/utils/index.d.ts.map +0 -1
  357. package/common/utils/realtimeConfig.d.ts +0 -53
  358. package/common/utils/realtimeConfig.d.ts.map +0 -1
  359. package/common/utils/realtimeConfig.js +0 -202
  360. package/common/utils/removeDuplicate.d.ts +0 -10
  361. package/common/utils/removeDuplicate.d.ts.map +0 -1
  362. package/common/utils/removeDuplicate.js +0 -15
  363. package/common/utils/renderTrajectories.d.ts +0 -17
  364. package/common/utils/renderTrajectories.d.ts.map +0 -1
  365. package/common/utils/renderTrajectories.js +0 -110
  366. package/common/utils/sortAndFilterDepartures.d.ts +0 -16
  367. package/common/utils/sortAndFilterDepartures.d.ts.map +0 -1
  368. package/common/utils/sortAndFilterDepartures.js +0 -58
  369. package/common/utils/sortByDelay.d.ts +0 -4
  370. package/common/utils/sortByDelay.d.ts.map +0 -1
  371. package/common/utils/sortByDelay.js +0 -21
  372. package/common/utils/timeUtils.d.ts +0 -24
  373. package/common/utils/timeUtils.d.ts.map +0 -1
  374. package/common/utils/timeUtils.js +0 -39
  375. package/iife.d.ts +0 -3
  376. package/iife.d.ts.map +0 -1
  377. package/index.d.ts +0 -10
  378. package/index.d.ts.map +0 -1
  379. package/index.js +0 -10
  380. package/mapbox/controls/CopyrightControl.d.ts +0 -29
  381. package/mapbox/controls/CopyrightControl.d.ts.map +0 -1
  382. package/mapbox/controls/index.d.ts +0 -2
  383. package/mapbox/controls/index.d.ts.map +0 -1
  384. package/mapbox/index.d.ts +0 -6
  385. package/mapbox/index.d.ts.map +0 -1
  386. package/mapbox/layers/Layer.d.ts +0 -59
  387. package/mapbox/layers/Layer.d.ts.map +0 -1
  388. package/mapbox/layers/Layer.js +0 -101
  389. package/mapbox/layers/RealtimeLayer.d.ts +0 -180
  390. package/mapbox/layers/RealtimeLayer.d.ts.map +0 -1
  391. package/mapbox/layers/RealtimeLayer.js +0 -270
  392. package/mapbox/layers/index.d.ts +0 -3
  393. package/mapbox/layers/index.d.ts.map +0 -1
  394. package/mapbox/utils/getMercatorResolution.d.ts +0 -9
  395. package/mapbox/utils/getMercatorResolution.d.ts.map +0 -1
  396. package/mapbox/utils/getMercatorResolution.js +0 -18
  397. package/mapbox/utils/getSourceCoordinates.d.ts +0 -9
  398. package/mapbox/utils/getSourceCoordinates.d.ts.map +0 -1
  399. package/mapbox/utils/getSourceCoordinates.js +0 -27
  400. package/mapbox/utils/index.d.ts +0 -3
  401. package/mapbox/utils/index.d.ts.map +0 -1
  402. package/mbt.js +0 -64706
  403. package/mbt.js.map +0 -7
  404. package/mbt.min.js +0 -1090
  405. package/mbt.min.js.map +0 -7
  406. package/ol/controls/CopyrightControl.d.ts +0 -31
  407. package/ol/controls/CopyrightControl.d.ts.map +0 -1
  408. package/ol/controls/CopyrightControl.js +0 -68
  409. package/ol/controls/RoutingControl.d.ts +0 -193
  410. package/ol/controls/RoutingControl.d.ts.map +0 -1
  411. package/ol/controls/RoutingControl.js +0 -631
  412. package/ol/controls/StopFinderControl.d.ts +0 -30
  413. package/ol/controls/StopFinderControl.d.ts.map +0 -1
  414. package/ol/controls/index.d.ts +0 -4
  415. package/ol/controls/index.d.ts.map +0 -1
  416. package/ol/index.d.ts +0 -6
  417. package/ol/index.d.ts.map +0 -1
  418. package/ol/layers/Layer.d.ts +0 -86
  419. package/ol/layers/Layer.d.ts.map +0 -1
  420. package/ol/layers/Layer.js +0 -174
  421. package/ol/layers/MapGlLayer.d.ts +0 -67
  422. package/ol/layers/MapGlLayer.d.ts.map +0 -1
  423. package/ol/layers/MapGlLayer.js +0 -218
  424. package/ol/layers/MapboxLayer.d.ts +0 -50
  425. package/ol/layers/MapboxLayer.d.ts.map +0 -1
  426. package/ol/layers/MapboxLayer.js +0 -109
  427. package/ol/layers/MapboxStyleLayer.d.ts +0 -130
  428. package/ol/layers/MapboxStyleLayer.d.ts.map +0 -1
  429. package/ol/layers/MapboxStyleLayer.js +0 -378
  430. package/ol/layers/MaplibreLayer.d.ts.map +0 -1
  431. package/ol/layers/MaplibreLayer.js +0 -34
  432. package/ol/layers/RealtimeLayer.d.ts +0 -202
  433. package/ol/layers/RealtimeLayer.d.ts.map +0 -1
  434. package/ol/layers/RealtimeLayer.js +0 -332
  435. package/ol/layers/RoutingLayer.d.ts +0 -35
  436. package/ol/layers/RoutingLayer.d.ts.map +0 -1
  437. package/ol/layers/RoutingLayer.js +0 -85
  438. package/ol/layers/VectorLayer.d.ts +0 -25
  439. package/ol/layers/VectorLayer.d.ts.map +0 -1
  440. package/ol/layers/VectorLayer.js +0 -38
  441. package/ol/layers/WMSLayer.d.ts +0 -42
  442. package/ol/layers/WMSLayer.d.ts.map +0 -1
  443. package/ol/layers/WMSLayer.js +0 -88
  444. package/ol/layers/index.d.ts +0 -9
  445. package/ol/layers/index.d.ts.map +0 -1
  446. package/ol/styles/fullTrajectoryDelayStyle.d.ts +0 -4
  447. package/ol/styles/fullTrajectoryDelayStyle.d.ts.map +0 -1
  448. package/ol/styles/fullTrajectoryDelayStyle.js +0 -33
  449. package/ol/styles/fullTrajectoryStyle.d.ts +0 -5
  450. package/ol/styles/fullTrajectoryStyle.d.ts.map +0 -1
  451. package/ol/styles/fullTrajectoryStyle.js +0 -44
  452. package/ol/styles/index.d.ts +0 -3
  453. package/ol/styles/index.d.ts.map +0 -1
  454. package/setupTests.d.ts +0 -2
  455. package/setupTests.d.ts.map +0 -1
  456. /package/{api → src/api}/index.js +0 -0
  457. /package/{common → src/common}/index.js +0 -0
  458. /package/{common → src/common}/styles/index.js +0 -0
  459. /package/{mapbox → src/mapbox}/controls/index.js +0 -0
  460. /package/{mapbox → src/mapbox}/index.js +0 -0
  461. /package/{mapbox → src/mapbox}/layers/index.js +0 -0
  462. /package/{mapbox → src/mapbox}/utils/index.js +0 -0
  463. /package/{ol → src/ol}/controls/index.js +0 -0
  464. /package/{ol → src/ol}/index.js +0 -0
  465. /package/{ol → src/ol}/layers/index.js +0 -0
  466. /package/{ol → src/ol}/styles/index.js +0 -0
  467. /package/{types → src/types}/common.d.ts +0 -0
  468. /package/{types → src/types}/index.d.ts +0 -0
  469. /package/{types → src/types}/realtime.d.ts +0 -0
  470. /package/{types → src/types}/routing.d.ts +0 -0
  471. /package/{types → src/types}/stops.d.ts +0 -0
@@ -1,5 +1,7 @@
1
1
  import { Map } from 'maplibre-gl';
2
+ import { getMaplibreRender } from '../../common/utils';
2
3
  import MapGlLayer, { MapGlLayerOptions } from './MapGlLayer';
4
+
3
5
  /**
4
6
  * A class representing MaplibreLayer to display on BasicMap
5
7
  *
@@ -15,14 +17,23 @@ import MapGlLayer, { MapGlLayerOptions } from './MapGlLayer';
15
17
  * @extends {Layer}
16
18
  */
17
19
  export default class MaplibreLayer extends MapGlLayer {
18
- mbMap?: maplibregl.Map;
19
- getOlLayerRender(): import("ol/layer/Layer").RenderFunction;
20
- getMapboxMapClass(): typeof Map;
21
- /**
22
- * Create a copy of the MapboxLayer.
23
- * @param {Object} newOptions Options to override
24
- * @return {MapboxLayer} A MapboxLayer
25
- */
26
- clone(newOptions: MapGlLayerOptions): MaplibreLayer;
20
+ mbMap?: maplibregl.Map;
21
+
22
+ getOlLayerRender() {
23
+ return getMaplibreRender(this);
24
+ }
25
+
26
+ // eslint-disable-next-line class-methods-use-this
27
+ getMapboxMapClass() {
28
+ return Map;
29
+ }
30
+
31
+ /**
32
+ * Create a copy of the MapboxLayer.
33
+ * @param {Object} newOptions Options to override
34
+ * @return {MapboxLayer} A MapboxLayer
35
+ */
36
+ clone(newOptions: MapGlLayerOptions) {
37
+ return new MaplibreLayer({ ...this.options, ...newOptions });
38
+ }
27
39
  }
28
- //# sourceMappingURL=MaplibreLayer.d.ts.map
@@ -0,0 +1,84 @@
1
+ import fetch from 'jest-fetch-mock';
2
+ import Map from 'ol/Map';
3
+ import View from 'ol/View';
4
+ import WS from 'jest-websocket-mock';
5
+ import RealtimeLayer from './RealtimeLayer';
6
+
7
+ // create a WS instance, listening on port 1234 on localhost
8
+ let layer;
9
+ let onClick;
10
+ let olMap;
11
+ let server;
12
+
13
+ describe('RealtimeLayer', () => {
14
+ beforeEach(() => {
15
+ server = new WS('ws://localhost:1234');
16
+ global.fetch = fetch;
17
+ fetch.resetMocks();
18
+
19
+ onClick = jest.fn();
20
+ layer = new RealtimeLayer({
21
+ url: 'ws://localhost:1234',
22
+ apiKey: 'apiKey',
23
+ onClick,
24
+ });
25
+
26
+ olMap = new Map({
27
+ view: new View({
28
+ center: [831634, 5933959],
29
+ zoom: 9,
30
+ }),
31
+ });
32
+ });
33
+
34
+ afterEach(() => {
35
+ // ...or gracefully close the connection
36
+ server.close();
37
+
38
+ // The WS class also has a static "clean" method to gracefully close all open connections,
39
+ // particularly useful to reset the environment between test runs.
40
+ WS.clean();
41
+ });
42
+
43
+ test('should be instanced.', () => {
44
+ expect(layer).toBeInstanceOf(RealtimeLayer);
45
+ });
46
+
47
+ test('should called terminate on initalization.', () => {
48
+ const spy = jest.spyOn(layer, 'detachFromMap');
49
+
50
+ fetch.mockResponseOnce(JSON.stringify(global.fetchTrajectoriesResponse));
51
+
52
+ layer.attachToMap(olMap);
53
+ expect(spy).toHaveBeenCalledTimes(1);
54
+ });
55
+
56
+ test('should clone', () => {
57
+ const clone = layer.clone({ name: 'clone' });
58
+ expect(clone).not.toBe(layer);
59
+ expect(clone.name).toBe('clone');
60
+ expect(clone).toBeInstanceOf(RealtimeLayer);
61
+ });
62
+
63
+ test('should use the sort function.', () => {
64
+ const fn = () => true;
65
+ const laye = new RealtimeLayer({
66
+ url: 'ws://localhost:1234',
67
+ apiKey: 'apiKey',
68
+ sort: fn,
69
+ });
70
+ expect(laye).toBeInstanceOf(RealtimeLayer);
71
+ expect(laye.sort).toBe(fn);
72
+ });
73
+
74
+ test('should use filter function.', () => {
75
+ const fn = () => true;
76
+ const laye = new RealtimeLayer({
77
+ url: 'ws://localhost:1234',
78
+ apiKey: 'apiKey',
79
+ filter: fn, // reverse the array
80
+ });
81
+ expect(laye).toBeInstanceOf(RealtimeLayer);
82
+ expect(laye.filter).toBe(fn);
83
+ });
84
+ });
@@ -0,0 +1,465 @@
1
+ import GeoJSON from 'ol/format/GeoJSON';
2
+ import { Layer as OLLayer, Group, Vector as VectorLayer } from 'ol/layer';
3
+ import Source from 'ol/source/Source';
4
+ import { composeCssTransform } from 'ol/transform';
5
+ import { Vector as VectorSource } from 'ol/source';
6
+ import Feature, { FeatureLike } from 'ol/Feature';
7
+ import { MapEvent } from 'ol';
8
+ import { Coordinate } from 'ol/coordinate';
9
+ import { ObjectEvent } from 'ol/Object';
10
+ import debounce from 'lodash.debounce';
11
+ import Layer from './Layer';
12
+ import mixin, {
13
+ RealtimeLayerMixinOptions,
14
+ } from '../../common/mixins/RealtimeLayerMixin';
15
+ import { fullTrajectoryStyle } from '../styles';
16
+ import {
17
+ AnyMap,
18
+ LayerGetFeatureInfoResponse,
19
+ RealtimeFullTrajectory,
20
+ RealtimeTrainId,
21
+ ViewState,
22
+ } from '../../types';
23
+ import { RealtimeTrajectory } from '../../api/typedefs';
24
+ import { WebSocketAPIMessageEventData } from '../../common/api/WebSocketAPI';
25
+
26
+ /** @private */
27
+ const format = new GeoJSON();
28
+
29
+ export type OlRealtimeLayerOptions = RealtimeLayerMixinOptions & {
30
+ fullTrajectoryStyle?: (
31
+ feature: FeatureLike,
32
+ resolution: number,
33
+ options: any,
34
+ ) => void;
35
+ allowRenderWhenAnimating?: boolean;
36
+ };
37
+
38
+ /**
39
+ * Responsible for loading and display data from a Realtime service.
40
+ *
41
+ * @example
42
+ * import { RealtimeLayer } from 'mobility-toolbox-js/ol';
43
+ *
44
+ * const layer = new RealtimeLayer({
45
+ * url: [yourUrl],
46
+ * apiKey: [yourApiKey],
47
+ * });
48
+ *
49
+ *
50
+ * @see <a href="/api/class/src/api/RealtimeAPI%20js~RealtimeAPI%20html">RealtimeAPI</a>
51
+ *
52
+ * @extends {Layer}
53
+ * @implements {UserInteractionsLayerInterface}
54
+ * @implements {RealtimeLayerInterface}
55
+ */
56
+ // @ts-ignore
57
+ class RealtimeLayer extends mixin(Layer) {
58
+ allowRenderWhenAnimating?: boolean = false;
59
+
60
+ /**
61
+ * Constructor.
62
+ *
63
+ * @param {Object} options
64
+ * @private
65
+ */
66
+ constructor(options: OlRealtimeLayerOptions) {
67
+ // We use a group to be able to add custom vector layer in extended class.
68
+ // For example TrajservLayer use a vectorLayer to display the complete trajectory.
69
+ super({
70
+ ...options,
71
+ });
72
+
73
+ this.allowRenderWhenAnimating = !!options.allowRenderWhenAnimating;
74
+
75
+ /** @private */
76
+ this.olLayer =
77
+ options.olLayer ||
78
+ new Group({
79
+ layers: [
80
+ new VectorLayer({
81
+ updateWhileAnimating: true,
82
+ updateWhileInteracting: true,
83
+ source: new VectorSource({ features: [] }),
84
+ style: (feature, resolution) => {
85
+ return (options.fullTrajectoryStyle || fullTrajectoryStyle)(
86
+ feature,
87
+ resolution,
88
+ this.styleOptions,
89
+ );
90
+ },
91
+ }),
92
+ new OLLayer({
93
+ source: new Source({}),
94
+ render: (frameState) => {
95
+ if (!this.container) {
96
+ this.container = document.createElement('div');
97
+ this.container.style.position = 'absolute';
98
+ this.container.style.width = '100%';
99
+ this.container.style.height = '100%';
100
+ this.transformContainer = document.createElement('div');
101
+ this.transformContainer.style.position = 'absolute';
102
+ this.transformContainer.style.width = '100%';
103
+ this.transformContainer.style.height = '100%';
104
+ this.container.appendChild(this.transformContainer);
105
+ if (this.canvas) {
106
+ (this.canvas as HTMLCanvasElement).style.position =
107
+ 'absolute';
108
+ (this.canvas as HTMLCanvasElement).style.top = '0';
109
+ (this.canvas as HTMLCanvasElement).style.left = '0';
110
+ (this.canvas as HTMLCanvasElement).style.transformOrigin =
111
+ 'top left';
112
+ this.transformContainer.appendChild(this.canvas);
113
+ }
114
+ }
115
+
116
+ if (this.renderedViewState) {
117
+ const { center, resolution, rotation } = frameState.viewState;
118
+ const {
119
+ center: renderedCenter,
120
+ resolution: renderedResolution,
121
+ rotation: renderedRotation,
122
+ } = this.renderedViewState;
123
+
124
+ if (renderedResolution / resolution >= 3) {
125
+ // Avoid having really big points when zooming fast.
126
+ const context = this.canvas?.getContext('2d');
127
+ context?.clearRect(
128
+ 0,
129
+ 0,
130
+ this.canvas?.width as number,
131
+ this.canvas?.height as number,
132
+ );
133
+ } else {
134
+ const pixelCenterRendered =
135
+ this.map.getPixelFromCoordinate(renderedCenter);
136
+ const pixelCenter = this.map.getPixelFromCoordinate(center);
137
+ this.transformContainer.style.transform = composeCssTransform(
138
+ pixelCenterRendered[0] - pixelCenter[0],
139
+ pixelCenterRendered[1] - pixelCenter[1],
140
+ renderedResolution / resolution,
141
+ renderedResolution / resolution,
142
+ rotation - renderedRotation,
143
+ 0,
144
+ 0,
145
+ );
146
+ }
147
+ }
148
+ return this.container;
149
+ },
150
+ }),
151
+ ],
152
+ });
153
+
154
+ // We store the layer used to highlight the full Trajectory
155
+ this.vectorLayer = this.olLayer.getLayers().item(0);
156
+
157
+ // Options the last render run did happen. If something changes
158
+ // we have to render again
159
+ /** @private */
160
+ this.renderState = {
161
+ center: [0, 0],
162
+ zoom: undefined,
163
+ rotation: 0,
164
+ };
165
+
166
+ this.onZoomEndDebounced = debounce(this.onZoomEnd, 100);
167
+ this.onMoveEndDebounced = debounce(this.onMoveEnd, 100);
168
+ }
169
+
170
+ attachToMap(map: AnyMap) {
171
+ super.attachToMap(map);
172
+ if (this.map) {
173
+ this.olListenersKeys.push(
174
+ ...this.map.on(
175
+ ['moveend', 'change:target'],
176
+ (evt: MapEvent | ObjectEvent) => {
177
+ const view = (
178
+ (evt as MapEvent).map || (evt as ObjectEvent).target
179
+ ).getView();
180
+ if (view.getAnimating() || view.getInteracting()) {
181
+ return;
182
+ }
183
+ const zoom = view.getZoom();
184
+
185
+ // Update the interval between render updates
186
+ if (this.currentZoom !== zoom) {
187
+ this.onZoomEndDebounced(evt);
188
+ }
189
+ this.currentZoom = zoom;
190
+
191
+ this.onMoveEndDebounced(evt);
192
+ },
193
+ ),
194
+ );
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Destroy the container of the tracker.
200
+ */
201
+ detachFromMap() {
202
+ super.detachFromMap();
203
+ this.container = null;
204
+ }
205
+
206
+ /**
207
+ * Detect in the canvas if there is data to query at a specific coordinate.
208
+ * @param {ol/coordinate~Coordinate} coordinate The coordinate to test
209
+ * @returns
210
+ */
211
+ hasFeatureInfoAtCoordinate(coordinate: Coordinate) {
212
+ if (this.map && this.canvas) {
213
+ const context = this.canvas.getContext('2d', {
214
+ willReadFrequently: true,
215
+ });
216
+ const pixel = this.map.getPixelFromCoordinate(coordinate);
217
+ return !!context?.getImageData(
218
+ pixel[0] * (this.pixelRatio || 1),
219
+ pixel[1] * (this.pixelRatio || 1),
220
+ 1,
221
+ 1,
222
+ ).data[3];
223
+ }
224
+ return false;
225
+ }
226
+
227
+ /**
228
+ * Render the trajectories using current map's size, resolution and rotation.
229
+ * @param {boolean} noInterpolate if true, renders the vehicles without interpolating theirs positions.
230
+ * @overrides
231
+ */
232
+ // @ts-ignore
233
+ renderTrajectories(noInterpolate: boolean) {
234
+ if (!this.map) {
235
+ return;
236
+ }
237
+
238
+ const view = this.map.getView();
239
+
240
+ // it could happen that the view is set but without center yet,
241
+ // so the calcualteExtent will trigger an error.
242
+ if (!view.getCenter()) {
243
+ return;
244
+ }
245
+
246
+ super.renderTrajectories(
247
+ {
248
+ size: this.map.getSize(),
249
+ center: view.getCenter(),
250
+ extent: view.calculateExtent(),
251
+ resolution: view.getResolution(),
252
+ rotation: view.getRotation(),
253
+ zoom: view.getZoom(),
254
+ pixelRatio: this.pixelRatio,
255
+ },
256
+ noInterpolate,
257
+ );
258
+ }
259
+
260
+ /**
261
+ * Launch renderTrajectories. it avoids duplicating code in renderTrajectories methhod.
262
+ * @private
263
+ * @override
264
+ */
265
+ renderTrajectoriesInternal(viewState: ViewState, noInterpolate: boolean) {
266
+ if (!this.map) {
267
+ return false;
268
+ }
269
+ let isRendered = false;
270
+
271
+ const blockRendering = this.allowRenderWhenAnimating
272
+ ? false
273
+ : this.map.getView().getAnimating() ||
274
+ this.map.getView().getInteracting();
275
+
276
+ // Don't render the map when the map is animating or interacting.
277
+ isRendered = blockRendering
278
+ ? false
279
+ : super.renderTrajectoriesInternal(viewState, noInterpolate);
280
+
281
+ // We update the current render state.
282
+ if (isRendered) {
283
+ this.renderedViewState = { ...viewState };
284
+
285
+ if (this.transformContainer) {
286
+ this.transformContainer.style.transform = '';
287
+ }
288
+ }
289
+ return isRendered;
290
+ }
291
+
292
+ /**
293
+ * Return the delay in ms before the next rendering.
294
+ */
295
+ getRefreshTimeInMs() {
296
+ return super.getRefreshTimeInMs(this.map.getView().getZoom());
297
+ }
298
+
299
+ getFeatureInfoAtCoordinate(
300
+ coordinate: Coordinate,
301
+ options = {},
302
+ ): Promise<LayerGetFeatureInfoResponse> {
303
+ if (!this.map || !this.map.getView()) {
304
+ return Promise.resolve({
305
+ layer: this,
306
+ features: [],
307
+ coordinate,
308
+ });
309
+ }
310
+
311
+ const resolution = this.map.getView().getResolution();
312
+ return super.getFeatureInfoAtCoordinate(coordinate, {
313
+ resolution,
314
+ ...options,
315
+ });
316
+ }
317
+
318
+ /**
319
+ * On move end we update the websocket with the new bbox.
320
+ *
321
+ * @private
322
+ * @override
323
+ */
324
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
325
+ onMoveEnd(evt: MapEvent | ObjectEvent) {
326
+ if (!this.isUpdateBboxOnMoveEnd || !this.visible) {
327
+ return;
328
+ }
329
+
330
+ this.setBbox();
331
+ }
332
+
333
+ /**
334
+ * Function called on moveend event only when the zoom has changed.
335
+ *
336
+ * @param {ol/MapEvent~MapEvent} evt Moveend event.
337
+ * @private
338
+ * @override
339
+ */
340
+ // eslint-disable-next-line no-unused-vars
341
+ onZoomEnd() {
342
+ super.onZoomEnd();
343
+
344
+ if (!this.isUpdateBboxOnMoveEnd || !this.visible) {
345
+ return;
346
+ }
347
+
348
+ if (this.userClickInteractions && this.selectedVehicleId) {
349
+ this.highlightTrajectory(this.selectedVehicleId);
350
+ }
351
+ }
352
+
353
+ /**
354
+ * Update the cursor style when hovering a vehicle.
355
+ *
356
+ * @private
357
+ * @override
358
+ */
359
+ onFeatureHover(
360
+ features: Feature[],
361
+ layer: RealtimeLayer,
362
+ coordinate: Coordinate,
363
+ ) {
364
+ super.onFeatureHover(features, layer, coordinate);
365
+ this.map.getTargetElement().style.cursor = features.length
366
+ ? 'pointer'
367
+ : 'auto';
368
+ }
369
+
370
+ /**
371
+ * Display the complete trajectory of the vehicle.
372
+ *
373
+ * @private
374
+ * @override
375
+ */
376
+ onFeatureClick(
377
+ features: Feature[],
378
+ layer: RealtimeLayer,
379
+ coordinate: Coordinate,
380
+ ) {
381
+ super.onFeatureClick(features, layer, coordinate);
382
+ if (!features.length && this.vectorLayer) {
383
+ this.vectorLayer.getSource().clear();
384
+ }
385
+ if (this.selectedVehicleId) {
386
+ this.highlightTrajectory(this.selectedVehicleId);
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Remove the trajectory form the list if necessary.
392
+ *
393
+ * @private
394
+ */
395
+ purgeTrajectory(
396
+ trajectory: RealtimeTrajectory,
397
+ extent: [number, number, number, number],
398
+ zoom: number,
399
+ ) {
400
+ const center = this.map.getView().getCenter();
401
+ if (!extent && !center) {
402
+ // In that case the view is not zoomed yet so we can't calculate the extent of the map,
403
+ // it will trigger a js error on calculateExtent function.
404
+ return false;
405
+ }
406
+ return super.purgeTrajectory(
407
+ trajectory,
408
+ extent || this.map.getView().calculateExtent(),
409
+ zoom || this.map.getView().getZoom(),
410
+ );
411
+ }
412
+
413
+ /**
414
+ * Send the current bbox to the websocket
415
+ *
416
+ * @private
417
+ */
418
+ setBbox(extent?: [number, number, number, number], zoom?: number) {
419
+ super.setBbox(
420
+ extent || this.map.getView().calculateExtent(),
421
+ zoom || this.map.getView().getZoom(),
422
+ );
423
+ }
424
+
425
+ /**
426
+ * Highlight the trajectory of journey.
427
+ * @private
428
+ */
429
+ highlightTrajectory(id: RealtimeTrainId): Promise<Feature[] | undefined> {
430
+ return this.api
431
+ .getFullTrajectory(
432
+ id,
433
+ this.mode,
434
+ this.getGeneralizationLevelByZoom(
435
+ Math.floor(this.map?.getView()?.getZoom() || 0),
436
+ ),
437
+ )
438
+ .then((data: WebSocketAPIMessageEventData<RealtimeFullTrajectory>) => {
439
+ const fullTrajectory = data.content;
440
+ this.vectorLayer.getSource().clear();
441
+
442
+ if (
443
+ !fullTrajectory ||
444
+ !fullTrajectory.features ||
445
+ !fullTrajectory.features.length
446
+ ) {
447
+ return undefined;
448
+ }
449
+ const features = format.readFeatures(fullTrajectory);
450
+ this.vectorLayer.getSource().addFeatures(features);
451
+ return features as Feature[];
452
+ });
453
+ }
454
+
455
+ /**
456
+ * Create a copy of the RealtimeLayer.
457
+ * @param {Object} newOptions Options to override
458
+ * @return {RealtimeLayer} A RealtimeLayer
459
+ */
460
+ clone(newOptions: OlRealtimeLayerOptions) {
461
+ return new RealtimeLayer({ ...this.options, ...newOptions });
462
+ }
463
+ }
464
+
465
+ export default RealtimeLayer;
@@ -0,0 +1,48 @@
1
+ import fetch from 'jest-fetch-mock';
2
+ import Map from 'ol/Map';
3
+ import View from 'ol/View';
4
+ import RoutingLayer from './RoutingLayer';
5
+
6
+ let layer;
7
+ let onClick;
8
+ let olMap;
9
+
10
+ describe('RoutingLayer', () => {
11
+ beforeEach(() => {
12
+ global.fetch = fetch;
13
+ fetch.resetMocks();
14
+
15
+ onClick = jest.fn();
16
+ layer = new RoutingLayer({
17
+ onClick,
18
+ apiKey: 'apiKey',
19
+ });
20
+
21
+ olMap = new Map({
22
+ view: new View({
23
+ center: [831634, 5933959],
24
+ zoom: 9,
25
+ }),
26
+ });
27
+ });
28
+
29
+ test('should be instanced.', () => {
30
+ expect(layer).toBeInstanceOf(RoutingLayer);
31
+ });
32
+
33
+ test('should called terminate on initalization.', () => {
34
+ const spy = jest.spyOn(layer, 'detachFromMap');
35
+
36
+ fetch.mockResponseOnce(JSON.stringify(global.fetchTrajectoriesResponse));
37
+
38
+ layer.attachToMap(olMap);
39
+ expect(spy).toHaveBeenCalledTimes(1);
40
+ });
41
+
42
+ test('should clone', () => {
43
+ const clone = layer.clone({ name: 'clone' });
44
+ expect(clone).not.toBe(layer);
45
+ expect(clone.name).toBe('clone');
46
+ expect(clone).toBeInstanceOf(RoutingLayer);
47
+ });
48
+ });