@kalisio/kdk 1.4.2 → 1.6.0

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 (410) hide show
  1. package/.nyc_output/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
  2. package/.nyc_output/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
  3. package/.nyc_output/{2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json → 27401f21-8ccf-42fa-8230-4232189d86b3.json} +0 -0
  4. package/.nyc_output/{81d21e46-766a-46bc-b1b7-143ca577347a.json → 52278ef5-c337-4724-97be-e2e4416847c5.json} +0 -0
  5. package/.nyc_output/{aaf3ebbb-f895-4d7b-9255-bc5dee832570.json → 5dd49b8a-4c84-42f9-a3d5-712247a84775.json} +0 -0
  6. package/.nyc_output/{dbeb2602-0ac2-4e66-978b-0d29548359ca.json → 612b4859-9645-45c1-a41e-1fae420518c4.json} +0 -0
  7. package/.nyc_output/{e47d1e4c-2fff-4dcb-908f-d3081162547c.json → bab87fe9-d99a-4759-99e6-3fc4622eeca0.json} +0 -0
  8. package/.nyc_output/processinfo/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
  9. package/.nyc_output/processinfo/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
  10. package/.nyc_output/processinfo/27401f21-8ccf-42fa-8230-4232189d86b3.json +1 -0
  11. package/.nyc_output/processinfo/52278ef5-c337-4724-97be-e2e4416847c5.json +1 -0
  12. package/.nyc_output/processinfo/5dd49b8a-4c84-42f9-a3d5-712247a84775.json +1 -0
  13. package/.nyc_output/processinfo/612b4859-9645-45c1-a41e-1fae420518c4.json +1 -0
  14. package/.nyc_output/processinfo/bab87fe9-d99a-4759-99e6-3fc4622eeca0.json +1 -0
  15. package/.nyc_output/processinfo/index.json +1 -1
  16. package/CHANGELOG.md +69 -10
  17. package/coverage/core/api/application.js.html +500 -422
  18. package/coverage/core/api/authentication.js.html +119 -119
  19. package/coverage/core/api/db.js.html +172 -172
  20. package/coverage/core/api/hooks/hooks.account.js.html +45 -45
  21. package/coverage/core/api/hooks/hooks.authentication.js.html +71 -71
  22. package/coverage/core/api/hooks/hooks.authorisations.js.html +368 -353
  23. package/coverage/core/api/hooks/hooks.devices.js.html +49 -49
  24. package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
  25. package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
  26. package/coverage/core/api/hooks/hooks.model.js.html +269 -269
  27. package/coverage/core/api/hooks/hooks.organisations.js.html +190 -190
  28. package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
  29. package/coverage/core/api/hooks/hooks.query.js.html +277 -211
  30. package/coverage/core/api/hooks/hooks.service.js.html +82 -82
  31. package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
  32. package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
  33. package/coverage/core/api/hooks/hooks.users.js.html +263 -263
  34. package/coverage/core/api/hooks/index.html +172 -172
  35. package/coverage/core/api/hooks/index.js.html +24 -24
  36. package/coverage/core/api/index.html +76 -76
  37. package/coverage/core/api/index.js.html +30 -30
  38. package/coverage/core/api/marshall.js.html +57 -57
  39. package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
  40. package/coverage/core/api/models/index.html +50 -50
  41. package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
  42. package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
  43. package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
  44. package/coverage/core/api/oauth2-handler.js.html +18 -18
  45. package/coverage/core/api/oauth2-verifier.js.html +38 -38
  46. package/coverage/core/api/services/account/account.hooks.js.html +16 -16
  47. package/coverage/core/api/services/account/account.service.js.html +104 -104
  48. package/coverage/core/api/services/account/index.html +32 -32
  49. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  50. package/coverage/core/api/services/authorisations/authorisations.service.js.html +156 -132
  51. package/coverage/core/api/services/authorisations/index.html +28 -28
  52. package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
  53. package/coverage/core/api/services/databases/databases.service.js.html +12 -12
  54. package/coverage/core/api/services/databases/index.html +24 -24
  55. package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
  56. package/coverage/core/api/services/devices/devices.service.js.html +121 -121
  57. package/coverage/core/api/services/devices/index.html +28 -28
  58. package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
  59. package/coverage/core/api/services/groups/index.html +13 -13
  60. package/coverage/core/api/services/index.html +21 -21
  61. package/coverage/core/api/services/index.js.html +118 -118
  62. package/coverage/core/api/services/mailer/index.html +24 -24
  63. package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
  64. package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
  65. package/coverage/core/api/services/organisations/index.html +24 -24
  66. package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
  67. package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
  68. package/coverage/core/api/services/pusher/index.html +34 -34
  69. package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
  70. package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
  71. package/coverage/core/api/services/pusher/pusher.service.js.html +414 -414
  72. package/coverage/core/api/services/storage/index.html +21 -21
  73. package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
  74. package/coverage/core/api/services/tags/index.html +21 -21
  75. package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
  76. package/coverage/core/api/services/users/index.html +21 -21
  77. package/coverage/core/api/services/users/users.hooks.js.html +33 -33
  78. package/coverage/core/common/errors.js.html +1 -1
  79. package/coverage/core/common/index.html +42 -27
  80. package/coverage/core/common/index.js.html +16 -16
  81. package/coverage/core/common/permissions.js.html +320 -290
  82. package/coverage/index.html +181 -181
  83. package/coverage/lcov-report/core/api/application.js.html +500 -422
  84. package/coverage/lcov-report/core/api/authentication.js.html +119 -119
  85. package/coverage/lcov-report/core/api/db.js.html +172 -172
  86. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +45 -45
  87. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +71 -71
  88. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +368 -353
  89. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +49 -49
  90. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
  91. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
  92. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
  93. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +190 -190
  94. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
  95. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +277 -211
  96. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
  97. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
  98. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
  99. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +263 -263
  100. package/coverage/lcov-report/core/api/hooks/index.html +172 -172
  101. package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
  102. package/coverage/lcov-report/core/api/index.html +76 -76
  103. package/coverage/lcov-report/core/api/index.js.html +30 -30
  104. package/coverage/lcov-report/core/api/marshall.js.html +57 -57
  105. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
  106. package/coverage/lcov-report/core/api/models/index.html +50 -50
  107. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
  108. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
  109. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
  110. package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
  111. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
  112. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
  113. package/coverage/lcov-report/core/api/services/account/account.service.js.html +104 -104
  114. package/coverage/lcov-report/core/api/services/account/index.html +32 -32
  115. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  116. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +156 -132
  117. package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
  118. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
  119. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
  120. package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
  121. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
  122. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +121 -121
  123. package/coverage/lcov-report/core/api/services/devices/index.html +28 -28
  124. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
  125. package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
  126. package/coverage/lcov-report/core/api/services/index.html +21 -21
  127. package/coverage/lcov-report/core/api/services/index.js.html +118 -118
  128. package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
  129. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
  130. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
  131. package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
  132. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
  133. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
  134. package/coverage/lcov-report/core/api/services/pusher/index.html +34 -34
  135. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
  136. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
  137. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +414 -414
  138. package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
  139. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
  140. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  141. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
  142. package/coverage/lcov-report/core/api/services/users/index.html +21 -21
  143. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
  144. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  145. package/coverage/lcov-report/core/common/index.html +42 -27
  146. package/coverage/lcov-report/core/common/index.js.html +16 -16
  147. package/coverage/lcov-report/core/common/permissions.js.html +320 -290
  148. package/coverage/lcov-report/index.html +181 -181
  149. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  150. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +25 -7
  151. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  152. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  153. package/coverage/lcov-report/map/api/index.html +1 -1
  154. package/coverage/lcov-report/map/api/index.js.html +1 -1
  155. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  156. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  157. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  158. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +14 -5
  159. package/coverage/lcov-report/map/api/models/index.html +7 -7
  160. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  161. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  162. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  163. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  164. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  165. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  166. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  167. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +1 -1
  168. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  169. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  170. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
  171. package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
  172. package/coverage/lcov-report/map/api/services/index.html +1 -1
  173. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  174. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  175. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  176. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  177. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  178. package/coverage/lcov-report/map/common/index.html +1 -1
  179. package/coverage/lcov-report/map/common/index.js.html +1 -1
  180. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  181. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  182. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  183. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  184. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  185. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  186. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  187. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  188. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  189. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  190. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  191. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  192. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  193. package/coverage/lcov.info +3683 -3825
  194. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  195. package/coverage/map/api/hooks/hooks.query.js.html +25 -7
  196. package/coverage/map/api/hooks/index.html +7 -7
  197. package/coverage/map/api/hooks/index.js.html +1 -1
  198. package/coverage/map/api/index.html +1 -1
  199. package/coverage/map/api/index.js.html +1 -1
  200. package/coverage/map/api/marshall.js.html +1 -1
  201. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  202. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  203. package/coverage/map/api/models/features.model.mongodb.js.html +14 -5
  204. package/coverage/map/api/models/index.html +7 -7
  205. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  206. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  207. package/coverage/map/api/services/alerts/index.html +1 -1
  208. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  209. package/coverage/map/api/services/catalog/index.html +1 -1
  210. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  211. package/coverage/map/api/services/daptiles/index.html +1 -1
  212. package/coverage/map/api/services/features/features.hooks.js.html +1 -1
  213. package/coverage/map/api/services/features/index.html +1 -1
  214. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  215. package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
  216. package/coverage/map/api/services/geocoder/index.html +1 -1
  217. package/coverage/map/api/services/index.html +1 -1
  218. package/coverage/map/api/services/index.js.html +1 -1
  219. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  220. package/coverage/map/common/errors.js.html +1 -1
  221. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  222. package/coverage/map/common/grid.js.html +1 -1
  223. package/coverage/map/common/index.html +1 -1
  224. package/coverage/map/common/index.js.html +1 -1
  225. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  226. package/coverage/map/common/moment-utils.js.html +1 -1
  227. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  228. package/coverage/map/common/opendap-utils.js.html +1 -1
  229. package/coverage/map/common/permissions.js.html +1 -1
  230. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  231. package/coverage/map/common/tms-utils.js.html +1 -1
  232. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  233. package/coverage/map/common/wcs-utils.js.html +1 -1
  234. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  235. package/coverage/map/common/wfs-utils.js.html +1 -1
  236. package/coverage/map/common/wms-utils.js.html +1 -1
  237. package/coverage/map/common/wmts-utils.js.html +1 -1
  238. package/extras/tours/map/navigation-bar.js +49 -1
  239. package/lib/core/api/application.js +35 -9
  240. package/lib/core/api/application.js.map +1 -1
  241. package/lib/core/api/hooks/hooks.authorisations.js +8 -1
  242. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  243. package/lib/core/api/hooks/hooks.query.js +135 -100
  244. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  245. package/lib/core/api/services/authorisations/authorisations.service.js +13 -1
  246. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  247. package/lib/core/api/services/pusher/pusher.service.js +40 -16
  248. package/lib/core/api/services/pusher/pusher.service.js.map +1 -1
  249. package/lib/core/client/components/collection/KColumn.vue +29 -28
  250. package/lib/core/client/components/collection/KFilter.vue +97 -72
  251. package/lib/core/client/components/editor/KModalEditor.vue +3 -4
  252. package/lib/core/client/components/editor/KSettingsEditor.vue +6 -2
  253. package/lib/core/client/components/form/KFileField.vue +14 -36
  254. package/lib/core/client/components/form/KRoleField.vue +5 -2
  255. package/lib/core/client/components/form/KTextField.vue +12 -2
  256. package/lib/core/client/components/form/KUnitField.vue +57 -0
  257. package/lib/core/client/components/form/KUrlField.vue +1 -1
  258. package/lib/core/client/components/frame/KAction.vue +1 -2
  259. package/lib/core/client/components/frame/KModal.vue +66 -20
  260. package/lib/core/client/components/frame/KScrollArea.vue +65 -0
  261. package/lib/core/client/components/frame/index.js +6 -1
  262. package/lib/core/client/components/frame/index.js.map +1 -1
  263. package/lib/core/client/components/input/KColorChooser.vue +3 -5
  264. package/lib/core/client/components/input/KIconChooser.vue +38 -40
  265. package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
  266. package/lib/core/client/components/layout/KAbout.vue +47 -49
  267. package/lib/core/client/components/team/KAddMember.vue +1 -1
  268. package/lib/core/client/components/team/KChangeRole.vue +11 -14
  269. package/lib/core/client/components/team/KGroupCard.vue +12 -5
  270. package/lib/core/client/components/team/KGroupsActivity.vue +1 -1
  271. package/lib/core/client/components/team/KJoinGroup.vue +22 -22
  272. package/lib/core/client/components/team/KMemberCard.vue +19 -4
  273. package/lib/core/client/components/viewer/KModalViewer.vue +10 -9
  274. package/lib/core/client/i18n/core_en.json +72 -8
  275. package/lib/core/client/i18n/core_fr.json +66 -8
  276. package/lib/core/client/index.js +31 -0
  277. package/lib/core/client/index.js.map +1 -1
  278. package/lib/core/client/layout.js +8 -1
  279. package/lib/core/client/layout.js.map +1 -1
  280. package/lib/core/client/mixins/mixin.base-widget.js +5 -3
  281. package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
  282. package/lib/core/client/reader.js +85 -0
  283. package/lib/core/client/reader.js.map +1 -0
  284. package/lib/core/client/readers/index.js +30 -0
  285. package/lib/core/client/readers/index.js.map +1 -0
  286. package/lib/core/client/readers/reader.csv.js +54 -0
  287. package/lib/core/client/readers/reader.csv.js.map +1 -0
  288. package/lib/core/client/readers/reader.json.js +49 -0
  289. package/lib/core/client/readers/reader.json.js.map +1 -0
  290. package/lib/core/client/services/index.js +14 -3
  291. package/lib/core/client/services/index.js.map +1 -1
  292. package/lib/core/client/services/local-settings.service.js +6 -4
  293. package/lib/core/client/services/local-settings.service.js.map +1 -1
  294. package/lib/core/client/time.js +4 -3
  295. package/lib/core/client/time.js.map +1 -1
  296. package/lib/core/client/units.js +195 -0
  297. package/lib/core/client/units.js.map +1 -0
  298. package/lib/core/common/permissions.js +44 -34
  299. package/lib/core/common/permissions.js.map +1 -1
  300. package/lib/core/common/schemas/settings.update.json +72 -0
  301. package/lib/map/api/hooks/hooks.query.js +7 -2
  302. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  303. package/lib/map/api/models/features.model.mongodb.js +3 -0
  304. package/lib/map/api/models/features.model.mongodb.js.map +1 -1
  305. package/lib/map/client/components/KCaptureToolbar.vue +151 -0
  306. package/lib/map/client/components/KColorLegend.vue +16 -4
  307. package/lib/map/client/components/KFeaturesChart.vue +10 -11
  308. package/lib/map/client/components/KFeaturesFilter.vue +40 -39
  309. package/lib/map/client/components/KFeaturesTable.vue +15 -16
  310. package/lib/map/client/components/KLayerEditionToolbar.vue +19 -11
  311. package/lib/map/client/components/KLayerStyleEditor.vue +3 -2
  312. package/lib/map/client/components/KLayerStyleForm.vue +38 -27
  313. package/lib/map/client/components/KMeasureTool.vue +337 -0
  314. package/lib/map/client/components/KTimeline.vue +5 -9
  315. package/lib/map/client/components/catalog/KAddLayer.vue +3 -2
  316. package/lib/map/client/components/catalog/KCatalog.vue +26 -7
  317. package/lib/map/client/components/catalog/KImportLayer.vue +8 -35
  318. package/lib/map/client/components/catalog/KLayerCategories.vue +3 -2
  319. package/lib/map/client/components/catalog/KLayersSelector.vue +8 -6
  320. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +1 -1
  321. package/lib/map/client/components/widget/KInformationBox.vue +8 -17
  322. package/lib/map/client/components/widget/KMapillaryViewer.vue +5 -1
  323. package/lib/map/client/components/widget/KTimeSeries.vue +92 -9
  324. package/lib/map/client/i18n/map_en.json +51 -20
  325. package/lib/map/client/i18n/map_fr.json +51 -20
  326. package/lib/map/client/init.js +7 -1
  327. package/lib/map/client/init.js.map +1 -1
  328. package/lib/map/client/leaflet/MaskLayer.js +9 -0
  329. package/lib/map/client/leaflet/MaskLayer.js.map +1 -1
  330. package/lib/map/client/mixins/globe/mixin.base-globe.js +3 -5
  331. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  332. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +16 -21
  333. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  334. package/lib/map/client/mixins/globe/mixin.popup.js +7 -1
  335. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  336. package/lib/map/client/mixins/globe/mixin.tooltip.js +7 -1
  337. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  338. package/lib/map/client/mixins/map/mixin.base-map.js +54 -9
  339. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  340. package/lib/map/client/mixins/map/mixin.canvas-layers.js +2 -0
  341. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  342. package/lib/map/client/mixins/map/mixin.file-layers.js +51 -97
  343. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  344. package/lib/map/client/mixins/map/mixin.geojson-layers.js +43 -11
  345. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  346. package/lib/map/client/mixins/map/mixin.popup.js +7 -1
  347. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  348. package/lib/map/client/mixins/map/mixin.style.js +1 -1
  349. package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
  350. package/lib/map/client/mixins/map/mixin.tooltip.js +7 -1
  351. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  352. package/lib/map/client/mixins/mixin.activity.js +2 -0
  353. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  354. package/lib/map/client/mixins/mixin.context.js +26 -3
  355. package/lib/map/client/mixins/mixin.context.js.map +1 -1
  356. package/lib/map/client/mixins/mixin.feature-service.js +3 -3
  357. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  358. package/lib/map/client/mixins/mixin.infobox.js +4 -0
  359. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  360. package/lib/map/client/mixins/mixin.weacast.js +7 -5
  361. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  362. package/lib/map/client/readers/index.js +54 -0
  363. package/lib/map/client/readers/index.js.map +1 -0
  364. package/lib/map/client/readers/reader.geojson.js +87 -0
  365. package/lib/map/client/readers/reader.geojson.js.map +1 -0
  366. package/lib/map/client/readers/reader.gpx.js +52 -0
  367. package/lib/map/client/readers/reader.gpx.js.map +1 -0
  368. package/lib/map/client/readers/reader.kml.js +52 -0
  369. package/lib/map/client/readers/reader.kml.js.map +1 -0
  370. package/lib/map/client/readers/reader.shp.js +116 -0
  371. package/lib/map/client/readers/reader.shp.js.map +1 -0
  372. package/lib/map/client/utils.js +0 -7
  373. package/lib/map/client/utils.js.map +1 -1
  374. package/lib/test/client/core/account.js +1 -1
  375. package/lib/test/client/core/account.js.map +1 -1
  376. package/lib/test/client/core/runner.js +1 -2
  377. package/lib/test/client/core/runner.js.map +1 -1
  378. package/lib/test/client/core/screens.js +1 -1
  379. package/lib/test/client/core/screens.js.map +1 -1
  380. package/lib/test/client/core/utils.js +2 -2
  381. package/lib/test/client/core/utils.js.map +1 -1
  382. package/lib/test/client/map/catalog.js +50 -49
  383. package/lib/test/client/map/catalog.js.map +1 -1
  384. package/package.json +3 -3
  385. package/.nyc_output/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
  386. package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
  387. package/.nyc_output/processinfo/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +0 -1
  388. package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +0 -1
  389. package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +0 -1
  390. package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +0 -1
  391. package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +0 -1
  392. package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +0 -1
  393. package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.json +0 -1
  394. package/extras/testcafe/Dockerfile +0 -48
  395. package/extras/testcafe/docker-entrypoint.sh +0 -27
  396. package/extras/testcafe/page-models/core/account.js +0 -75
  397. package/extras/testcafe/page-models/core/base-collection.js +0 -41
  398. package/extras/testcafe/page-models/core/base-page.js +0 -25
  399. package/extras/testcafe/page-models/core/groups.js +0 -36
  400. package/extras/testcafe/page-models/core/index.js +0 -140
  401. package/extras/testcafe/page-models/core/layout.js +0 -145
  402. package/extras/testcafe/page-models/core/members.js +0 -98
  403. package/extras/testcafe/page-models/core/organisations.js +0 -76
  404. package/extras/testcafe/page-models/core/screens.js +0 -99
  405. package/extras/testcafe/page-models/core/tags.js +0 -21
  406. package/extras/testcafe/page-models/map/add-layer.js +0 -51
  407. package/extras/testcafe/page-models/map/catalog.js +0 -132
  408. package/extras/testcafe/page-models/map/index.js +0 -36
  409. package/extras/testcafe/page-models/map/map-activity.js +0 -42
  410. package/extras/testcafe/page-models/map/timeline.js +0 -67
