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
@@ -0,0 +1,350 @@
1
+ import { fromLonLat } from 'ol/proj';
2
+ import { unByKey } from 'ol/Observable';
3
+ import { getWidth, getHeight } from 'ol/extent';
4
+ import transformRotate from '@turf/transform-rotate';
5
+ import { point } from '@turf/helpers';
6
+ import { Coordinate } from 'ol/coordinate';
7
+ import { Feature } from 'ol';
8
+ import mixin from '../../common/mixins/RealtimeLayerMixin';
9
+ import Layer from './Layer';
10
+ import { getSourceCoordinates, getMercatorResolution } from '../utils';
11
+ import type {
12
+ AnyMapboxMap,
13
+ LayerGetFeatureInfoResponse,
14
+ ViewState,
15
+ } from '../../types';
16
+ import type { RealtimeTrajectory } from '../../api/typedefs';
17
+
18
+ /**
19
+ * Responsible for loading and display data from a Realtime service.
20
+ *
21
+ * @example
22
+ * import { RealtimeLayer } from 'mobility-toolbox-js/mapbox';
23
+ *
24
+ * const layer = new RealtimeLayer({
25
+ * url: [yourUrl],
26
+ * apiKey: [yourApiKey],
27
+ * });
28
+ *
29
+ *
30
+ * @see <a href="/api/class/src/api/RealtimeAPI%20js~RealtimeAPI%20html">RealtimeAPI</a>
31
+ *
32
+ * @extends {Layer}
33
+ * @implements {RealtimeLayerInterface}
34
+ */
35
+ // @ts-ignore
36
+ class RealtimeLayer extends mixin(Layer) {
37
+ constructor(options = {}) {
38
+ super({
39
+ ...options,
40
+ });
41
+
42
+ /** @private */
43
+ this.onLoad = this.onLoad.bind(this);
44
+
45
+ /** @private */
46
+ this.onMove = this.onMove.bind(this);
47
+
48
+ /** @private */
49
+ this.onMoveEnd = this.onMoveEnd.bind(this);
50
+
51
+ /** @private */
52
+ this.onZoomEnd = this.onZoomEnd.bind(this);
53
+
54
+ /** @private */
55
+ this.onVisibilityChange = this.onVisibilityChange.bind(this);
56
+ }
57
+
58
+ /**
59
+ * Initialize the layer.
60
+ *
61
+ * @param {mapboxgl.Map} map A [mapbox Map](https://docs.mapbox.com/mapbox-gl-js/api/map/).
62
+ * @param {string} beforeId Layer's id before which we want to add the new layer.
63
+ * @override
64
+ */
65
+ // @ts-ignore
66
+ attachToMap(map: AnyMapboxMap, beforeId: string) {
67
+ if (!map) {
68
+ return;
69
+ }
70
+ super.attachToMap(map);
71
+
72
+ this.source = {
73
+ type: 'canvas',
74
+ canvas: this.canvas,
75
+ coordinates: getSourceCoordinates(map, this.pixelRatio),
76
+ // Set to true if the canvas source is animated. If the canvas is static, animate should be set to false to improve performance.
77
+ animate: true,
78
+ attribution: this.copyrights && this.copyrights.join(', '),
79
+ };
80
+
81
+ this.beforeId = beforeId;
82
+ this.layer = {
83
+ id: this.key,
84
+ type: 'raster',
85
+ source: this.key,
86
+ layout: {
87
+ visibility: this.visible ? 'visible' : 'none',
88
+ },
89
+ paint: {
90
+ 'raster-opacity': 1,
91
+ 'raster-fade-duration': 0,
92
+ 'raster-resampling': 'nearest', // important otherwise it looks blurry
93
+ },
94
+ };
95
+
96
+ if (map.isStyleLoaded()) {
97
+ this.onLoad();
98
+ }
99
+
100
+ this.map.on('load', this.onLoad);
101
+
102
+ this.listeners = [this.on('change:visible', this.onVisibilityChange)];
103
+ }
104
+
105
+ /**
106
+ * Remove listeners from the Mapbox Map.
107
+ */
108
+ detachFromMap() {
109
+ if (this.map) {
110
+ this.map.off('load', this.onLoad);
111
+
112
+ // @ts-ignore
113
+ this.listeners.forEach((listener) => {
114
+ unByKey(listener);
115
+ });
116
+ if (this.map.style && this.map.getLayer(this.key)) {
117
+ this.map.removeLayer(this.key);
118
+ }
119
+ if (this.map.style && this.map.getSource(this.key)) {
120
+ this.map.removeSource(this.key);
121
+ }
122
+ }
123
+ super.detachFromMap();
124
+ }
125
+
126
+ /**
127
+ * Start updating vehicles position.
128
+ *
129
+ * @listens {mapboxgl.map.event:zoomend} Listen to zoom end event.
130
+ * @listens {mapboxgl.map.event:mousemove} Listen to mousemove end.
131
+ * @override
132
+ */
133
+ start() {
134
+ super.start();
135
+
136
+ this.map.on('move', this.onMove);
137
+ this.map.on('moveend', this.onMoveEnd);
138
+ this.map.on('zoomend', this.onZoomEnd);
139
+ }
140
+
141
+ /**
142
+ * Stop updating vehicles position, and unlisten events.
143
+ *
144
+ * @override
145
+ */
146
+ stop() {
147
+ super.stop();
148
+ if (this.map) {
149
+ this.map.off('move', this.onMove);
150
+ this.map.off('moveend', this.onMoveEnd);
151
+ this.map.off('zoomend', this.onZoomEnd);
152
+ }
153
+ }
154
+
155
+ onLoad() {
156
+ if (!this.map.getSource(this.key)) {
157
+ this.map.addSource(this.key, this.source);
158
+ }
159
+ if (!this.map.getLayer(this.key)) {
160
+ this.map.addLayer(this.layer, this.beforeId);
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Function triggered when the user moves the cursor over the map.
166
+ * @override
167
+ */
168
+ onUserMoveCallback(
169
+ evt: mapboxgl.MapLayerMouseEvent | maplibregl.MapMouseEvent,
170
+ ) {
171
+ super.onUserMoveCallback({
172
+ coordinate: fromLonLat(evt.lngLat.toArray()),
173
+ ...evt,
174
+ });
175
+ }
176
+
177
+ /**
178
+ * Render the trajectories using current map's size, resolution and rotation.
179
+ * @param {boolean} noInterpolate if true, renders the vehicles without interpolating theirs positions.
180
+ * @overrides
181
+ */
182
+ // @ts-ignore
183
+ renderTrajectories(noInterpolate?: boolean = false) {
184
+ if (!this.map) {
185
+ return;
186
+ }
187
+ if (!this.pixelRatio) {
188
+ this.pixelRatio = 1;
189
+ }
190
+
191
+ const { width, height } = this.map.getCanvas();
192
+ const center = this.map.getCenter();
193
+
194
+ // We use turf here to have good transform.
195
+ const leftBottom = this.map.unproject({
196
+ x: 0,
197
+ y: height / this.pixelRatio,
198
+ }); // southWest
199
+ const rightTop = this.map.unproject({
200
+ x: width / this.pixelRatio,
201
+ y: 0,
202
+ }); // north east
203
+
204
+ const coord0 = transformRotate(
205
+ point([leftBottom.lng, leftBottom.lat]),
206
+ -this.map.getBearing(),
207
+ {
208
+ pivot: [center.lng, center.lat],
209
+ },
210
+ ).geometry.coordinates;
211
+ const coord1 = transformRotate(
212
+ point([rightTop.lng, rightTop.lat]),
213
+ -this.map.getBearing(),
214
+ {
215
+ pivot: [center.lng, center.lat],
216
+ },
217
+ ).geometry.coordinates;
218
+
219
+ const bounds = [...fromLonLat(coord0), ...fromLonLat(coord1)];
220
+ const xResolution = getWidth(bounds) / (width / this.pixelRatio);
221
+ const yResolution = getHeight(bounds) / (height / this.pixelRatio);
222
+ const res = Math.max(xResolution, yResolution);
223
+
224
+ // Coordinate of trajectories are in mercator so we have to pass the proper resolution and center in mercator.
225
+ const viewState = {
226
+ size: [width / this.pixelRatio, height / this.pixelRatio],
227
+ center: fromLonLat([center.lng, center.lat]),
228
+ extent: bounds,
229
+ resolution: res,
230
+ zoom: this.getOlZoom(),
231
+ rotation: -(this.map.getBearing() * Math.PI) / 180,
232
+ pixelRatio: this.pixelRatio,
233
+ };
234
+
235
+ super.renderTrajectories(viewState, noInterpolate);
236
+ }
237
+
238
+ /**
239
+ * Return the delay in ms before the next rendering.
240
+ */
241
+ getRefreshTimeInMs() {
242
+ return super.getRefreshTimeInMs(this.map.getZoom());
243
+ }
244
+
245
+ getFeatureInfoAtCoordinate(
246
+ coordinate: Coordinate,
247
+ options = {},
248
+ ): Promise<LayerGetFeatureInfoResponse> {
249
+ const resolution = getMercatorResolution(this.map);
250
+ return super.getFeatureInfoAtCoordinate(coordinate, {
251
+ resolution,
252
+ ...options,
253
+ });
254
+ }
255
+
256
+ onVisibilityChange() {
257
+ if (this.visible && !this.map.getLayer(this.key)) {
258
+ this.map.addLayer(this.layer, this.beforeId);
259
+ } else if (this.map.getLayer(this.key)) {
260
+ this.map.removeLayer(this.key);
261
+ }
262
+ // We can't use setLayoutProperty it triggers an error probably a bug in mapbox
263
+ // this.map.setLayoutProperty(
264
+ // this.key,
265
+ // 'visibilty',
266
+ // this.visible ? 'visible' : 'none',
267
+ // );
268
+ }
269
+
270
+ /**
271
+ * Remove the trajectory form the list if necessary.
272
+ *
273
+ * @private
274
+ */
275
+ purgeTrajectory(
276
+ trajectory: RealtimeTrajectory,
277
+ extent: [number, number, number, number],
278
+ zoom: number,
279
+ ) {
280
+ return super.purgeTrajectory(
281
+ trajectory,
282
+ extent || this.getMercatorExtent(),
283
+ zoom || Math.floor(this.getOlZoom()),
284
+ );
285
+ }
286
+
287
+ /**
288
+ * Send the current bbox to the websocket
289
+ */
290
+ setBbox(extent?: [number, number, number, number], zoom?: number) {
291
+ super.setBbox(extent || this.getMercatorExtent(), zoom || this.getOlZoom());
292
+ }
293
+
294
+ /**
295
+ * Callback on 'move' event.
296
+ *
297
+ * @private
298
+ */
299
+ onMove() {
300
+ this.renderTrajectories();
301
+ }
302
+
303
+ renderTrajectoriesInternal(
304
+ viewState: ViewState,
305
+ noInterpolate: boolean = false,
306
+ ) {
307
+ const render = super.renderTrajectoriesInternal(viewState, noInterpolate);
308
+ if (render && this.map.style) {
309
+ const extent = getSourceCoordinates(this.map, this.pixelRatio);
310
+ const source = this.map.getSource(this.key);
311
+ if (source) {
312
+ source.setCoordinates(extent);
313
+ }
314
+ }
315
+ return render;
316
+ }
317
+
318
+ /**
319
+ * Send the new BBOX to the websocket.
320
+ *
321
+ * @private
322
+ * @override
323
+ */
324
+ onMoveEnd() {
325
+ this.renderTrajectories();
326
+
327
+ if (this.visible && this.isUpdateBboxOnMoveEnd) {
328
+ this.setBbox();
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Update the cursor style when hovering a vehicle.
334
+ *
335
+ * @private
336
+ * @override
337
+ */
338
+ onFeatureHover(
339
+ features: Feature[],
340
+ layer: RealtimeLayer,
341
+ coordinate: Coordinate,
342
+ ) {
343
+ super.onFeatureHover(features, layer, coordinate);
344
+ this.map.getCanvasContainer().style.cursor = features.length
345
+ ? 'pointer'
346
+ : 'auto';
347
+ }
348
+ }
349
+
350
+ export default RealtimeLayer;
@@ -0,0 +1,21 @@
1
+ import { getWidth, getHeight } from 'ol/extent';
2
+ import { fromLonLat } from 'ol/proj';
3
+ import { AnyMapboxMap } from '../../types';
4
+
5
+ /**
6
+ * Get the current resolution of a Mapbox map.
7
+ * @param {mapboxgl.Map} map A map object.
8
+ * @private
9
+ */
10
+ const getMercatorResolution = (map: AnyMapboxMap) => {
11
+ const bounds = map.getBounds().toArray();
12
+ const a = fromLonLat(bounds[0]);
13
+ const b = fromLonLat(bounds[1]);
14
+ const extent = [...a, ...b];
15
+ const { width, height } = map.getCanvas();
16
+ const xResolution = getWidth(extent) / width;
17
+ const yResolution = getHeight(extent) / height;
18
+ return Math.max(xResolution, yResolution);
19
+ };
20
+
21
+ export default getMercatorResolution;
@@ -0,0 +1,34 @@
1
+ import { AnyMapboxMap } from '../../types';
2
+
3
+ /**
4
+ * Get the canvas source coordinates of the current map's extent.
5
+ * @param {mapboxgl.Map} map A map object.
6
+ * @private
7
+ */
8
+ export const getSourceCoordinates = (
9
+ map: AnyMapboxMap,
10
+ pixelRatio: number = 1,
11
+ ) => {
12
+ // Requesting getBounds is not enough when we rotate the map, so we request manually each corner.
13
+ const { width, height } = map.getCanvas();
14
+ // @ts-ignore
15
+ const leftTop = map.unproject({ x: 0, y: 0 });
16
+ // @ts-ignore
17
+ const leftBottom = map.unproject({ x: 0, y: height / pixelRatio }); // southWest
18
+
19
+ // @ts-ignore
20
+ const rightBottom = map.unproject({
21
+ x: width / pixelRatio,
22
+ y: height / pixelRatio,
23
+ });
24
+ // @ts-ignore
25
+ const rightTop = map.unproject({ x: width / pixelRatio, y: 0 }); // north east
26
+ return [
27
+ [leftTop.lng, leftTop.lat],
28
+ [rightTop.lng, rightTop.lat],
29
+ [rightBottom.lng, rightBottom.lat],
30
+ [leftBottom.lng, leftBottom.lat],
31
+ ];
32
+ };
33
+
34
+ export default getSourceCoordinates;
File without changes
@@ -0,0 +1,211 @@
1
+ import View from 'ol/View';
2
+ import Tile from 'ol/Tile';
3
+ import TileLayer from 'ol/layer/Tile';
4
+ import TileSource from 'ol/source/Tile';
5
+ import { createXYZ } from 'ol/tilegrid';
6
+ import { Map } from 'ol';
7
+ import Layer from '../layers/Layer';
8
+ import CopyrightControl from './CopyrightControl';
9
+
10
+ const tileLoadFunction = () => {
11
+ const tile = new Tile([0, 0, -1], 2 /* LOADED */);
12
+ tile.getImage = () => {
13
+ const image = new Image();
14
+ image.width = 256;
15
+ image.height = 256;
16
+ return image;
17
+ };
18
+ return tile;
19
+ };
20
+
21
+ const getOLTileLayer = () => {
22
+ const layer = new TileLayer({
23
+ source: new TileSource({
24
+ projection: 'EPSG:3857',
25
+ tileGrid: createXYZ(),
26
+ }),
27
+ });
28
+ layer.getSource().getTile = tileLoadFunction;
29
+ return layer;
30
+ };
31
+
32
+ const getLayer = (copyrights, visible = true) =>
33
+ new Layer({
34
+ visible,
35
+ copyrights,
36
+ olLayer: getOLTileLayer(),
37
+ });
38
+
39
+ describe('CopyrightControl', () => {
40
+ let map;
41
+
42
+ beforeEach(() => {
43
+ const target = document.createElement('div');
44
+ document.body.appendChild(target);
45
+ map = new Map({
46
+ target,
47
+ view: new View({
48
+ center: [0, 0],
49
+ zoom: 0,
50
+ }),
51
+ });
52
+ getLayer(true, 'bar').attachToMap(map);
53
+ map.setSize([200, 200]);
54
+ map.renderSync();
55
+ });
56
+
57
+ afterEach(() => {
58
+ if (map) {
59
+ map.setTarget(null);
60
+ map = null;
61
+ }
62
+ });
63
+
64
+ test('should be activate by default', () => {
65
+ const control = new CopyrightControl();
66
+ expect(control.active).toBe(true);
67
+ });
68
+
69
+ test('renders a string copyright', () => {
70
+ const control = new CopyrightControl();
71
+ control.attachToMap(map);
72
+ expect(control.element.innerHTML).toBe('');
73
+ getLayer('copyright').attachToMap(map);
74
+ map.renderSync();
75
+ expect(control.element.innerHTML).toBe('copyright');
76
+ });
77
+
78
+ test('renders an array of copyrights', () => {
79
+ const control = new CopyrightControl();
80
+ control.attachToMap(map);
81
+ expect(control.element.innerHTML).toBe('');
82
+ getLayer(['copyright 1', 'copyright 2']).attachToMap(map);
83
+ map.renderSync();
84
+ expect(control.element.innerHTML).toBe('copyright 1 | copyright 2');
85
+ });
86
+
87
+ test('renders unique copyrights', () => {
88
+ const control = new CopyrightControl();
89
+ control.attachToMap(map);
90
+ expect(control.element.innerHTML).toBe('');
91
+ getLayer(['copyright 1', 'copyright 2']).attachToMap(map);
92
+ getLayer('copyright 1').attachToMap(map);
93
+ getLayer(['copyright 2']).attachToMap(map);
94
+ map.renderSync();
95
+ expect(control.element.innerHTML).toBe('copyright 1 | copyright 2');
96
+ });
97
+
98
+ test("doesn't render copyright of an hidden layer", () => {
99
+ const control = new CopyrightControl();
100
+ control.attachToMap(map);
101
+ expect(control.element.innerHTML).toBe('');
102
+ const layer1 = getLayer('copyright hidden', false);
103
+ layer1.attachToMap(map);
104
+ const layer2 = getLayer('copyright', true);
105
+ layer2.attachToMap(map);
106
+ map.renderSync();
107
+ expect(control.element.innerHTML).toBe('copyright');
108
+
109
+ // the we update visibility of both layers
110
+ layer1.visible = true;
111
+ map.renderSync();
112
+ layer2.visible = false;
113
+ map.renderSync();
114
+ expect(control.element.innerHTML).toBe('copyright hidden');
115
+ });
116
+
117
+ test('should activate the control on construction then deactivate it', () => {
118
+ getLayer('copyright 1').attachToMap(map);
119
+ const control = new CopyrightControl({ active: true });
120
+ control.attachToMap(map);
121
+ map.renderSync();
122
+
123
+ expect(control.element.parentNode).toBe(map.getTargetElement());
124
+
125
+ // Should be activated by default.
126
+ expect(control.active).toBe(true);
127
+ expect(control.element.innerHTML).toBe('copyright 1');
128
+
129
+ // on deactivation
130
+ control.active = false;
131
+ map.renderSync();
132
+ expect(control.element.innerHTML).toBe('');
133
+ });
134
+
135
+ test('should deactivate the control on constrcution then activate it', () => {
136
+ getLayer('copyright 1').attachToMap(map);
137
+ const control = new CopyrightControl({ active: false });
138
+ control.attachToMap(map);
139
+ map.renderSync();
140
+
141
+ expect(control.element.parentNode).toBe(map.getTargetElement());
142
+
143
+ // Should be activated by default.
144
+ expect(control.active).toBe(false);
145
+ map.renderSync();
146
+ expect(control.element.innerHTML).toBe('');
147
+
148
+ // on deactivation
149
+ control.active = true;
150
+ map.renderSync();
151
+ expect(control.element.innerHTML).toBe('copyright 1');
152
+ });
153
+
154
+ test('should add copyrights in the map container element then remove it.', () => {
155
+ getLayer('copyright value').attachToMap(map);
156
+ map.renderSync();
157
+
158
+ const control = new CopyrightControl();
159
+
160
+ // Add control
161
+ control.attachToMap(map);
162
+ expect(control.element.parentNode).toBe(map.getTargetElement());
163
+
164
+ // Remove control
165
+ control.detachFromMap();
166
+ expect(control.element.parentNode).toBe(null);
167
+ });
168
+
169
+ test('should add copyrights in the target element then remove it.', () => {
170
+ getLayer(['copyright value']).attachToMap(map);
171
+ map.renderSync();
172
+
173
+ const target = document.createElement('div');
174
+ target.setAttribute('id', 'copyright');
175
+ document.body.appendChild(target);
176
+
177
+ const control = new CopyrightControl({
178
+ target: document.getElementById('copyright'),
179
+ });
180
+
181
+ // Add control
182
+ control.attachToMap(map);
183
+ expect(control.element.parentNode).toBe(target);
184
+
185
+ // Remove control
186
+ control.detachFromMap();
187
+ expect(control.element.parentNode).toBe(null);
188
+ });
189
+
190
+ test('renders custom copyrights with the render method ', () => {
191
+ const control = new CopyrightControl({
192
+ active: true,
193
+ render() {
194
+ if (!this.element) {
195
+ return;
196
+ }
197
+ this.element.innerHTML = this.active
198
+ ? this.getCopyrights().join(', ')
199
+ : '';
200
+ },
201
+ });
202
+ control.attachToMap(map);
203
+ getLayer(['copyright 1', 'copyright 2', 'copyright 3']).attachToMap(map);
204
+ map.renderSync();
205
+
206
+ // Add control
207
+ expect(control.element.innerHTML).toBe(
208
+ 'copyright 1, copyright 2, copyright 3',
209
+ );
210
+ });
211
+ });
@@ -0,0 +1,82 @@
1
+ import { MapEvent } from 'ol';
2
+ import { inView } from 'ol/layer/Layer';
3
+ import type { FrameState } from 'ol/Map';
4
+ import CopyrightControlCommon from '../../common/controls/CopyrightControlCommon';
5
+ import removeDuplicate from '../../common/utils/removeDuplicate';
6
+
7
+ /**
8
+ * Display layer's copyrights.
9
+ *
10
+ * @example
11
+ * import { Map } from 'ol';
12
+ * import { CopyrightControl } from 'mobility-toolbox-js/ol';
13
+ *
14
+ * const map = new Map({
15
+ * target: 'map',
16
+ * });
17
+ * const control = new CopyrightControl();
18
+ * control.attachToMap(map)
19
+ *
20
+ *
21
+ * @see <a href="/example/ol-copyright">Openlayers copyright example</a>
22
+ *
23
+ * @extends {CopyrightControlCommon}
24
+ */
25
+ class CopyrightControl extends CopyrightControlCommon {
26
+ frameState?: FrameState;
27
+
28
+ constructor(options: any) {
29
+ super(options);
30
+ this.onPostRender = this.onPostRender.bind(this);
31
+ }
32
+
33
+ getCopyrights() {
34
+ if (!this.frameState) {
35
+ return [];
36
+ }
37
+ let copyrights: string[] = [];
38
+
39
+ // This code loop comes mainly from ol.
40
+ this.frameState?.layerStatesArray.forEach((layerState: any) => {
41
+ const { layer } = layerState;
42
+ if (
43
+ this.frameState &&
44
+ inView(layerState, this.frameState.viewState) &&
45
+ layer &&
46
+ layer.getSource &&
47
+ layer.getSource() &&
48
+ layer.getSource().getAttributions()
49
+ ) {
50
+ copyrights = copyrights.concat(
51
+ layer.getSource().getAttributions()(this.frameState),
52
+ );
53
+ }
54
+ });
55
+ return removeDuplicate(copyrights);
56
+ }
57
+
58
+ activate() {
59
+ super.activate();
60
+ if (this.map) {
61
+ this.map.on('postrender', this.onPostRender);
62
+ }
63
+ }
64
+
65
+ deactivate() {
66
+ if (this.map) {
67
+ this.map.un('postrender', this.onPostRender);
68
+ }
69
+ }
70
+
71
+ onPostRender(evt: MapEvent) {
72
+ if (this.map && this.element) {
73
+ /**
74
+ * @private
75
+ */
76
+ this.frameState = evt.frameState || undefined;
77
+ this.render();
78
+ }
79
+ }
80
+ }
81
+
82
+ export default CopyrightControl;