mobility-toolbox-js 2.0.0-beta.8 → 2.0.1-beta.13

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 (304) hide show
  1. package/api/RoutingAPI.js +15 -0
  2. package/api/RoutingAPI.test.js +25 -0
  3. package/api/StopsAPI.js +12 -0
  4. package/api/StopsAPI.test.js +22 -0
  5. package/api/TralisAPI.js +359 -0
  6. package/api/TralisAPI.test.js +67 -0
  7. package/{src/api/tralis → api}/TralisAPIUtils.js +2 -32
  8. package/api/index.js +3 -0
  9. package/{index.html → api/typedefs.js} +0 -0
  10. package/common/Tracker.js +93 -0
  11. package/common/api/HttpAPI.js +30 -0
  12. package/common/api/HttpAPI.test.js +50 -0
  13. package/common/api/WebSocketAPI.js +175 -0
  14. package/{src/api/tralis/WebSocketConnector.test.js → common/api/WebSocketAPI.test.js} +100 -145
  15. package/common/controls/Control.js +81 -0
  16. package/{src/common → common}/controls/Control.test.js +32 -43
  17. package/common/index.js +4 -0
  18. package/common/layers/Layer.js +213 -0
  19. package/{src/common → common}/layers/Layer.test.js +185 -244
  20. package/common/mixins/CopyrightMixin.js +24 -0
  21. package/common/mixins/SearchMixin.js +110 -0
  22. package/common/mixins/TralisLayerMixin.js +479 -0
  23. package/common/styles/index.js +4 -0
  24. package/{src/common → common}/styles/trackerDefaultStyle.js +39 -175
  25. package/common/styles/trackerDelayStyle.js +8 -0
  26. package/{src/common → common}/styles/trackerSimpleStyle.js +4 -8
  27. package/{src/common → common}/trackerConfig.js +61 -99
  28. package/common/trackerConfig.test.js +23 -0
  29. package/{src/doc/examples/ol-mapbox-layer.md → common/typedefs.js} +0 -0
  30. package/common/utils/createTrackerFilters.js +56 -0
  31. package/common/utils/createTrackerFilters.test.js +79 -0
  32. package/{src/common → common}/utils/getMapboxMapCopyrights.js +3 -16
  33. package/common/utils/getMapboxMapCopyrights.test.js +40 -0
  34. package/{src/common → common}/utils/getMapboxStyleUrl.js +3 -13
  35. package/{src/common → common}/utils/getVehiclePosition.js +3 -33
  36. package/common/utils/index.js +5 -0
  37. package/common/utils/removeDuplicate.js +8 -0
  38. package/common/utils/removeDuplicate.test.js +19 -0
  39. package/{src/common → common}/utils/sortByDelay.js +2 -7
  40. package/common/utils/timeUtils.js +20 -0
  41. package/common/utils/timeUtils.test.js +10 -0
  42. package/index.js +8 -0
  43. package/mapbox/controls/CopyrightControl.js +29 -0
  44. package/mapbox/controls/index.js +1 -0
  45. package/mapbox/index.js +4 -0
  46. package/mapbox/layers/Layer.js +57 -0
  47. package/mapbox/layers/Layer.test.js +182 -0
  48. package/mapbox/layers/TralisLayer.js +182 -0
  49. package/{src/mapbox → mapbox}/layers/TralisLayer.test.js +12 -14
  50. package/mapbox/layers/index.js +2 -0
  51. package/{src/mapbox → mapbox}/utils.js +7 -21
  52. package/mbt.js +50444 -0
  53. package/mbt.js.map +7 -0
  54. package/mbt.min.js +1005 -0
  55. package/mbt.min.js.map +7 -0
  56. package/ol/controls/CopyrightControl.js +42 -0
  57. package/ol/controls/CopyrightControl.test.js +165 -0
  58. package/ol/controls/RoutingControl.js +387 -0
  59. package/ol/controls/RoutingControl.test.js +151 -0
  60. package/ol/controls/StopFinderControl.js +10 -0
  61. package/ol/controls/StopFinderControl.test.js +48 -0
  62. package/ol/controls/index.js +3 -0
  63. package/ol/index.js +5 -0
  64. package/ol/layers/Layer.js +88 -0
  65. package/ol/layers/Layer.test.js +174 -0
  66. package/ol/layers/MapboxLayer.js +203 -0
  67. package/{src/ol → ol}/layers/MapboxLayer.test.js +58 -84
  68. package/ol/layers/MapboxStyleLayer.js +187 -0
  69. package/{src/ol → ol}/layers/MapboxStyleLayer.test.js +97 -128
  70. package/ol/layers/MaplibreLayer.js +139 -0
  71. package/ol/layers/RoutingLayer.js +61 -0
  72. package/{src/ol → ol}/layers/RoutingLayer.test.js +15 -24
  73. package/ol/layers/TralisLayer.js +185 -0
  74. package/ol/layers/TralisLayer.test.js +79 -0
  75. package/ol/layers/VectorLayer.js +22 -0
  76. package/{src/ol → ol}/layers/VectorLayer.test.js +34 -45
  77. package/ol/layers/WMSLayer.js +38 -0
  78. package/ol/layers/WMSLayer.test.js +76 -0
  79. package/ol/layers/index.js +8 -0
  80. package/{src/ol → ol}/styles/fullTrajectoryDelayStyle.js +11 -15
  81. package/ol/styles/fullTrajectoryStyle.js +43 -0
  82. package/ol/styles/index.js +2 -0
  83. package/package.json +34 -74
  84. package/.babelrc +0 -6
  85. package/.esdoc.json +0 -17
  86. package/.eslintignore +0 -1
  87. package/.github/workflows/conventional-pr-title.yml +0 -21
  88. package/.github/workflows/cypress.yml +0 -29
  89. package/.github/workflows/nodejs.yml +0 -28
  90. package/.husky/commit-msg +0 -4
  91. package/.husky/post-checkout +0 -4
  92. package/.husky/post-merge +0 -4
  93. package/.husky/post-rebase +0 -4
  94. package/.husky/pre-commit +0 -4
  95. package/.neutrinorc.js +0 -176
  96. package/.nvmrc +0 -1
  97. package/CHANGELOG.md +0 -10
  98. package/LICENSE +0 -21
  99. package/__mocks__/mapbox-gl.js +0 -81
  100. package/__mocks__/maplibre-gl.js +0 -81
  101. package/commitlint.config.js +0 -1
  102. package/cypress/fixtures/example.json +0 -5
  103. package/cypress/integration/examples/api.spec.js +0 -7
  104. package/cypress/integration/examples/examples.spec.js +0 -7
  105. package/cypress/integration/examples/navigation.spec.js +0 -29
  106. package/cypress/plugins/index.js +0 -21
  107. package/cypress/support/commands.js +0 -25
  108. package/cypress/support/index.js +0 -20
  109. package/cypress.json +0 -4
  110. package/data/fetchRoute.json +0 -292
  111. package/data/fetchTrajectories.json +0 -18
  112. package/data/fetchTrajectoryById.json +0 -3
  113. package/data/fetchTrajectoryStations.json +0 -18
  114. package/data/stopsSearch.json +0 -15
  115. package/documentation.yml +0 -4
  116. package/esdoc/README.md +0 -27
  117. package/esdoc/plugins/MyPlugin.js +0 -69
  118. package/esdoc/plugins/dynamic-property-plugin/Plugin.js +0 -50
  119. package/esdoc/plugins/externals-plugin/Plugin.js +0 -45
  120. package/esdoc/plugins/externals-plugin/externals.js +0 -96
  121. package/global-setup.js +0 -3
  122. package/indexweb.html +0 -49
  123. package/jest.config.js +0 -5
  124. package/pull_request_template.md +0 -17
  125. package/renovate.json +0 -4
  126. package/scripts/read-pkg-json.js +0 -22
  127. package/src/api/index.js +0 -3
  128. package/src/api/routing/RoutingAPI.js +0 -44
  129. package/src/api/routing/RoutingAPI.test.js +0 -41
  130. package/src/api/stops/StopsAPI.js +0 -41
  131. package/src/api/stops/StopsAPI.test.js +0 -34
  132. package/src/api/tralis/TralisAPI.js +0 -731
  133. package/src/api/tralis/TralisAPI.test.js +0 -75
  134. package/src/api/tralis/WebSocketConnector.js +0 -338
  135. package/src/api/tralis/typedefs.js +0 -81
  136. package/src/assets/Lato-Black.ttf +0 -0
  137. package/src/assets/Lato-BlackItalic.ttf +0 -0
  138. package/src/assets/Lato-Bold.ttf +0 -0
  139. package/src/assets/Lato-BoldItalic.ttf +0 -0
  140. package/src/assets/Lato-Italic.ttf +0 -0
  141. package/src/assets/Lato-Light.ttf +0 -0
  142. package/src/assets/Lato-LightItalic.ttf +0 -0
  143. package/src/assets/Lato-Regular.ttf +0 -0
  144. package/src/assets/Lato-Thin.ttf +0 -0
  145. package/src/assets/Lato-ThinItalic.ttf +0 -0
  146. package/src/assets/OFL.txt +0 -93
  147. package/src/common/Tracker.js +0 -197
  148. package/src/common/api/api.js +0 -64
  149. package/src/common/api/api.test.js +0 -68
  150. package/src/common/controls/Control.js +0 -146
  151. package/src/common/index.js +0 -5
  152. package/src/common/layers/Layer.js +0 -404
  153. package/src/common/mixins/CopyrightMixin.js +0 -48
  154. package/src/common/mixins/SearchMixin.js +0 -176
  155. package/src/common/mixins/TralisLayerMixin.js +0 -930
  156. package/src/common/styles/index.js +0 -4
  157. package/src/common/styles/trackerDelayStyle.js +0 -17
  158. package/src/common/trackerConfig.test.js +0 -25
  159. package/src/common/typedefs.js +0 -23
  160. package/src/common/utils/createTrackerFilters.js +0 -87
  161. package/src/common/utils/createTrackerFilters.test.js +0 -95
  162. package/src/common/utils/getMapboxMapCopyrights.test.js +0 -47
  163. package/src/common/utils/index.js +0 -5
  164. package/src/common/utils/removeDuplicate.js +0 -22
  165. package/src/common/utils/removeDuplicate.test.js +0 -22
  166. package/src/common/utils/timeUtils.js +0 -44
  167. package/src/common/utils/timeUtils.test.js +0 -16
  168. package/src/doc/App.js +0 -116
  169. package/src/doc/App.scss +0 -51
  170. package/src/doc/_redirects +0 -2
  171. package/src/doc/components/CodeSandboxButton.js +0 -103
  172. package/src/doc/components/Documentation.js +0 -40
  173. package/src/doc/components/Esdoc/Anchor.js +0 -57
  174. package/src/doc/components/Esdoc/ClassDoc.js +0 -272
  175. package/src/doc/components/Esdoc/DeprecatedHTML.js +0 -16
  176. package/src/doc/components/Esdoc/DetailDocs.js +0 -281
  177. package/src/doc/components/Esdoc/DetailHTML.js +0 -33
  178. package/src/doc/components/Esdoc/DirectSubclassHTML.js +0 -30
  179. package/src/doc/components/Esdoc/DocBuilderUtils.js +0 -694
  180. package/src/doc/components/Esdoc/DocLinkHTML.js +0 -62
  181. package/src/doc/components/Esdoc/DocsLinkHTML.js +0 -38
  182. package/src/doc/components/Esdoc/Esdoc.js +0 -63
  183. package/src/doc/components/Esdoc/EsdocContent.js +0 -51
  184. package/src/doc/components/Esdoc/EsdocNavigation.js +0 -13
  185. package/src/doc/components/Esdoc/EsdocSearch.js +0 -81
  186. package/src/doc/components/Esdoc/ExperimentalHTML.js +0 -17
  187. package/src/doc/components/Esdoc/ExtendsChainHTML.js +0 -32
  188. package/src/doc/components/Esdoc/FileDocLinkHTML.js +0 -60
  189. package/src/doc/components/Esdoc/IdentifiersDoc.js +0 -113
  190. package/src/doc/components/Esdoc/IndirectSubclassHTML.js +0 -30
  191. package/src/doc/components/Esdoc/InheritedSummaryDoc.js +0 -70
  192. package/src/doc/components/Esdoc/InheritedSummaryHTML.js +0 -38
  193. package/src/doc/components/Esdoc/MixinClassesHTML.js +0 -29
  194. package/src/doc/components/Esdoc/NavDoc.js +0 -112
  195. package/src/doc/components/Esdoc/OverrideMethod.js +0 -44
  196. package/src/doc/components/Esdoc/OverrideMethodDescription.js +0 -35
  197. package/src/doc/components/Esdoc/Properties.js +0 -89
  198. package/src/doc/components/Esdoc/README.md +0 -45
  199. package/src/doc/components/Esdoc/SignatureHTML.js +0 -123
  200. package/src/doc/components/Esdoc/SingleDoc.js +0 -31
  201. package/src/doc/components/Esdoc/SummaryDoc.js +0 -160
  202. package/src/doc/components/Esdoc/SummaryHTML.js +0 -96
  203. package/src/doc/components/Esdoc/TypeDocLinkHTML.js +0 -249
  204. package/src/doc/components/Esdoc/css/identifiers.css +0 -38
  205. package/src/doc/components/Esdoc/css/search.css +0 -76
  206. package/src/doc/components/Esdoc/css/style.css +0 -603
  207. package/src/doc/components/Esdoc/index.js +0 -7
  208. package/src/doc/components/Example.js +0 -153
  209. package/src/doc/components/Examples.js +0 -183
  210. package/src/doc/components/Home.js +0 -106
  211. package/src/doc/components/TrackerExample.js +0 -38
  212. package/src/doc/examples/assets/tralis-live-map/index.js +0 -11
  213. package/src/doc/examples/assets/tralis-live-map/s1kreis.svg +0 -105
  214. package/src/doc/examples/assets/tralis-live-map/s20kreis.svg +0 -101
  215. package/src/doc/examples/assets/tralis-live-map/s2kreis.svg +0 -95
  216. package/src/doc/examples/assets/tralis-live-map/s3kreis.svg +0 -95
  217. package/src/doc/examples/assets/tralis-live-map/s4kreis.svg +0 -95
  218. package/src/doc/examples/assets/tralis-live-map/s6kreis.svg +0 -95
  219. package/src/doc/examples/assets/tralis-live-map/s7kreis.svg +0 -95
  220. package/src/doc/examples/assets/tralis-live-map/s8kreis.svg +0 -93
  221. package/src/doc/examples/assets/tralis-live-map/unknown.svg +0 -107
  222. package/src/doc/examples/mb-copyright.html +0 -26
  223. package/src/doc/examples/mb-copyright.js +0 -37
  224. package/src/doc/examples/mb-tracker.html +0 -1
  225. package/src/doc/examples/mb-tracker.js +0 -39
  226. package/src/doc/examples/mb-tracker.md +0 -1
  227. package/src/doc/examples/mb-tralis.html +0 -1
  228. package/src/doc/examples/mb-tralis.js +0 -34
  229. package/src/doc/examples/ol-copyright.html +0 -26
  230. package/src/doc/examples/ol-copyright.js +0 -43
  231. package/src/doc/examples/ol-mapbox-layer.html +0 -1
  232. package/src/doc/examples/ol-mapbox-layer.js +0 -28
  233. package/src/doc/examples/ol-mapbox-style-layer.html +0 -12
  234. package/src/doc/examples/ol-mapbox-style-layer.js +0 -44
  235. package/src/doc/examples/ol-query.html +0 -32
  236. package/src/doc/examples/ol-query.js +0 -83
  237. package/src/doc/examples/ol-routing.html +0 -26
  238. package/src/doc/examples/ol-routing.js +0 -59
  239. package/src/doc/examples/ol-routing.md +0 -1
  240. package/src/doc/examples/ol-stop-finder.html +0 -15
  241. package/src/doc/examples/ol-stop-finder.js +0 -31
  242. package/src/doc/examples/ol-stop-finder.md +0 -1
  243. package/src/doc/examples/ol-tracker.html +0 -1
  244. package/src/doc/examples/ol-tracker.js +0 -44
  245. package/src/doc/examples/ol-tracker.md +0 -1
  246. package/src/doc/examples/ol-tralis.html +0 -5
  247. package/src/doc/examples/ol-tralis.js +0 -57
  248. package/src/doc/examples/tralis-live-map.html +0 -1
  249. package/src/doc/examples/tralis-live-map.js +0 -51
  250. package/src/doc/examples/tralis-live-map.md +0 -3
  251. package/src/doc/examples.js +0 -107
  252. package/src/doc/img/examples/live_tracker_mb.jpg +0 -0
  253. package/src/doc/img/examples/live_tracker_munich.jpg +0 -0
  254. package/src/doc/img/examples/live_tracker_ol.jpg +0 -0
  255. package/src/doc/img/examples/mapbox.jpg +0 -0
  256. package/src/doc/img/examples/mapbox_style.jpg +0 -0
  257. package/src/doc/img/examples/ol-copyright.png +0 -0
  258. package/src/doc/img/examples/query_objects.jpg +0 -0
  259. package/src/doc/img/examples/routing.jpg +0 -0
  260. package/src/doc/img/examples/simple_map.jpg +0 -0
  261. package/src/doc/img/examples/stops.jpg +0 -0
  262. package/src/doc/img/favico.ico +0 -0
  263. package/src/doc/index.js +0 -21
  264. package/src/iife.js +0 -7
  265. package/src/index.js +0 -10
  266. package/src/mapbox/controls/CopyrightControl.js +0 -58
  267. package/src/mapbox/controls/index.js +0 -2
  268. package/src/mapbox/index.js +0 -4
  269. package/src/mapbox/layers/Layer.js +0 -118
  270. package/src/mapbox/layers/Layer.test.js +0 -202
  271. package/src/mapbox/layers/TralisLayer.js +0 -329
  272. package/src/mapbox/layers/index.js +0 -2
  273. package/src/ol/README.md +0 -0
  274. package/src/ol/controls/CopyrightControl.js +0 -80
  275. package/src/ol/controls/CopyrightControl.test.js +0 -211
  276. package/src/ol/controls/RoutingControl.js +0 -752
  277. package/src/ol/controls/RoutingControl.test.js +0 -216
  278. package/src/ol/controls/StopFinderControl.js +0 -38
  279. package/src/ol/controls/StopFinderControl.test.js +0 -59
  280. package/src/ol/controls/index.js +0 -3
  281. package/src/ol/controls/snapshots/RoutingControlRouteGen10.json +0 -58
  282. package/src/ol/controls/snapshots/RoutingControlRouteGen100.json +0 -292
  283. package/src/ol/controls/snapshots/RoutingControlRouteGen30.json +0 -69
  284. package/src/ol/controls/snapshots/RoutingControlRouteGen5.json +0 -58
  285. package/src/ol/controls/snapshots/RoutingControlRouteOSM.json +0 -759
  286. package/src/ol/controls/snapshots/RoutingControlStation1.json +0 -60
  287. package/src/ol/controls/snapshots/RoutingControlStation2.json +0 -49
  288. package/src/ol/index.js +0 -5
  289. package/src/ol/layers/Layer.js +0 -193
  290. package/src/ol/layers/Layer.test.js +0 -197
  291. package/src/ol/layers/MapboxLayer.js +0 -378
  292. package/src/ol/layers/MapboxStyleLayer.js +0 -417
  293. package/src/ol/layers/MaplibreLayer.js +0 -280
  294. package/src/ol/layers/RoutingLayer.js +0 -91
  295. package/src/ol/layers/TralisLayer.js +0 -359
  296. package/src/ol/layers/TralisLayer.test.js +0 -97
  297. package/src/ol/layers/VectorLayer.js +0 -43
  298. package/src/ol/layers/WMSLayer.js +0 -80
  299. package/src/ol/layers/WMSLayer.test.js +0 -84
  300. package/src/ol/layers/index.js +0 -8
  301. package/src/ol/styles/fullTrajectoryStyle.js +0 -51
  302. package/src/ol/styles/index.js +0 -2
  303. package/src/setupTests.js +0 -15
  304. package/webpack.config.js +0 -6