@@ -22,6 +22,8 @@ var _moment2 = _interopRequireDefault(_moment);
22
22
 
23
23
  var _time = require('../../../core/client/time');
24
24
 
25
+ var _units = require('../../../core/client/units');
26
+
25
27
  var _utils = require('../utils');
26
28
 
27
29
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -281,25 +283,25 @@ exports.default = {
281
283
  };
282
284
  let html = '';
283
285
  if (!_lodash2.default.isNil(windSpeed) && _lodash2.default.isFinite(windSpeed)) {
284
- html += `${windSpeed.toFixed(1)} m/s`;
286
+ html += _units.Units.format(windSpeed, 'm/s');
285
287
  // Add related time if any
286
288
  if (!uniqTime) html += getTimeAsHtml(_lodash2.default.get(time, windSpeedField.replace('properties.', '')));
287
289
  html += '</br>';
288
290
  }
289
291
  if (!_lodash2.default.isNil(gust) && _lodash2.default.isFinite(gust)) {
290
- html += `max ${gust.toFixed(1)} m/s`;
292
+ html += `max ${_units.Units.format(gust, 'm/s')}`;
291
293
  // Add related time if any
292
294
  if (!uniqTime) html += getTimeAsHtml(_lodash2.default.get(time, gustField.replace('properties.', '')));
293
295
  html += '</br>';
294
296
  }