@@ -1,180 +1,162 @@
1
- import OlMap from 'ol/Map';
2
- import View from 'ol/View';
3
- import gllib from 'maplibre-gl';
4
- import Layer from './Layer';
5
- import MaplibreLayer from './MaplibreLayer';
6
- import MapboxStyleLayer from './MapboxStyleLayer';
7
-
1
+ import OlMap from "ol/Map";
2
+ import View from "ol/View";
3
+ import gllib from "maplibre-gl";
4
+ import Layer from "./Layer";
5
+ import MaplibreLayer from "./MaplibreLayer";
6
+ import MapboxStyleLayer from "./MapboxStyleLayer";
8
7
  let source;
9
8
  let layer;
10
9
  let map;
11
10
  let onClick;
12
-
13
11
  const styleLayer = {
14
- id: 'layer',
12
+ id: "layer"
15
13
  };
16
-
17
- describe('MapboxStyleLayer', () => {
14
+ describe("MapboxStyleLayer", () => {
18
15
  beforeEach(() => {
19
16
  onClick = jest.fn();
20
17
  source = new MaplibreLayer({
21
- name: 'Layer',
22
- apiKey: false,
18
+ name: "Layer",
19
+ apiKey: false
23
20
  });
24
21
  layer = new MapboxStyleLayer({
25
- name: 'mapbox layer',
22
+ name: "mapbox layer",
26
23
  visible: true,
27
24
  mapboxLayer: source,
28
25
  styleLayer,
29
- onClick,
26
+ onClick
30
27
  });
31
28
  map = new OlMap({
32
- target: document.createElement('div'),
33
- view: new View({ center: [0, 0] }),
29
+ target: document.createElement("div"),
30
+ view: new View({ center: [0, 0] })
34
31
  });
35
32
  });
36
-
37
33
  afterEach(() => {
38
34
  if (layer.map) {
39
- layer.terminate(map);
35
+ layer.detachFromMap(map);
40
36
  }
41
37
  if (source.map) {
42
- source.terminate(map);
38
+ source.detachFromMap(map);
43
39
  }
44
40
  });
45
-
46
- test('should be instanced.', () => {
41
+ test("should be instanced.", () => {
47
42
  expect(layer).toBeInstanceOf(MapboxStyleLayer);
48
43
  expect(layer.styleLayers[0]).toBe(styleLayer);
49
44
  expect(layer.clickCallbacks[0]).toBe(onClick);
50
45
  });
51
-
52
- test('should not initalized mapbox map.', () => {
53
- layer.init();
46
+ test("should not initalized mapbox map.", () => {
47
+ layer.attachToMap();
54
48
  expect(layer.mbMap).toBe();
55
- layer.terminate();
49
+ layer.detachFromMap();
56
50
  });
57
-
58
- test('should initalized mapbox map.', () => {
59
- source.init(map);
60
- layer.init(map);
51
+ test("should initalized mapbox map.", () => {
52
+ source.attachToMap(map);
53
+ layer.attachToMap(map);
61
54
  expect(layer.mapboxLayer.mbMap).toBeInstanceOf(gllib.Map);
62
- layer.terminate();
63
- source.terminate();
55
+ layer.detachFromMap();
56
+ source.detachFromMap();
64
57
  });
65
-
66
- test('should add onClick callback.', () => {
58
+ test("should add onClick callback.", () => {
67
59
  const onClick2 = jest.fn();
68
60
  layer.onClick(onClick2);
69
61
  expect(layer.clickCallbacks[1]).toBe(onClick2);
70
62
  });
71
-
72
- test('should called terminate on initalization.', () => {
73
- const spy = jest.spyOn(layer, 'terminate');
74
- layer.init();
63
+ test("should called terminate on initalization.", () => {
64
+ const spy = jest.spyOn(layer, "detachFromMap");
65
+ layer.attachToMap();
75
66
  expect(spy).toHaveBeenCalledTimes(1);
76
- layer.terminate(map);
67
+ layer.detachFromMap(map);
77
68
  });
78
-
79
- test('should return coordinates, features and a layer instance.', async () => {
80
- source.init(map);
81
- layer.init(map);
69
+ test("should return coordinates, features and a layer instance.", async () => {
70
+ source.attachToMap(map);
71
+ layer.attachToMap(map);
82
72
  const data = await layer.getFeatureInfoAtCoordinate([50, 50]);
83
73
  expect(data.coordinate).toEqual([50, 50]);
84
74
  expect(data.features).toEqual([]);
85
75
  expect(data.layer).toBeInstanceOf(MapboxStyleLayer);
86
- layer.terminate(map);
87
- source.terminate(map);
76
+ layer.detachFromMap(map);
77
+ source.detachFromMap(map);
88
78
  });
89
-
90
- test('should call onClick callback', async () => {
79
+ test("should call onClick callback", async () => {
91
80
  const coordinate = [500, 500];
92
81
  const features = [];
93
- const evt = { type: 'singleclick', map, coordinate };
94
- layer.init(map);
82
+ const evt = { type: "singleclick", map, coordinate };
83
+ layer.attachToMap(map);
95
84
  expect(onClick).toHaveBeenCalledTimes(0);
96
85
  await map.dispatchEvent(evt);
97
86
  expect(onClick).toHaveBeenCalledTimes(1);
98
87
  expect(onClick).toHaveBeenCalledWith(features, layer, coordinate);
99
- layer.terminate();
88
+ layer.detachFromMap();
100
89
  });
101
-
102
- test('should call super class terminate function.', () => {
103
- layer.init(map);
104
- const spy = jest.spyOn(Layer.prototype, 'terminate');
105
- layer.terminate(map);
90
+ test("should call super class terminate function.", () => {
91
+ layer.attachToMap(map);
92
+ const spy = jest.spyOn(Layer.prototype, "detachFromMap");
93
+ layer.detachFromMap(map);
106
94
  expect(spy).toHaveBeenCalledTimes(1);
107
95
  spy.mockRestore();
108
96
  });
109
-
110
- test('should call super class terminate if the mapboxLayer associated has been terminated before.', () => {
111
- layer.init(map);
112
- source.terminate(map);
113
- const spy = jest.spyOn(Layer.prototype, 'terminate');
114
- layer.terminate(map);
97
+ test("should call super class terminate if the mapboxLayer associated has been terminated before.", () => {
98
+ layer.attachToMap(map);
99
+ source.detachFromMap(map);
100
+ const spy = jest.spyOn(Layer.prototype, "detachFromMap");
101
+ layer.detachFromMap(map);
115
102
  expect(spy).toHaveBeenCalledTimes(1);
116
103
  spy.mockRestore();
117
104
  });
118
-
119
- test('should clone', () => {
120
- const clone = layer.clone({ name: 'clone' });
105
+ test("should clone", () => {
106
+ const clone = layer.clone({ name: "clone" });
121
107
  expect(clone).not.toBe(layer);
122
- expect(clone.name).toBe('clone');
108
+ expect(clone.name).toBe("clone");
123
109
  expect(clone).toBeInstanceOf(MapboxStyleLayer);
124
110
  });
125
-
126
- test('should add layer on load', () => {
111
+ test("should add layer on load", () => {
127
112
  const style = { layers: [] };
128
113
  layer.mapboxLayer.mbMap = {
129
114
  getStyle: () => style,
130
115
  getSource: () => ({}),
131
116
  getLayer: () => null,
132
117
  setLayoutProperty: () => null,
133
- addLayer: (styleLayerr) => style.layers.push(styleLayerr),
118
+ addLayer: (styleLayerr) => style.layers.push(styleLayerr)
134
119
  };
135
120
  layer.onLoad();
136
121
  expect(style.layers[0]).toBe(styleLayer);
137
122
  });
138
-
139
- describe('should set disabled property to false on load', () => {
140
- test('when layer uses styleLayer property', () => {
123
+ describe("should set disabled property to false on load", () => {
124
+ test("when layer uses styleLayer property", () => {
141
125
  const styles = { layers: [] };
142
126
  layer.mapboxLayer.mbMap = {
143
127
  getStyle: () => styles,
144
128
  getSource: () => ({}),
145
129
  getLayer: () => null,
146
130
  setLayoutProperty: () => null,
147
- addLayer: (styleLayerr) => styles.layers.push(styleLayerr),
131
+ addLayer: (styleLayerr) => styles.layers.push(styleLayerr)
148
132
  };
149
133
  expect(layer).toBeInstanceOf(MapboxStyleLayer);
150
134
  layer.onLoad();
151
135
  expect(layer.disabled).toBe(false);
152
136
  });
153
137
  });
154
-
155
- describe('should set disabled property to true on load', () => {
156
- test('when layer uses styleLayersFilter property', () => {
138
+ describe("should set disabled property to true on load", () => {
139
+ test("when layer uses styleLayersFilter property", () => {
157
140
  const styles = { layers: [styleLayer] };
158
141
  const layer2 = new MapboxStyleLayer({
159
- name: 'mapbox layer',
142
+ name: "mapbox layer",
160
143
  mapboxLayer: source,
161
- styleLayersFilter: () => false,
144
+ styleLayersFilter: () => false
162
145
  });
163
146
  layer2.mapboxLayer.mbMap = {
164
147
  getStyle: () => styles,
165
148
  getSource: () => ({}),
166
149
  getLayer: () => null,
167
150
  setLayoutProperty: () => null,
168
- addLayer: () => ({}),
151
+ addLayer: () => ({})
169
152
  };
170
153
  layer2.onLoad();
171
154
  expect(layer2.disabled).toBe(true);
172
155
  });
173
156
  });
174
-
175
- describe('#getFeatureInfoAtCoordinate()', () => {
157
+ describe("#getFeatureInfoAtCoordinate()", () => {
176
158
  beforeEach(() => {
177
- source.init(map);
159
+ source.attachToMap(map);
178
160
  source.mbMap.isStyleLoaded = jest.fn(() => true);
179
161
  source.mbMap.getSource = jest.fn(() => true);
180
162
  });
@@ -182,78 +164,65 @@ describe('MapboxStyleLayer', () => {
182
164
  source.mbMap.getSource.mockRestore();
183
165
  source.mbMap.isStyleLoaded.mockRestore();
184
166
  });
185
-
186
- test('should request features on layers ids from styleLayers property', () => {
167
+ test("should request features on layers ids from styleLayers property", () => {
187
168
  source.mbMap.getStyle = jest.fn(() => ({
188
- layers: [{ id: 'foo' }, { id: 'layer' }, { id: 'bar' }],
169
+ layers: [{ id: "foo" }, { id: "layer" }, { id: "bar" }]
189
170
  }));
190
- layer.init(map);
191
- layer.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() =>
192
- Promise.resolve({ features: [] }),
193
- );
194
- layer.getFeatureInfoAtCoordinate([0, 0]).then(() => {});
195
- expect(layer.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith(
196
- [0, 0],
197
- { layers: ['layer'], validate: false },
198
- );
171
+ layer.attachToMap(map);
172
+ layer.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() => Promise.resolve({ features: [] }));
173
+ layer.getFeatureInfoAtCoordinate([0, 0]).then(() => {
174
+ });
175
+ expect(layer.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith([0, 0], { layers: ["layer"], validate: false });
199
176
  layer.mapboxLayer.getFeatureInfoAtCoordinate.mockRestore();
200
177
  source.mbMap.getStyle.mockRestore();
201
178
  });
202
-
203
- test('should request features on layers ids from styleLayersFilter property', () => {
179
+ test("should request features on layers ids from styleLayersFilter property", () => {
204
180
  source.mbMap.getStyle = jest.fn(() => ({
205
- layers: [{ id: 'foo' }, { id: 'layer' }, { id: 'bar' }, { id: 'foo2' }],
181
+ layers: [{ id: "foo" }, { id: "layer" }, { id: "bar" }, { id: "foo2" }]
206
182
  }));
207
183
  const layer2 = new MapboxStyleLayer({
208
- name: 'mapbox layer',
184
+ name: "mapbox layer",
209
185
  visible: true,
210
186
  mapboxLayer: source,
211
187
  styleLayer,
212
- styleLayersFilter: ({ id }) => /foo/.test(id),
188
+ styleLayersFilter: ({ id }) => /foo/.test(id)
213
189
  });
214
- layer2.init(map);
215
- layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() =>
216
- Promise.resolve({ features: [] }),
217
- );
218
- layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {});
219
- expect(
220
- layer2.mapboxLayer.getFeatureInfoAtCoordinate,
221
- ).toHaveBeenCalledWith([0, 0], {
222
- layers: ['foo', 'foo2'],
223
- validate: false,
190
+ layer2.attachToMap(map);
191
+ layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() => Promise.resolve({ features: [] }));
192
+ layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {
193
+ });
194
+ expect(layer2.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith([0, 0], {
195
+ layers: ["foo", "foo2"],
196
+ validate: false
224
197
  });
225
198
  layer2.mapboxLayer.getFeatureInfoAtCoordinate.mockRestore();
226
199
  source.mbMap.getStyle.mockRestore();
227
200
  });
228
-
229
- test('should request features on layers ids from queryRenderedLayersFilter property', () => {
201
+ test("should request features on layers ids from queryRenderedLayersFilter property", () => {
230
202
  source.mbMap.getStyle = jest.fn(() => ({
231
203
  layers: [
232
- { id: 'foo' },
233
- { id: 'bar2' },
234
- { id: 'layer' },
235
- { id: 'bar' },
236
- { id: 'foo2' },
237
- ],
204
+ { id: "foo" },
205
+ { id: "bar2" },
206
+ { id: "layer" },
207
+ { id: "bar" },
208
+ { id: "foo2" }
209
+ ]
238
210
  }));
239
211
  const layer2 = new MapboxStyleLayer({
240
- name: 'mapbox layer',
212
+ name: "mapbox layer",
241
213
  visible: true,
242
214
  mapboxLayer: source,
243
215
  styleLayer,
244
216
  styleLayersFilter: ({ id }) => /foo/.test(id),
245
- queryRenderedLayersFilter: ({ id }) => /bar/.test(id),
217
+ queryRenderedLayersFilter: ({ id }) => /bar/.test(id)
218
+ });
219
+ layer2.attachToMap(map);
220
+ layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() => Promise.resolve({ features: [] }));
221
+ layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {
246
222
  });
247
- layer2.init(map);
248
- layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() =>
249
- Promise.resolve({ features: [] }),
250
- );
251
- layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {});
252
- expect(
253
- layer2.mapboxLayer.getFeatureInfoAtCoordinate,
254
- ).toHaveBeenCalledWith([0, 0], {
255
- layers: ['bar2', 'bar'],
256
- validate: false,
223
+ expect(layer2.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith([0, 0], {
224
+ layers: ["bar2", "bar"],
225
+ validate: false
257
226
  });
258
227
  layer2.mapboxLayer.getFeatureInfoAtCoordinate.mockRestore();
259
228
  source.mbMap.getStyle.mockRestore();
@@ -0,0 +1,139 @@
1
+ import { toLonLat } from "ol/proj";
2
+ import { Map } from "maplibre-gl";
3
+ import Source from "ol/source/Source";
4
+ import OLLayer from "ol/layer/Layer";
5
+ import GeoJSON from "ol/format/GeoJSON";
6
+ import { toDegrees } from "ol/math";
7
+ import Layer from "./Layer";
8
+ import { getMapboxMapCopyrights, getMapboxStyleUrl } from "../../common/utils";
9
+ export default class MaplibreLayer extends Layer {
10
+ constructor(options = {}) {
11
+ const mbLayer = new OLLayer({
12
+ source: new Source({}),
13
+ render: (frameState) => {
14
+ if (!this.mbMap) {
15
+ console.warn("Mapbox map doesn't exist.");
16
+ return null;
17
+ }
18
+ const canvas = this.mbMap.getCanvas();
19
+ const { viewState } = frameState;
20
+ const opacity = this.olLayer.getOpacity();
21
+ canvas.style.opacity = opacity;
22
+ this.mbMap.jumpTo({
23
+ center: toLonLat(viewState.center),
24
+ zoom: viewState.zoom - 1,
25
+ bearing: toDegrees(-viewState.rotation),
26
+ animate: false
27
+ });
28
+ if (!canvas.isConnected) {
29
+ this.map.render();
30
+ } else if (canvas.width !== frameState.size[0] || canvas.height !== frameState.size[1]) {
31
+ this.mbMap.resize();
32
+ }
33
+ this.mbMap.redraw();
34
+ return this.mbMap.getContainer();
35
+ }
36
+ });
37
+ super({
38
+ ...options,
39
+ olLayer: mbLayer
40
+ });
41
+ this.styleUrl = options.url;
42
+ this.apiKey = options.apiKey;
43
+ this.apiKeyName = options.apiKeyName || "key";
44
+ this.updateAttribution = this.updateAttribution.bind(this);
45
+ }
46
+ attachToMap(map) {
47
+ super.attachToMap(map);
48
+ if (!this.map) {
49
+ return;
50
+ }
51
+ this.format = new GeoJSON({
52
+ featureProjection: this.map.getView().getProjection()
53
+ });
54
+ this.loadMbMap();
55
+ }
56
+ detachFromMap() {
57
+ if (this.mbMap) {
58
+ this.mbMap.off("idle", this.updateAttribution);
59
+ this.mbMap.triggerRepaint = () => {
60
+ };
61
+ this.mbMap.remove();
62
+ this.mbMap = null;
63
+ }
64
+ this.loaded = false;
65
+ super.detachFromMap();
66
+ }
67
+ createStyleUrl() {
68
+ return getMapboxStyleUrl(this.apiKey, this.apiKeyName, this.styleUrl);
69
+ }
70
+ loadMbMap() {
71
+ this.olListenersKeys.push(this.map.on("change:target", () => {
72
+ this.loadMbMap();
73
+ }));
74
+ if (!this.map.getTargetElement()) {
75
+ return;
76
+ }
77
+ if (!this.visible) {
78
+ this.olListenersKeys.push(this.once("change:visible", () => {
79
+ this.loadMbMap();
80
+ }));
81
+ return;
82
+ }
83
+ const container = document.createElement("div");
84
+ container.style.position = "absolute";
85
+ container.style.width = "100%";
86
+ container.style.height = "100%";
87
+ this.mbMap = new Map({
88
+ style: this.createStyleUrl(),
89
+ container,
90
+ interactive: false,
91
+ trackResize: false,
92
+ attributionControl: false,
93
+ ...this.options.mapOptions || {}
94
+ });
95
+ this.mbMap.once("load", () => {
96
+ this.loaded = true;
97
+ this.dispatchEvent({
98
+ type: "load",
99
+ target: this
100
+ });
101
+ });
102
+ this.mbMap.on("idle", this.updateAttribution);
103
+ }
104
+ updateAttribution(evt) {
105
+ const newAttributions = getMapboxMapCopyrights(evt.target) || [];
106
+ if (this.copyrights?.toString() !== newAttributions.toString()) {
107
+ this.copyrights = newAttributions;
108
+ this.olLayer.getSource().setAttributions(newAttributions);
109
+ }
110
+ }
111
+ getFeatureInfoAtCoordinate(coordinate, options) {
112
+ if (!options || !this.format || !this.mbMap || !this.mbMap.isStyleLoaded()) {
113
+ return Promise.resolve({ coordinate, features: [], layer: this });
114
+ }
115
+ let pixel = coordinate && this.mbMap.project(toLonLat(coordinate));
116
+ if (this.hitTolerance) {
117
+ const { x, y } = pixel;
118
+ pixel = [
119
+ { x: x - this.hitTolerance, y: y - this.hitTolerance },
120
+ { x: x + this.hitTolerance, y: y + this.hitTolerance }
121
+ ];
122
+ }
123
+ const features = this.mbMap.queryRenderedFeatures(pixel, options).map((feature) => {
124
+ const olFeature = this.format.readFeature(feature);
125
+ if (olFeature) {
126
+ olFeature.set("mapboxFeature", feature);
127
+ }
128
+ return olFeature;
129
+ });
130
+ return Promise.resolve({
131
+ layer: this,
132
+ features,
133
+ coordinate
134
+ });
135
+ }
136
+ clone(newOptions) {
137
+ return new MaplibreLayer({ ...this.options, ...newOptions });
138
+ }
139
+ }
@@ -0,0 +1,61 @@
1
+ import { Circle, Fill, Stroke, Style } from "ol/style";
2
+ import { Vector as VectorSource } from "ol/source";
3
+ import { Vector } from "ol/layer";
4
+ import Layer from "./Layer";
5
+ const circleStyle = new Circle({
6
+ radius: 6,
7
+ fill: new Fill({
8
+ color: [255, 0, 0, 1]
9
+ }),
10
+ stroke: new Stroke({
11
+ color: [0, 0, 0, 1],
12
+ width: 1
13
+ })
14
+ });
15
+ const blackBorder = new Style({
16
+ stroke: new Stroke({
17
+ color: [0, 0, 0, 1],
18
+ width: 5
19
+ })
20
+ });
21
+ const redLine = new Style({
22
+ image: circleStyle,
23
+ stroke: new Stroke({
24
+ color: [255, 0, 0, 1],
25
+ width: 3
26
+ })
27
+ });
28
+ const dashedRedLine = new Style({
29
+ image: circleStyle,
30
+ stroke: new Stroke({
31
+ color: [255, 0, 0, 1],
32
+ width: 3,
33
+ lineDash: [1, 10]
34
+ })
35
+ });
36
+ const defaultStyleFunction = (feature, resolution) => {
37
+ const minResolution = feature.get("minResolution");
38
+ const maxResolution = feature.get("maxResolution");
39
+ const inRange = resolution <= minResolution && resolution > maxResolution;
40
+ if (minResolution && maxResolution && !inRange) {
41
+ return null;
42
+ }
43
+ const mot = feature.get("mot");
44
+ if (mot !== "foot") {
45
+ return [blackBorder, redLine];
46
+ }
47
+ return [dashedRedLine];
48
+ };
49
+ class RoutingLayer extends Layer {
50
+ constructor(options = {}) {
51
+ super(options);
52
+ this.olLayer = options.olLayer || new Vector({
53
+ source: new VectorSource(),
54
+ style: options.style || defaultStyleFunction
55
+ });
56
+ }
57
+ clone(newOptions) {
58
+ return new RoutingLayer({ ...this.options, ...newOptions });
59
+ }
60
+ }
61
+ export default RoutingLayer;
@@ -1,49 +1,40 @@
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
-
1
+ import fetch from "jest-fetch-mock";
2
+ import Map from "ol/Map";
3
+ import View from "ol/View";
4
+ import RoutingLayer from "./RoutingLayer";
6
5
  let layer;
7
6
  let onClick;
8
7
  let olMap;
9
-
10
- describe('RoutingLayer', () => {
8
+ describe("RoutingLayer", () => {
11
9
  beforeEach(() => {
12
10
  global.fetch = fetch;
13
11
  fetch.resetMocks();
14
-
15
12
  onClick = jest.fn();
16
13
  layer = new RoutingLayer({
17
14
  onClick,
18
- apiKey: 'apiKey',
15
+ apiKey: "apiKey"
19
16
  });
20
-
21
17
  olMap = new Map({
22
18
  view: new View({
23
19
  center: [831634, 5933959],
24
- zoom: 9,
25
- }),
20
+ zoom: 9
21
+ })
26
22
  });
27
23
  });
28
-
29
- test('should be instanced.', () => {
24
+ test("should be instanced.", () => {
30
25
  expect(layer).toBeInstanceOf(RoutingLayer);
31
26
  expect(layer.clickCallbacks[0]).toBe(onClick);
32
27
  });
33
-
34
- test('should called terminate on initalization.', () => {
35
- const spy = jest.spyOn(layer, 'terminate');
36
-
28
+ test("should called terminate on initalization.", () => {
29
+ const spy = jest.spyOn(layer, "detachFromMap");
37
30
  fetch.mockResponseOnce(JSON.stringify(global.fetchTrajectoriesResponse));
38
-
39
- layer.init(olMap);
31
+ layer.attachToMap(olMap);
40
32
  expect(spy).toHaveBeenCalledTimes(1);
41
33
  });
42
-
43
- test('should clone', () => {
44
- const clone = layer.clone({ name: 'clone' });
34
+ test("should clone", () => {
35
+ const clone = layer.clone({ name: "clone" });
45
36
  expect(clone).not.toBe(layer);
46
- expect(clone.name).toBe('clone');
37
+ expect(clone.name).toBe("clone");
47
38
  expect(clone).toBeInstanceOf(RoutingLayer);
48
39
  });
49
40
  });