295
297
  if (!_lodash2.default.isNil(windDirection) && _lodash2.default.isFinite(windDirection)) {
296
- html += `${windDirection.toFixed(1)} °`;
298
+ html += _units.Units.format(windDirection, 'deg');
297
299
  // Add related time if any
298
300
  if (!uniqTime) html += getTimeAsHtml(_lodash2.default.get(time, windDirectionField.replace('properties.', '')));
299
301
  html += '</br>';
300
302
  }
301
303
  if (!_lodash2.default.isNil(precipitations) && _lodash2.default.isFinite(precipitations)) {
302
- html += `${precipitations.toFixed(1)} mm/h`;
304
+ html += _units.Units.format(precipitations, 'mm/h');
303
305
  // Add related time if any
304
306
  if (!uniqTime) html += getTimeAsHtml(_lodash2.default.get(time, precipitationsField.replace('properties.', '')));
305
307
  html += '</br>';
@@ -311,7 +313,7 @@ exports.default = {
311
313
  html += '</br>';
312
314
  }
313
315
  if (!_lodash2.default.isNil(temperature) && _lodash2.default.isFinite(temperature)) {
314
- html += `${temperature.toFixed(1)} °C`;
316
+ html += _units.Units.format(temperature, 'degC');
315
317
  // Add related time if any
316
318
  if (!uniqTime) html += getTimeAsHtml(_lodash2.default.get(time, temperatureField.replace('properties.', '')));
317
319
  html += '</br>';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../map/client/mixins/mixin.weacast.js"],"names":["data","forecastModel","forecastModels","methods","setupWeacast","weacastApi","$api","setForecastTime","time","forecastTime","emit","getForecastTime","setupForecastModels","error","logger","response","getService","find","models","forecast","isDefault","length","setForecastModel","model","$emit","setForecastLevel","level","forecastLevel","getForecastForLocation","long","lat","startTime","endTime","geometry","type","coordinates","query","$gte","format","$lte","$geoIntersects","$geometry","probedLocation","setCursor","elements","map","element","name","filter","endsWith","toString","tokens","split","_","isFinite","toNumber","create","features","Error","unsetCursor","getForecastProbe","probe","results","$paginate","$select","getForecastForFeature","featureId","windDirection","windSpeed","concat","probeId","_id","$groupBy","$aggregate","getForecastValueAtCurrentTime","times","values","Array","isArray","nearestTime","Time","getCurrentTime","moment","utc","difference","interval","index","getProbedLocationForecastAtCurrentTime","feature","cloneDeep","forOwn","properties","value","key","get","set","getForecastAsHtml","fields","windDirectionField","windSpeedField","gustField","temperatureField","precipitationsField","humidityField","timeField","nameField","gust","temperature","precipitations","humidity","uniqTime","uniqTimes","uniq","getTimeAsHtml","isNil","isValid","html","toFixed","replace","getProbedLocationForecastTooltip","layer","options","SelectionLayerName","L","tooltip","permanent","setContent","createWindBarbMarker","WindBarb","Icon","deg","speed","pointRadius","pointColor","pointStroke","strokeWidth","strokeColor","strokeLength","fillColor","barbSpaceing","barbHeight","forceDir","getProbedLocationForecastMarker","latlng","icon","marker","onCurrentForecastTimeChanged","onWeacastShowLayer","engineLayer","weacast","ForecastLayer","levels","setSelectableLevels","$on","onWeacastHideLayer","clearSelectableLevels","$off","created","$events","mounted","beforeDestroy"],"mappings":"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","file":"mixin.weacast.js","sourcesContent":["import _ from 'lodash'\r\nimport L from 'leaflet'\r\nimport logger from 'loglevel'\r\nimport moment from 'moment'\r\nimport { Time } from '../../../core/client/time'\r\nimport { getNearestTime, SelectionLayerName } from '../utils'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n forecastModel: null,\r\n forecastModels: []\r\n }\r\n },\r\n methods: {\r\n async setupWeacast () {\r\n // As we proxy weacast service we use our API\r\n this.weacastApi = this.$api\r\n // We need to implement time management\r\n this.weacastApi.setForecastTime = (time) => {\r\n this.$api.forecastTime = time\r\n this.$api.emit('forecast-time-changed', time)\r\n }\r\n this.weacastApi.getForecastTime = () => {\r\n return this.$api.forecastTime\r\n }\r\n try {\r\n await this.setupForecastModels()\r\n } catch (error) {\r\n logger.error('Cannot retrieve available Weacast forecast models', error)\r\n }\r\n },\r\n async setupForecastModels () {\r\n if (!this.weacastApi) return\r\n const response = await this.weacastApi.getService('forecasts').find()\r\n this.forecastModels = response.data\r\n // store forecast models on the weacast api object too (useful in the weacast grid source)\r\n this.weacastApi.models = this.forecastModels\r\n // Select default if any or first one\r\n let forecastModel = this.forecastModels.find(forecast => forecast.isDefault)\r\n if (!forecastModel) {\r\n forecastModel = (this.forecastModels.length > 0 ? this.forecastModels[0] : null)\r\n }\r\n this.setForecastModel(forecastModel)\r\n },\r\n setForecastModel (model) {\r\n this.forecastModel = model\r\n this.$emit('forecast-model-changed', this.forecastModel)\r\n },\r\n setForecastLevel (level) {\r\n this.forecastLevel = level\r\n this.$emit('forecast-level-changed', this.forecastLevel)\r\n },\r\n async getForecastForLocation (long, lat, startTime, endTime) {\r\n // Not yet ready\r\n if (!this.forecastModel) return\r\n // From now to last available time\r\n const geometry = {\r\n type: 'Point',\r\n coordinates: [long, lat]\r\n }\r\n const query = {\r\n forecastTime: {\r\n $gte: startTime.format(),\r\n $lte: endTime.format()\r\n },\r\n geometry: {\r\n $geoIntersects: {\r\n $geometry: geometry\r\n }\r\n }\r\n }\r\n let probedLocation\r\n this.setCursor('processing-cursor')\r\n try {\r\n let elements = this.forecastModel.elements.map(element => element.name)\r\n // Filter available elements according to current level if any\r\n if (this.forecastLevel) elements = elements.filter(element => element.endsWith(this.forecastLevel.toString()))\r\n else {\r\n elements = elements.filter(element => {\r\n const tokens = element.split('-')\r\n return (tokens.length === 0) || !_.isFinite(_.toNumber(tokens[tokens.length - 1]))\r\n })\r\n }\r\n const response = await this.weacastApi.getService('probes')\r\n .create({\r\n forecast: this.forecastModel.name,\r\n elements\r\n }, { query })\r\n if (response.features.length > 0) {\r\n probedLocation = response.features[0]\r\n } else throw new Error('Cannot find valid forecast at location')\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n this.unsetCursor('processing-cursor')\r\n return probedLocation\r\n },\r\n async getForecastProbe (name) {\r\n // Not yet ready\r\n if (!this.forecastModel) return\r\n // Avoid reloading probe when not necessary\r\n if (this.probe && (this.probe.name === name) && (this.probe.forecast === this.forecastModel.name)) {\r\n return this.probe\r\n }\r\n const results = await this.weacastApi.getService('probes').find({\r\n query: {\r\n name,\r\n forecast: this.forecastModel.name,\r\n $paginate: false,\r\n $select: ['elements', 'forecast', 'featureId']\r\n }\r\n })\r\n if (results.length > 0) {\r\n this.probe = results[0]\r\n return this.probe\r\n } else {\r\n return null\r\n }\r\n },\r\n async getForecastForFeature (featureId, startTime, endTime) {\r\n // Not yet ready\r\n if (!this.forecastModel) return\r\n // Check if probe is available\r\n if (!this.probe) return\r\n\r\n let probedLocation\r\n this.setCursor('processing-cursor')\r\n try {\r\n let elements = this.forecastModel.elements.map(element => element.name)\r\n // Filter available elements according to current level if any\r\n if (this.forecastLevel) {\r\n elements = elements.filter(element => element.endsWith(this.forecastLevel.toString()))\r\n } else {\r\n elements = elements.filter(element => {\r\n const tokens = element.split('-')\r\n return (tokens.length === 0) || !_.isFinite(_.toNumber(tokens[tokens.length - 1]))\r\n })\r\n }\r\n // Need to add derived values for static probes as they are not computed on the fly\r\n const windDirection = (this.forecastLevel ? `windDirection-${this.forecastLevel}` : 'windDirection')\r\n const windSpeed = (this.forecastLevel ? `windSpeed-${this.forecastLevel}` : 'windSpeed')\r\n elements = elements.concat([windDirection, windSpeed])\r\n\r\n const results = await this.weacastApi.getService('probe-results').find({\r\n query: {\r\n probeId: this.probe._id,\r\n forecastTime: {\r\n $gte: startTime.format(),\r\n $lte: endTime.format()\r\n },\r\n [this.probe.featureId]: featureId,\r\n $groupBy: this.probe.featureId,\r\n $aggregate: elements\r\n }\r\n })\r\n if (results.length > 0) {\r\n probedLocation = results[0]\r\n } else throw new Error('Cannot find valid forecast for feature')\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n this.unsetCursor('processing-cursor')\r\n return probedLocation\r\n },\r\n getForecastValueAtCurrentTime (times, values) {\r\n // Check for the right value at time\r\n if (Array.isArray(times) && Array.isArray(values)) {\r\n // Look for the nearest time\r\n const nearestTime = getNearestTime(Time.getCurrentTime(), times.map(time => moment.utc(time)))\r\n // Check if we found a valid time within interval, otherwise the time is missing\r\n if ((nearestTime.difference / 1000) > (0.5 * this.forecastModel.interval)) return null\r\n else return values[nearestTime.index]\r\n } else {\r\n // Constant value\r\n return values\r\n }\r\n },\r\n getProbedLocationForecastAtCurrentTime (probedLocation) {\r\n // Create new geojson from raw response containing all times\r\n const feature = _.cloneDeep(probedLocation)\r\n // Then check for the right value at time\r\n _.forOwn(feature.properties, (value, key) => {\r\n if (Array.isArray(value)) {\r\n const times = _.get(feature, 'forecastTime.' + key)\r\n if (times) {\r\n _.set(feature, 'properties.' + key, this.getForecastValueAtCurrentTime(times, value))\r\n _.set(feature, 'forecastTime.' + key, this.getForecastValueAtCurrentTime(times, times))\r\n }\r\n }\r\n })\r\n return feature\r\n },\r\n getForecastAsHtml (feature, fields = {}) {\r\n // Retrieve target fields on feature\r\n const windDirectionField = _.get(fields, 'windDirection', 'properties.windDirection')\r\n const windSpeedField = _.get(fields, 'windSpeed', 'properties.windSpeed')\r\n const gustField = _.get(fields, 'gust', 'properties.gust')\r\n const temperatureField = _.get(fields, 'temperature', 'properties.temperature')\r\n const precipitationsField = _.get(fields, 'precipitations', 'properties.precipitations')\r\n const humidityField = _.get(fields, 'humidity', 'properties.humidity')\r\n const timeField = _.get(fields, 'time', 'forecastTime')\r\n const nameField = _.get(fields, 'name', 'properties.name')\r\n // Then get values for fields\r\n const windDirection = _.get(feature, `${windDirectionField}`)\r\n const windSpeed = _.get(feature, `${windSpeedField}`)\r\n const gust = _.get(feature, `${gustField}`)\r\n const temperature = _.get(feature, `${temperatureField}`)\r\n const precipitations = _.get(feature, `${precipitationsField}`)\r\n const humidity = _.get(feature, `${humidityField}`)\r\n let time = _.get(feature, `${timeField}`)\r\n // We can have a single time or a map between fields and available times\r\n // If a single time is found we will display it once,\r\n // otherwise we will display a different time for each field\r\n let uniqTime = true\r\n if (typeof time === 'object') {\r\n const uniqTimes = _.uniq(_.values(time))\r\n if (uniqTimes.length > 1) {\r\n uniqTime = false\r\n } else {\r\n // Update time in place with actual value\r\n time = uniqTimes[0]\r\n }\r\n }\r\n const getTimeAsHtml = (time) => {\r\n if (!_.isNil(time)) {\r\n time = moment.utc(time)\r\n if (time.isValid()) return ` (${Time.format(time, 'date.short')} - ${Time.format(time, 'time.long')})`\r\n }\r\n return ''\r\n }\r\n let html = ''\r\n if (!_.isNil(windSpeed) && _.isFinite(windSpeed)) {\r\n html += `${windSpeed.toFixed(1)} m/s`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, windSpeedField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(gust) && _.isFinite(gust)) {\r\n html += `max ${gust.toFixed(1)} m/s`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, gustField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(windDirection) && _.isFinite(windDirection)) {\r\n html += `${windDirection.toFixed(1)} °`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, windDirectionField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(precipitations) && _.isFinite(precipitations)) {\r\n html += `${precipitations.toFixed(1)} mm/h`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, precipitationsField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(humidity) && _.isFinite(humidity)) {\r\n html += `${humidity.toFixed(0)} %`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, humidityField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(temperature) && _.isFinite(temperature)) {\r\n html += `${temperature.toFixed(1)} °C`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, temperatureField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n // If we have any value add name/time information\r\n if (html) {\r\n const name = _.get(feature, `${nameField}`)\r\n if (!_.isNil(name)) html = `<b><u>${name}</u></b></br>` + html\r\n // If we get a signle time for all field add it at the end\r\n if (uniqTime) {\r\n html += getTimeAsHtml(time)\r\n }\r\n }\r\n return html\r\n },\r\n getProbedLocationForecastTooltip (feature, layer, options) {\r\n if (options.name !== SelectionLayerName) return\r\n\r\n // Only wind/temperature can be available at different levels now\r\n const html = this.getForecastAsHtml(feature, {\r\n windDirection: (this.forecastLevel ? `properties.windDirection-${this.forecastLevel}` : 'properties.windDirection'),\r\n windSpeed: (this.forecastLevel ? `properties.windSpeed-${this.forecastLevel}` : 'properties.windSpeed'),\r\n temperature: (this.forecastLevel ? `properties.temperature-${this.forecastLevel}` : 'properties.temperature')\r\n })\r\n return (html ? L.tooltip({ permanent: false }, layer).setContent(`<b>${html}</b>`) : null)\r\n },\r\n createWindBarbMarker (feature, fields = {}) {\r\n // Retrieve target fields on feature\r\n let windDirection = _.get(fields, 'windDirection', 'properties.windDirection')\r\n let windSpeed = _.get(fields, 'windSpeed', 'properties.windSpeed')\r\n // TODO: colorize according to temperature scale if ?\r\n // let temperature = _.get(fields, 'temperature', 'properties.temperature')\r\n // Then get values for fields\r\n windDirection = _.get(feature, `${windDirection}`)\r\n windSpeed = _.get(feature, `${windSpeed}`)\r\n if (_.isNil(windDirection) || !_.isFinite(windDirection) ||\r\n _.isNil(windSpeed) || !_.isFinite(windSpeed)) return null\r\n // Then get values for fields\r\n return new L.WindBarb.Icon({\r\n deg: windDirection,\r\n speed: windSpeed, // Expressed as m/s\r\n pointRadius: 10,\r\n pointColor: '#2196f3',\r\n pointStroke: '#888888',\r\n strokeWidth: 2,\r\n strokeColor: '#888888',\r\n strokeLength: 12,\r\n fillColor: '#2196f3',\r\n barbSpaceing: 4,\r\n barbHeight: 10,\r\n forceDir: true\r\n })\r\n },\r\n getProbedLocationForecastMarker (feature, latlng, options) {\r\n if (options.name !== SelectionLayerName) return\r\n // Use wind barbs on probed features\r\n const icon = this.createWindBarbMarker(feature, {\r\n windDirection: (this.forecastLevel ? `properties.windDirection-${this.forecastLevel}` : 'properties.windDirection'),\r\n windSpeed: (this.forecastLevel ? `properties.windSpeed-${this.forecastLevel}` : 'properties.windSpeed')\r\n })\r\n return (icon ? L.marker(latlng, { icon }) : null)\r\n },\r\n onCurrentForecastTimeChanged (time) {\r\n if (this.weacastApi) this.weacastApi.setForecastTime(time)\r\n },\r\n onWeacastShowLayer (layer, engineLayer) {\r\n // Check for valid types\r\n if (!(engineLayer instanceof L.weacast.ForecastLayer)) {\r\n const levels = _.get(layer, 'levels')\r\n if (!levels) {\r\n this.setForecastLevel(null)\r\n return\r\n }\r\n if (typeof this.setSelectableLevels === 'function') {\r\n this.$on('selected-level-changed', this.setForecastLevel)\r\n this.setSelectableLevels(layer, levels)\r\n }\r\n }\r\n },\r\n onWeacastHideLayer (layer, engineLayer) {\r\n // Check for valid types\r\n if (!(engineLayer instanceof L.weacast.ForecastLayer)) return\r\n if (typeof this.clearSelectableLevels === 'function') {\r\n this.clearSelectableLevels(layer)\r\n this.$off('selected-level-changed', this.setForecastLevel)\r\n }\r\n }\r\n },\r\n created () {\r\n this.$events.$on('time-current-time-changed', this.onCurrentForecastTimeChanged)\r\n this.$on('layer-shown', this.onWeacastShowLayer)\r\n this.$on('layer-hidden', this.onWeacastHideLayer)\r\n },\r\n mounted () {\r\n },\r\n beforeDestroy () {\r\n this.$events.$off('time-current-time-changed', this.onCurrentForecastTimeChanged)\r\n this.$off('layer-shown', this.onWeacastShowLayer)\r\n this.$off('layer-hidden', this.onWeacastHideLayer)\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../../map/client/mixins/mixin.weacast.js"],"names":["data","forecastModel","forecastModels","methods","setupWeacast","weacastApi","$api","setForecastTime","time","forecastTime","emit","getForecastTime","setupForecastModels","error","logger","response","getService","find","models","forecast","isDefault","length","setForecastModel","model","$emit","setForecastLevel","level","forecastLevel","getForecastForLocation","long","lat","startTime","endTime","geometry","type","coordinates","query","$gte","format","$lte","$geoIntersects","$geometry","probedLocation","setCursor","elements","map","element","name","filter","endsWith","toString","tokens","split","_","isFinite","toNumber","create","features","Error","unsetCursor","getForecastProbe","probe","results","$paginate","$select","getForecastForFeature","featureId","windDirection","windSpeed","concat","probeId","_id","$groupBy","$aggregate","getForecastValueAtCurrentTime","times","values","Array","isArray","nearestTime","Time","getCurrentTime","moment","utc","difference","interval","index","getProbedLocationForecastAtCurrentTime","feature","cloneDeep","forOwn","properties","value","key","get","set","getForecastAsHtml","fields","windDirectionField","windSpeedField","gustField","temperatureField","precipitationsField","humidityField","timeField","nameField","gust","temperature","precipitations","humidity","uniqTime","uniqTimes","uniq","getTimeAsHtml","isNil","isValid","html","Units","replace","toFixed","getProbedLocationForecastTooltip","layer","options","SelectionLayerName","L","tooltip","permanent","setContent","createWindBarbMarker","WindBarb","Icon","deg","speed","pointRadius","pointColor","pointStroke","strokeWidth","strokeColor","strokeLength","fillColor","barbSpaceing","barbHeight","forceDir","getProbedLocationForecastMarker","latlng","icon","marker","onCurrentForecastTimeChanged","onWeacastShowLayer","engineLayer","weacast","ForecastLayer","levels","setSelectableLevels","$on","onWeacastHideLayer","clearSelectableLevels","$off","created","$events","mounted","beforeDestroy"],"mappings":"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","file":"mixin.weacast.js","sourcesContent":["import _ from 'lodash'\r\nimport L from 'leaflet'\r\nimport logger from 'loglevel'\r\nimport moment from 'moment'\r\nimport { Time } from '../../../core/client/time'\r\nimport { Units } from '../../../core/client/units'\r\nimport { getNearestTime, SelectionLayerName } from '../utils'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n forecastModel: null,\r\n forecastModels: []\r\n }\r\n },\r\n methods: {\r\n async setupWeacast () {\r\n // As we proxy weacast service we use our API\r\n this.weacastApi = this.$api\r\n // We need to implement time management\r\n this.weacastApi.setForecastTime = (time) => {\r\n this.$api.forecastTime = time\r\n this.$api.emit('forecast-time-changed', time)\r\n }\r\n this.weacastApi.getForecastTime = () => {\r\n return this.$api.forecastTime\r\n }\r\n try {\r\n await this.setupForecastModels()\r\n } catch (error) {\r\n logger.error('Cannot retrieve available Weacast forecast models', error)\r\n }\r\n },\r\n async setupForecastModels () {\r\n if (!this.weacastApi) return\r\n const response = await this.weacastApi.getService('forecasts').find()\r\n this.forecastModels = response.data\r\n // store forecast models on the weacast api object too (useful in the weacast grid source)\r\n this.weacastApi.models = this.forecastModels\r\n // Select default if any or first one\r\n let forecastModel = this.forecastModels.find(forecast => forecast.isDefault)\r\n if (!forecastModel) {\r\n forecastModel = (this.forecastModels.length > 0 ? this.forecastModels[0] : null)\r\n }\r\n this.setForecastModel(forecastModel)\r\n },\r\n setForecastModel (model) {\r\n this.forecastModel = model\r\n this.$emit('forecast-model-changed', this.forecastModel)\r\n },\r\n setForecastLevel (level) {\r\n this.forecastLevel = level\r\n this.$emit('forecast-level-changed', this.forecastLevel)\r\n },\r\n async getForecastForLocation (long, lat, startTime, endTime) {\r\n // Not yet ready\r\n if (!this.forecastModel) return\r\n // From now to last available time\r\n const geometry = {\r\n type: 'Point',\r\n coordinates: [long, lat]\r\n }\r\n const query = {\r\n forecastTime: {\r\n $gte: startTime.format(),\r\n $lte: endTime.format()\r\n },\r\n geometry: {\r\n $geoIntersects: {\r\n $geometry: geometry\r\n }\r\n }\r\n }\r\n let probedLocation\r\n this.setCursor('processing-cursor')\r\n try {\r\n let elements = this.forecastModel.elements.map(element => element.name)\r\n // Filter available elements according to current level if any\r\n if (this.forecastLevel) elements = elements.filter(element => element.endsWith(this.forecastLevel.toString()))\r\n else {\r\n elements = elements.filter(element => {\r\n const tokens = element.split('-')\r\n return (tokens.length === 0) || !_.isFinite(_.toNumber(tokens[tokens.length - 1]))\r\n })\r\n }\r\n const response = await this.weacastApi.getService('probes')\r\n .create({\r\n forecast: this.forecastModel.name,\r\n elements\r\n }, { query })\r\n if (response.features.length > 0) {\r\n probedLocation = response.features[0]\r\n } else throw new Error('Cannot find valid forecast at location')\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n this.unsetCursor('processing-cursor')\r\n return probedLocation\r\n },\r\n async getForecastProbe (name) {\r\n // Not yet ready\r\n if (!this.forecastModel) return\r\n // Avoid reloading probe when not necessary\r\n if (this.probe && (this.probe.name === name) && (this.probe.forecast === this.forecastModel.name)) {\r\n return this.probe\r\n }\r\n const results = await this.weacastApi.getService('probes').find({\r\n query: {\r\n name,\r\n forecast: this.forecastModel.name,\r\n $paginate: false,\r\n $select: ['elements', 'forecast', 'featureId']\r\n }\r\n })\r\n if (results.length > 0) {\r\n this.probe = results[0]\r\n return this.probe\r\n } else {\r\n return null\r\n }\r\n },\r\n async getForecastForFeature (featureId, startTime, endTime) {\r\n // Not yet ready\r\n if (!this.forecastModel) return\r\n // Check if probe is available\r\n if (!this.probe) return\r\n\r\n let probedLocation\r\n this.setCursor('processing-cursor')\r\n try {\r\n let elements = this.forecastModel.elements.map(element => element.name)\r\n // Filter available elements according to current level if any\r\n if (this.forecastLevel) {\r\n elements = elements.filter(element => element.endsWith(this.forecastLevel.toString()))\r\n } else {\r\n elements = elements.filter(element => {\r\n const tokens = element.split('-')\r\n return (tokens.length === 0) || !_.isFinite(_.toNumber(tokens[tokens.length - 1]))\r\n })\r\n }\r\n // Need to add derived values for static probes as they are not computed on the fly\r\n const windDirection = (this.forecastLevel ? `windDirection-${this.forecastLevel}` : 'windDirection')\r\n const windSpeed = (this.forecastLevel ? `windSpeed-${this.forecastLevel}` : 'windSpeed')\r\n elements = elements.concat([windDirection, windSpeed])\r\n\r\n const results = await this.weacastApi.getService('probe-results').find({\r\n query: {\r\n probeId: this.probe._id,\r\n forecastTime: {\r\n $gte: startTime.format(),\r\n $lte: endTime.format()\r\n },\r\n [this.probe.featureId]: featureId,\r\n $groupBy: this.probe.featureId,\r\n $aggregate: elements\r\n }\r\n })\r\n if (results.length > 0) {\r\n probedLocation = results[0]\r\n } else throw new Error('Cannot find valid forecast for feature')\r\n } catch (error) {\r\n logger.error(error)\r\n }\r\n this.unsetCursor('processing-cursor')\r\n return probedLocation\r\n },\r\n getForecastValueAtCurrentTime (times, values) {\r\n // Check for the right value at time\r\n if (Array.isArray(times) && Array.isArray(values)) {\r\n // Look for the nearest time\r\n const nearestTime = getNearestTime(Time.getCurrentTime(), times.map(time => moment.utc(time)))\r\n // Check if we found a valid time within interval, otherwise the time is missing\r\n if ((nearestTime.difference / 1000) > (0.5 * this.forecastModel.interval)) return null\r\n else return values[nearestTime.index]\r\n } else {\r\n // Constant value\r\n return values\r\n }\r\n },\r\n getProbedLocationForecastAtCurrentTime (probedLocation) {\r\n // Create new geojson from raw response containing all times\r\n const feature = _.cloneDeep(probedLocation)\r\n // Then check for the right value at time\r\n _.forOwn(feature.properties, (value, key) => {\r\n if (Array.isArray(value)) {\r\n const times = _.get(feature, 'forecastTime.' + key)\r\n if (times) {\r\n _.set(feature, 'properties.' + key, this.getForecastValueAtCurrentTime(times, value))\r\n _.set(feature, 'forecastTime.' + key, this.getForecastValueAtCurrentTime(times, times))\r\n }\r\n }\r\n })\r\n return feature\r\n },\r\n getForecastAsHtml (feature, fields = {}) {\r\n // Retrieve target fields on feature\r\n const windDirectionField = _.get(fields, 'windDirection', 'properties.windDirection')\r\n const windSpeedField = _.get(fields, 'windSpeed', 'properties.windSpeed')\r\n const gustField = _.get(fields, 'gust', 'properties.gust')\r\n const temperatureField = _.get(fields, 'temperature', 'properties.temperature')\r\n const precipitationsField = _.get(fields, 'precipitations', 'properties.precipitations')\r\n const humidityField = _.get(fields, 'humidity', 'properties.humidity')\r\n const timeField = _.get(fields, 'time', 'forecastTime')\r\n const nameField = _.get(fields, 'name', 'properties.name')\r\n // Then get values for fields\r\n const windDirection = _.get(feature, `${windDirectionField}`)\r\n const windSpeed = _.get(feature, `${windSpeedField}`)\r\n const gust = _.get(feature, `${gustField}`)\r\n const temperature = _.get(feature, `${temperatureField}`)\r\n const precipitations = _.get(feature, `${precipitationsField}`)\r\n const humidity = _.get(feature, `${humidityField}`)\r\n let time = _.get(feature, `${timeField}`)\r\n // We can have a single time or a map between fields and available times\r\n // If a single time is found we will display it once,\r\n // otherwise we will display a different time for each field\r\n let uniqTime = true\r\n if (typeof time === 'object') {\r\n const uniqTimes = _.uniq(_.values(time))\r\n if (uniqTimes.length > 1) {\r\n uniqTime = false\r\n } else {\r\n // Update time in place with actual value\r\n time = uniqTimes[0]\r\n }\r\n }\r\n const getTimeAsHtml = (time) => {\r\n if (!_.isNil(time)) {\r\n time = moment.utc(time)\r\n if (time.isValid()) return ` (${Time.format(time, 'date.short')} - ${Time.format(time, 'time.long')})`\r\n }\r\n return ''\r\n }\r\n let html = ''\r\n if (!_.isNil(windSpeed) && _.isFinite(windSpeed)) {\r\n html += Units.format(windSpeed, 'm/s')\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, windSpeedField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(gust) && _.isFinite(gust)) {\r\n html += `max ${Units.format(gust, 'm/s')}`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, gustField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(windDirection) && _.isFinite(windDirection)) {\r\n html += Units.format(windDirection, 'deg')\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, windDirectionField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(precipitations) && _.isFinite(precipitations)) {\r\n html += Units.format(precipitations, 'mm/h')\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, precipitationsField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(humidity) && _.isFinite(humidity)) {\r\n html += `${humidity.toFixed(0)} %`\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, humidityField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n if (!_.isNil(temperature) && _.isFinite(temperature)) {\r\n html += Units.format(temperature, 'degC')\r\n // Add related time if any\r\n if (!uniqTime) html += getTimeAsHtml(_.get(time, temperatureField.replace('properties.', '')))\r\n html += '</br>'\r\n }\r\n // If we have any value add name/time information\r\n if (html) {\r\n const name = _.get(feature, `${nameField}`)\r\n if (!_.isNil(name)) html = `<b><u>${name}</u></b></br>` + html\r\n // If we get a signle time for all field add it at the end\r\n if (uniqTime) {\r\n html += getTimeAsHtml(time)\r\n }\r\n }\r\n return html\r\n },\r\n getProbedLocationForecastTooltip (feature, layer, options) {\r\n if (options.name !== SelectionLayerName) return\r\n\r\n // Only wind/temperature can be available at different levels now\r\n const html = this.getForecastAsHtml(feature, {\r\n windDirection: (this.forecastLevel ? `properties.windDirection-${this.forecastLevel}` : 'properties.windDirection'),\r\n windSpeed: (this.forecastLevel ? `properties.windSpeed-${this.forecastLevel}` : 'properties.windSpeed'),\r\n temperature: (this.forecastLevel ? `properties.temperature-${this.forecastLevel}` : 'properties.temperature')\r\n })\r\n return (html ? L.tooltip({ permanent: false }, layer).setContent(`<b>${html}</b>`) : null)\r\n },\r\n createWindBarbMarker (feature, fields = {}) {\r\n // Retrieve target fields on feature\r\n let windDirection = _.get(fields, 'windDirection', 'properties.windDirection')\r\n let windSpeed = _.get(fields, 'windSpeed', 'properties.windSpeed')\r\n // TODO: colorize according to temperature scale if ?\r\n // let temperature = _.get(fields, 'temperature', 'properties.temperature')\r\n // Then get values for fields\r\n windDirection = _.get(feature, `${windDirection}`)\r\n windSpeed = _.get(feature, `${windSpeed}`)\r\n if (_.isNil(windDirection) || !_.isFinite(windDirection) ||\r\n _.isNil(windSpeed) || !_.isFinite(windSpeed)) return null\r\n // Then get values for fields\r\n return new L.WindBarb.Icon({\r\n deg: windDirection,\r\n speed: windSpeed, // Expressed as m/s\r\n pointRadius: 10,\r\n pointColor: '#2196f3',\r\n pointStroke: '#888888',\r\n strokeWidth: 2,\r\n strokeColor: '#888888',\r\n strokeLength: 12,\r\n fillColor: '#2196f3',\r\n barbSpaceing: 4,\r\n barbHeight: 10,\r\n forceDir: true\r\n })\r\n },\r\n getProbedLocationForecastMarker (feature, latlng, options) {\r\n if (options.name !== SelectionLayerName) return\r\n // Use wind barbs on probed features\r\n const icon = this.createWindBarbMarker(feature, {\r\n windDirection: (this.forecastLevel ? `properties.windDirection-${this.forecastLevel}` : 'properties.windDirection'),\r\n windSpeed: (this.forecastLevel ? `properties.windSpeed-${this.forecastLevel}` : 'properties.windSpeed')\r\n })\r\n return (icon ? L.marker(latlng, { icon }) : null)\r\n },\r\n onCurrentForecastTimeChanged (time) {\r\n if (this.weacastApi) this.weacastApi.setForecastTime(time)\r\n },\r\n onWeacastShowLayer (layer, engineLayer) {\r\n // Check for valid types\r\n if (!(engineLayer instanceof L.weacast.ForecastLayer)) {\r\n const levels = _.get(layer, 'levels')\r\n if (!levels) {\r\n this.setForecastLevel(null)\r\n return\r\n }\r\n if (typeof this.setSelectableLevels === 'function') {\r\n this.$on('selected-level-changed', this.setForecastLevel)\r\n this.setSelectableLevels(layer, levels)\r\n }\r\n }\r\n },\r\n onWeacastHideLayer (layer, engineLayer) {\r\n // Check for valid types\r\n if (!(engineLayer instanceof L.weacast.ForecastLayer)) return\r\n if (typeof this.clearSelectableLevels === 'function') {\r\n this.clearSelectableLevels(layer)\r\n this.$off('selected-level-changed', this.setForecastLevel)\r\n }\r\n }\r\n },\r\n created () {\r\n this.$events.$on('time-current-time-changed', this.onCurrentForecastTimeChanged)\r\n this.$on('layer-shown', this.onWeacastShowLayer)\r\n this.$on('layer-hidden', this.onWeacastHideLayer)\r\n },\r\n mounted () {\r\n },\r\n beforeDestroy () {\r\n this.$events.$off('time-current-time-changed', this.onCurrentForecastTimeChanged)\r\n this.$off('layer-shown', this.onWeacastShowLayer)\r\n this.$off('layer-hidden', this.onWeacastHideLayer)\r\n }\r\n}\r\n"]}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _reader = require('./reader.geojson');
8
+
9
+ Object.keys(_reader).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ Object.defineProperty(exports, key, {
12
+ enumerable: true,
13
+ get: function () {
14
+ return _reader[key];
15
+ }
16
+ });
17
+ });
18
+
19
+ var _reader2 = require('./reader.kml');
20
+
21
+ Object.keys(_reader2).forEach(function (key) {
22
+ if (key === "default" || key === "__esModule") return;
23
+ Object.defineProperty(exports, key, {
24
+ enumerable: true,
25
+ get: function () {
26
+ return _reader2[key];
27
+ }
28
+ });
29
+ });
30
+
31
+ var _reader3 = require('./reader.gpx');
32
+
33
+ Object.keys(_reader3).forEach(function (key) {
34
+ if (key === "default" || key === "__esModule") return;
35
+ Object.defineProperty(exports, key, {
36
+ enumerable: true,
37
+ get: function () {
38
+ return _reader3[key];
39
+ }
40
+ });
41
+ });
42
+
43
+ var _reader4 = require('./reader.shp');
44
+
45
+ Object.keys(_reader4).forEach(function (key) {
46
+ if (key === "default" || key === "__esModule") return;
47
+ Object.defineProperty(exports, key, {
48
+ enumerable: true,
49
+ get: function () {
50
+ return _reader4[key];
51
+ }
52
+ });
53
+ });
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../map/client/readers/index.js"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","file":"index.js","sourcesContent":["export * from './reader.geojson'\r\nexport * from './reader.kml'\r\nexport * from './reader.gpx'\r\nexport * from './reader.shp'\r\n"]}
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GeoJSONReader = undefined;
7
+
8
+ var _loglevel = require('loglevel');
9
+
10
+ var _loglevel2 = _interopRequireDefault(_loglevel);
11
+
12
+ var _lodash = require('lodash');
13
+
14
+ var _lodash2 = _interopRequireDefault(_lodash);
15
+
16
+ var _i18next = require('i18next');
17
+
18
+ var _i18next2 = _interopRequireDefault(_i18next);
19
+
20
+ var _geojsonhint = require('@mapbox/geojsonhint');
21
+
22
+ var _geojsonhint2 = _interopRequireDefault(_geojsonhint);
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ const GeoJSONReader = exports.GeoJSONReader = {
27
+ read(files, options) {
28
+ if (files.length !== 1) {
29
+ _loglevel2.default.debug('invlaid \'fields\' arguments');
30
+ return;
31
+ }
32
+ const file = files[0];
33
+ _loglevel2.default.debug(`reading GeoJSON file ${file.name}`);
34
+ return new Promise((resolve, reject) => {
35
+ const reader = new FileReader();
36
+ reader.onloadend = () => {
37
+ let content = reader.result;
38
+ try {
39
+ content = JSON.parse(content);
40
+ } catch (error) {
41
+ reject(new Error(_i18next2.default.t('errors.INVALID_JSON_FILE', { file: file.name }), { errors: error }));
42
+ return;
43
+ }
44
+ // check the crs
45
+ // if valid delete it because of https://github.com/kalisio/kdk/issues/518
46
+ if (content.crs) {
47
+ // we support only named crs and expressed in WGS84
48
+ const name = _lodash2.default.get(content.crs, 'properties.name');
49
+ if (name) {
50
+ const crs = name.toLowerCase();
51
+ const allowedCrs = ['epsg:4326', 'urn:ogc:def:crs:OGC:1.3:CRS84', 'urn:ogc:def:crs:EPSG::4326'];
52
+ const isCrsValid = _lodash2.default.some(allowedCrs, allowrdCrs => {
53
+ return allowrdCrs.toLowerCase() === crs;
54
+ });
55
+ if (!isCrsValid) {
56
+ reject(new Error(_i18next2.default.t('errors.INVALID_GEOJSON_CRS', { file: file.name }), { errors: `Invalid CRS ${name}` }));
57
+ return;
58
+ }
59
+ delete content.crs;
60
+ }
61
+ }
62
+ // lint the geosjon file
63
+ const messages = _geojsonhint2.default.hint(content, options);
64
+ // filter the message according the level to find the errors
65
+ const errors = _lodash2.default.filter(messages, message => {
66
+ return _lodash2.default.get(message, 'level') !== 'message';
67
+ });
68
+ if (errors.length > 0) {
69
+ _loglevel2.default.debug(errors);
70
+ reject(new Error(_i18next2.default.t('errors.INVALID_GEOJSON_FILE', { file: file.name }), { errors }));
71
+ return;
72
+ }
73
+ // the geosjon file is correct
74
+ resolve(content);
75
+ };
76
+ reader.onerror = error => {
77
+ _loglevel2.default.debug(error);
78
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file: file.name }), { errors: error }));
79
+ };
80
+ reader.readAsText(file);
81
+ });
82
+ },
83
+ getAdditionalFiles() {
84
+ return [];
85
+ }
86
+ };
87
+ //# sourceMappingURL=reader.geojson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../map/client/readers/reader.geojson.js"],"names":["GeoJSONReader","read","files","options","length","logger","debug","file","name","Promise","resolve","reject","reader","FileReader","onloadend","content","result","JSON","parse","error","Error","i18next","t","errors","crs","_","get","toLowerCase","allowedCrs","isCrsValid","some","allowrdCrs","messages","geojsonhint","hint","filter","message","onerror","readAsText","getAdditionalFiles"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEO,MAAMA,wCAAgB;AAC3BC,OAAMC,KAAN,EAAaC,OAAb,EAAsB;AACpB,QAAID,MAAME,MAAN,KAAiB,CAArB,EAAwB;AACtBC,yBAAOC,KAAP,CAAa,8BAAb;AACA;AACD;AACD,UAAMC,OAAOL,MAAM,CAAN,CAAb;AACAG,uBAAOC,KAAP,CAAc,wBAAuBC,KAAKC,IAAK,EAA/C;AACA,WAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,YAAMC,SAAS,IAAIC,UAAJ,EAAf;AACAD,aAAOE,SAAP,GAAmB,MAAM;AACvB,YAAIC,UAAUH,OAAOI,MAArB;AACA,YAAI;AACFD,oBAAUE,KAAKC,KAAL,CAAWH,OAAX,CAAV;AACD,SAFD,CAEE,OAAOI,KAAP,EAAc;AACdR,iBAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,0BAAV,EAAsC,EAAEf,MAAMA,KAAKC,IAAb,EAAtC,CAAV,EAAsE,EAAEe,QAAQJ,KAAV,EAAtE,CAAP;AACA;AACD;AACD;AACA;AACA,YAAIJ,QAAQS,GAAZ,EAAiB;AACf;AACA,gBAAMhB,OAAOiB,iBAAEC,GAAF,CAAMX,QAAQS,GAAd,EAAmB,iBAAnB,CAAb;AACA,cAAIhB,IAAJ,EAAU;AACR,kBAAMgB,MAAMhB,KAAKmB,WAAL,EAAZ;AACA,kBAAMC,aAAa,CAAC,WAAD,EAAc,+BAAd,EAA+C,4BAA/C,CAAnB;AACA,kBAAMC,aAAaJ,iBAAEK,IAAF,CAAOF,UAAP,EAAoBG,UAAD,IAAgB;AAAE,qBAAOA,WAAWJ,WAAX,OAA6BH,GAApC;AAAyC,aAA9E,CAAnB;AACA,gBAAI,CAACK,UAAL,EAAiB;AACflB,qBAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,4BAAV,EAAwC,EAAEf,MAAMA,KAAKC,IAAb,EAAxC,CAAV,EAAwE,EAAEe,QAAS,eAAcf,IAAK,EAA9B,EAAxE,CAAP;AACA;AACD;AACD,mBAAOO,QAAQS,GAAf;AACD;AACF;AACD;AACA,cAAMQ,WAAWC,sBAAYC,IAAZ,CAAiBnB,OAAjB,EAA0BZ,OAA1B,CAAjB;AACA;AACA,cAAMoB,SAASE,iBAAEU,MAAF,CAASH,QAAT,EAAmBI,WAAW;AAC3C,iBAAOX,iBAAEC,GAAF,CAAMU,OAAN,EAAe,OAAf,MAA4B,SAAnC;AACD,SAFc,CAAf;AAGA,YAAIb,OAAOnB,MAAP,GAAgB,CAApB,EAAuB;AACrBC,6BAAOC,KAAP,CAAaiB,MAAb;AACAZ,iBAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,6BAAV,EAAyC,EAAEf,MAAMA,KAAKC,IAAb,EAAzC,CAAV,EAAyE,EAAEe,MAAF,EAAzE,CAAP;AACA;AACD;AACD;AACAb,gBAAQK,OAAR;AACD,OArCD;AAsCAH,aAAOyB,OAAP,GAAkBlB,KAAD,IAAW;AAC1Bd,2BAAOC,KAAP,CAAaa,KAAb;AACAR,eAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,yBAAV,EAAqC,EAAEf,MAAMA,KAAKC,IAAb,EAArC,CAAV,EAAqE,EAAEe,QAAQJ,KAAV,EAArE,CAAP;AACD,OAHD;AAIAP,aAAO0B,UAAP,CAAkB/B,IAAlB;AACD,KA7CM,CAAP;AA8CD,GAtD0B;AAuD3BgC,uBAAsB;AACpB,WAAO,EAAP;AACD;AAzD0B,CAAtB","file":"reader.geojson.js","sourcesContent":["import logger from 'loglevel'\r\nimport _ from 'lodash'\r\nimport i18next from 'i18next'\r\nimport geojsonhint from '@mapbox/geojsonhint'\r\n\r\nexport const GeoJSONReader = {\r\n read (files, options) {\r\n if (files.length !== 1) {\r\n logger.debug('invlaid \\'fields\\' arguments')\r\n return\r\n }\r\n const file = files[0]\r\n logger.debug(`reading GeoJSON file ${file.name}`)\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n let content = reader.result\r\n try {\r\n content = JSON.parse(content)\r\n } catch (error) {\r\n reject(new Error(i18next.t('errors.INVALID_JSON_FILE', { file: file.name }), { errors: error }))\r\n return\r\n }\r\n // check the crs\r\n // if valid delete it because of https://github.com/kalisio/kdk/issues/518\r\n if (content.crs) {\r\n // we support only named crs and expressed in WGS84\r\n const name = _.get(content.crs, 'properties.name')\r\n if (name) {\r\n const crs = name.toLowerCase()\r\n const allowedCrs = ['epsg:4326', 'urn:ogc:def:crs:OGC:1.3:CRS84', 'urn:ogc:def:crs:EPSG::4326']\r\n const isCrsValid = _.some(allowedCrs, (allowrdCrs) => { return allowrdCrs.toLowerCase() === crs })\r\n if (!isCrsValid) {\r\n reject(new Error(i18next.t('errors.INVALID_GEOJSON_CRS', { file: file.name }), { errors: `Invalid CRS ${name}` }))\r\n return\r\n }\r\n delete content.crs\r\n }\r\n }\r\n // lint the geosjon file\r\n const messages = geojsonhint.hint(content, options)\r\n // filter the message according the level to find the errors\r\n const errors = _.filter(messages, message => {\r\n return _.get(message, 'level') !== 'message'\r\n })\r\n if (errors.length > 0) {\r\n logger.debug(errors)\r\n reject(new Error(i18next.t('errors.INVALID_GEOJSON_FILE', { file: file.name }), { errors }))\r\n return\r\n }\r\n // the geosjon file is correct\r\n resolve(content)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file: file.name }), { errors: error }))\r\n }\r\n reader.readAsText(file)\r\n })\r\n },\r\n getAdditionalFiles () {\r\n return []\r\n }\r\n}\r\n"]}
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GPXReader = undefined;
7
+
8
+ var _loglevel = require('loglevel');
9
+
10
+ var _loglevel2 = _interopRequireDefault(_loglevel);
11
+
12
+ var _i18next = require('i18next');
13
+
14
+ var _i18next2 = _interopRequireDefault(_i18next);
15
+
16
+ var _togeojson = require('@tmcw/togeojson');
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const GPXReader = exports.GPXReader = {
21
+ read(files, options) {
22
+ if (files.length !== 1) {
23
+ _loglevel2.default.debug('invlaid \'fields\' arguments');
24
+ return;
25
+ }
26
+ const file = files[0];
27
+ _loglevel2.default.debug(`reading GPX file ${file.name}`);
28
+ return new Promise((resolve, reject) => {
29
+ const reader = new FileReader();
30
+ reader.onloadend = () => {
31
+ let content = reader.result;
32
+ try {
33
+ content = (0, _togeojson.gpx)(new DOMParser().parseFromString(content, 'text/xml'));
34
+ } catch (error) {
35
+ _loglevel2.default.debug(error);
36
+ reject(new Error(_i18next2.default.t('errors.INVALID_GPX_FILE', { file: file.name }), { errors: error }));
37
+ return;
38
+ }
39
+ resolve(content);
40
+ };
41
+ reader.onerror = error => {
42
+ _loglevel2.default.debug(error);
43
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file: file.name }), { errors: error }));
44
+ };
45
+ reader.readAsText(file);
46
+ });
47
+ },
48
+ getAdditionalFiles() {
49
+ return [];
50
+ }
51
+ };
52
+ //# sourceMappingURL=reader.gpx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../map/client/readers/reader.gpx.js"],"names":["GPXReader","read","files","options","length","logger","debug","file","name","Promise","resolve","reject","reader","FileReader","onloadend","content","result","DOMParser","parseFromString","error","Error","i18next","t","errors","onerror","readAsText","getAdditionalFiles"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AACA;;;;AAEO,MAAMA,gCAAY;AACvBC,OAAMC,KAAN,EAAaC,OAAb,EAAsB;AACpB,QAAID,MAAME,MAAN,KAAiB,CAArB,EAAwB;AACtBC,yBAAOC,KAAP,CAAa,8BAAb;AACA;AACD;AACD,UAAMC,OAAOL,MAAM,CAAN,CAAb;AACAG,uBAAOC,KAAP,CAAc,oBAAmBC,KAAKC,IAAK,EAA3C;AACA,WAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,YAAMC,SAAS,IAAIC,UAAJ,EAAf;AACAD,aAAOE,SAAP,GAAmB,MAAM;AACvB,YAAIC,UAAUH,OAAOI,MAArB;AACA,YAAI;AACFD,oBAAU,oBAAI,IAAIE,SAAJ,GAAgBC,eAAhB,CAAgCH,OAAhC,EAAyC,UAAzC,CAAJ,CAAV;AACD,SAFD,CAEE,OAAOI,KAAP,EAAc;AACdd,6BAAOC,KAAP,CAAaa,KAAb;AACAR,iBAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,yBAAV,EAAqC,EAAEf,MAAMA,KAAKC,IAAb,EAArC,CAAV,EAAqE,EAAEe,QAAQJ,KAAV,EAArE,CAAP;AACA;AACD;AACDT,gBAAQK,OAAR;AACD,OAVD;AAWAH,aAAOY,OAAP,GAAkBL,KAAD,IAAW;AAC1Bd,2BAAOC,KAAP,CAAaa,KAAb;AACAR,eAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,yBAAV,EAAqC,EAAEf,MAAMA,KAAKC,IAAb,EAArC,CAAV,EAAqE,EAAEe,QAAQJ,KAAV,EAArE,CAAP;AACD,OAHD;AAIAP,aAAOa,UAAP,CAAkBlB,IAAlB;AACD,KAlBM,CAAP;AAmBD,GA3BsB;AA4BvBmB,uBAAsB;AACpB,WAAO,EAAP;AACD;AA9BsB,CAAlB","file":"reader.gpx.js","sourcesContent":["import logger from 'loglevel'\r\nimport i18next from 'i18next'\r\nimport { gpx } from '@tmcw/togeojson'\r\n\r\nexport const GPXReader = {\r\n read (files, options) {\r\n if (files.length !== 1) {\r\n logger.debug('invlaid \\'fields\\' arguments')\r\n return\r\n }\r\n const file = files[0]\r\n logger.debug(`reading GPX file ${file.name}`)\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n let content = reader.result\r\n try {\r\n content = gpx(new DOMParser().parseFromString(content, 'text/xml'))\r\n } catch (error) {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.INVALID_GPX_FILE', { file: file.name }), { errors: error }))\r\n return\r\n }\r\n resolve(content)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file: file.name }), { errors: error }))\r\n }\r\n reader.readAsText(file)\r\n })\r\n },\r\n getAdditionalFiles () {\r\n return []\r\n }\r\n}\r\n"]}
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.KMLReader = undefined;
7
+
8
+ var _loglevel = require('loglevel');
9
+
10
+ var _loglevel2 = _interopRequireDefault(_loglevel);
11
+
12
+ var _i18next = require('i18next');
13
+
14
+ var _i18next2 = _interopRequireDefault(_i18next);
15
+
16
+ var _togeojson = require('@tmcw/togeojson');
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const KMLReader = exports.KMLReader = {
21
+ read(files, options) {
22
+ if (files.length !== 1) {
23
+ _loglevel2.default.debug('invlaid \'fields\' arguments');
24
+ return;
25
+ }
26
+ const file = files[0];
27
+ _loglevel2.default.debug(`reading KML file ${file.name}`);
28
+ return new Promise((resolve, reject) => {
29
+ const reader = new FileReader();
30
+ reader.onloadend = () => {
31
+ let content = reader.result;
32
+ try {
33
+ content = (0, _togeojson.kml)(new DOMParser().parseFromString(content, 'text/xml'));
34
+ } catch (error) {
35
+ _loglevel2.default.debug(error);
36
+ reject(new Error(_i18next2.default.t('errors.INVALID_KML_FILE', { file: file.name }), { errors: error }));
37
+ return;
38
+ }
39
+ resolve(content);
40
+ };
41
+ reader.onerror = error => {
42
+ _loglevel2.default.debug(error);
43
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file: file.name }), { errors: error }));
44
+ };
45
+ reader.readAsText(file);
46
+ });
47
+ },
48
+ getAdditionalFiles() {
49
+ return [];
50
+ }
51
+ };
52
+ //# sourceMappingURL=reader.kml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../map/client/readers/reader.kml.js"],"names":["KMLReader","read","files","options","length","logger","debug","file","name","Promise","resolve","reject","reader","FileReader","onloadend","content","result","DOMParser","parseFromString","error","Error","i18next","t","errors","onerror","readAsText","getAdditionalFiles"],"mappings":";;;;;;;AAAA;;;;AACA;;;;AACA;;;;AAEO,MAAMA,gCAAY;AACvBC,OAAMC,KAAN,EAAaC,OAAb,EAAsB;AACpB,QAAID,MAAME,MAAN,KAAiB,CAArB,EAAwB;AACtBC,yBAAOC,KAAP,CAAa,8BAAb;AACA;AACD;AACD,UAAMC,OAAOL,MAAM,CAAN,CAAb;AACAG,uBAAOC,KAAP,CAAc,oBAAmBC,KAAKC,IAAK,EAA3C;AACA,WAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,YAAMC,SAAS,IAAIC,UAAJ,EAAf;AACAD,aAAOE,SAAP,GAAmB,MAAM;AACvB,YAAIC,UAAUH,OAAOI,MAArB;AACA,YAAI;AACFD,oBAAU,oBAAI,IAAIE,SAAJ,GAAgBC,eAAhB,CAAgCH,OAAhC,EAAyC,UAAzC,CAAJ,CAAV;AACD,SAFD,CAEE,OAAOI,KAAP,EAAc;AACdd,6BAAOC,KAAP,CAAaa,KAAb;AACAR,iBAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,yBAAV,EAAqC,EAAEf,MAAMA,KAAKC,IAAb,EAArC,CAAV,EAAqE,EAAEe,QAAQJ,KAAV,EAArE,CAAP;AACA;AACD;AACDT,gBAAQK,OAAR;AACD,OAVD;AAWAH,aAAOY,OAAP,GAAkBL,KAAD,IAAW;AAC1Bd,2BAAOC,KAAP,CAAaa,KAAb;AACAR,eAAO,IAAIS,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,yBAAV,EAAqC,EAAEf,MAAMA,KAAKC,IAAb,EAArC,CAAV,EAAqE,EAAEe,QAAQJ,KAAV,EAArE,CAAP;AACD,OAHD;AAIAP,aAAOa,UAAP,CAAkBlB,IAAlB;AACD,KAlBM,CAAP;AAmBD,GA3BsB;AA4BvBmB,uBAAsB;AACpB,WAAO,EAAP;AACD;AA9BsB,CAAlB","file":"reader.kml.js","sourcesContent":["import logger from 'loglevel'\r\nimport i18next from 'i18next'\r\nimport { kml } from '@tmcw/togeojson'\r\n\r\nexport const KMLReader = {\r\n read (files, options) {\r\n if (files.length !== 1) {\r\n logger.debug('invlaid \\'fields\\' arguments')\r\n return\r\n }\r\n const file = files[0]\r\n logger.debug(`reading KML file ${file.name}`)\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n let content = reader.result\r\n try {\r\n content = kml(new DOMParser().parseFromString(content, 'text/xml'))\r\n } catch (error) {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.INVALID_KML_FILE', { file: file.name }), { errors: error }))\r\n return\r\n }\r\n resolve(content)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file: file.name }), { errors: error }))\r\n }\r\n reader.readAsText(file)\r\n })\r\n },\r\n getAdditionalFiles () {\r\n return []\r\n }\r\n}\r\n"]}
@@ -0,0 +1,116 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SHPReader = undefined;
7
+
8
+ var _lodash = require('lodash');
9
+
10
+ var _lodash2 = _interopRequireDefault(_lodash);
11
+
12
+ var _path = require('path');
13
+
14
+ var _path2 = _interopRequireDefault(_path);
15
+
16
+ var _loglevel = require('loglevel');
17
+
18
+ var _loglevel2 = _interopRequireDefault(_loglevel);
19
+
20
+ var _i18next = require('i18next');
21
+
22
+ var _i18next2 = _interopRequireDefault(_i18next);
23
+
24
+ var _shpjs = require('shpjs');
25
+
26
+ var _shpjs2 = _interopRequireDefault(_shpjs);
27
+
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
30
+ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
31
+
32
+ const SHPReader = exports.SHPReader = {
33
+ read(files, options) {
34
+ var _this = this;
35
+
36
+ return _asyncToGenerator(function* () {
37
+ if (files.length < 1 || files.length > _this.getAdditionalFiles().length + 1) {
38
+ _loglevel2.default.info('invlaid \'files\' arguments');
39
+ return;
40
+ }
41
+ const promises = [];
42
+ const shpFile = files[0];
43
+ promises.push(new Promise(function (resolve, reject) {
44
+ const reader = new FileReader();
45
+ reader.onloadend = function () {
46
+ resolve(reader.result);
47
+ };
48
+ reader.onerror = function (error) {
49
+ _loglevel2.default.debug(error);
50
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file: shpFile.name }), { errors: error }));
51
+ };
52
+ reader.readAsArrayBuffer(shpFile);
53
+ }));
54
+ const prjFile = _lodash2.default.find(files, function (file) {
55
+ return _path2.default.extname(file.name) === '.prj';
56
+ });
57
+ if (prjFile) {
58
+ promises.push(new Promise(function (resolve, reject) {
59
+ const reader = new FileReader();
60
+ reader.onloadend = function () {
61
+ resolve(reader.result);
62
+ };
63
+ reader.onerror = function (error) {
64
+ _loglevel2.default.debug(error);
65
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file: prjFile.name }), { errors: error }));
66
+ };
67
+ reader.readAsText(prjFile);
68
+ }));
69
+ }
70
+ const dbfFile = _lodash2.default.find(files, function (file) {
71
+ return _path2.default.extname(file.name) === '.dbf';
72
+ });
73
+ if (dbfFile) {
74
+ promises.push(new Promise(function (resolve, reject) {
75
+ const reader = new FileReader();
76
+ reader.onloadend = function () {
77
+ resolve(reader.result);
78
+ };
79
+ reader.onerror = function (error) {
80
+ _loglevel2.default.debug(error);
81
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file: dbfFile.name }), { errors: error }));
82
+ };
83
+ reader.readAsArrayBuffer(dbfFile);
84
+ }));
85
+ }
86
+ // resolver the promises
87
+ const buffers = yield Promise.all(promises);
88
+ // parse the buffers to return the geosjon content
89
+ // ff a dbFile is defined it returns a FeatureCollection
90
+ if (dbfFile) {
91
+ if (prjFile) return _shpjs2.default.combine([_shpjs2.default.parseShp(buffers[0], buffers[1]), _shpjs2.default.parseDbf(buffers[2])]);
92
+ return _shpjs2.default.combine([_shpjs2.default.parseShp(buffers[0]), _shpjs2.default.parseDbf(buffers[1])]);
93
+ }
94
+ // otherwise it returns an array of geometries that we need to convert to a FeatureCollection
95
+ let content;
96
+ if (prjFile) content = _shpjs2.default.parseShp(buffers[0], buffers[1]);
97
+ content = _shpjs2.default.parseShp(buffers[0]);
98
+ const geoJson = {
99
+ type: 'FeatureCollection',
100
+ features: []
101
+ };
102
+ _lodash2.default.forEach(content, function (geometry) {
103
+ geoJson.features.push({
104
+ type: 'Feature',
105
+ properties: {},
106
+ geometry
107
+ });
108
+ });
109
+ return geoJson;
110
+ })();
111
+ },
112
+ getAdditionalFiles() {
113
+ return ['.dbf', '.prj', '.shx', '.cpg'];
114
+ }
115
+ };
116
+ //# sourceMappingURL=reader.shp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../map/client/readers/reader.shp.js"],"names":["SHPReader","read","files","options","length","getAdditionalFiles","logger","info","promises","shpFile","push","Promise","resolve","reject","reader","FileReader","onloadend","result","onerror","error","debug","Error","i18next","t","file","name","errors","readAsArrayBuffer","prjFile","_","find","path","extname","readAsText","dbfFile","buffers","all","shp","combine","parseShp","parseDbf","content","geoJson","type","features","forEach","properties","geometry"],"mappings":"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","file":"reader.shp.js","sourcesContent":["import _ from 'lodash'\r\nimport path from 'path'\r\nimport logger from 'loglevel'\r\nimport i18next from 'i18next'\r\nimport shp from 'shpjs'\r\n\r\nexport const SHPReader = {\r\n async read (files, options) {\r\n if (files.length < 1 || files.length > this.getAdditionalFiles().length + 1) {\r\n logger.info('invlaid \\'files\\' arguments')\r\n return\r\n }\r\n const promises = []\r\n const shpFile = files[0]\r\n promises.push(new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file: shpFile.name }), { errors: error }))\r\n }\r\n reader.readAsArrayBuffer(shpFile)\r\n }))\r\n const prjFile = _.find(files, file => path.extname(file.name) === '.prj')\r\n if (prjFile) {\r\n promises.push(new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file: prjFile.name }), { errors: error }))\r\n }\r\n reader.readAsText(prjFile)\r\n }))\r\n }\r\n const dbfFile = _.find(files, file => path.extname(file.name) === '.dbf')\r\n if (dbfFile) {\r\n promises.push(new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file: dbfFile.name }), { errors: error }))\r\n }\r\n reader.readAsArrayBuffer(dbfFile)\r\n }))\r\n }\r\n // resolver the promises\r\n const buffers = await Promise.all(promises)\r\n // parse the buffers to return the geosjon content\r\n // ff a dbFile is defined it returns a FeatureCollection\r\n if (dbfFile) {\r\n if (prjFile) return shp.combine([shp.parseShp(buffers[0], buffers[1]), shp.parseDbf(buffers[2])])\r\n return shp.combine([shp.parseShp(buffers[0]), shp.parseDbf(buffers[1])])\r\n }\r\n // otherwise it returns an array of geometries that we need to convert to a FeatureCollection\r\n let content\r\n if (prjFile) content = shp.parseShp(buffers[0], buffers[1])\r\n content = shp.parseShp(buffers[0])\r\n const geoJson = {\r\n type: 'FeatureCollection',\r\n features: []\r\n }\r\n _.forEach(content, geometry => {\r\n geoJson.features.push({\r\n type: 'Feature',\r\n properties: {},\r\n geometry\r\n })\r\n })\r\n return geoJson\r\n },\r\n getAdditionalFiles () {\r\n return ['.dbf', '.prj', '.shx', '.cpg']\r\n }\r\n}\r\n"]}