@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
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <q-scroll-area :style="computedStyle">
2
+ <k-scroll-area :maxHeight="scrollAreaMaxHeight" :style="innerStyle">
3
3
  <q-list dense bordered>
4
4
  <slot name="header" />
5
5
  <k-layers-selector
@@ -26,7 +26,7 @@
26
26
  </template>
27
27
  <slot name="footer" />
28
28
  </q-list>
29
- </q-scroll-area>
29
+ </k-scroll-area>
30
30
  </template>
31
31
 
32
32
  <script>
@@ -65,10 +65,21 @@ export default {
65
65
  }
66
66
  },
67
67
  computed: {
68
- computedStyle () {
69
- if (this.$q.screen.lt.md) return 'height: 65vh; min-width: 300px;'
70
- if (this.$q.screen.lt.lg) return 'height: 70vh; min-width: 350px;'
71
- return 'height: 75vh; min-width: 400px;'
68
+ innerStyle () {
69
+ const screenHeight = this.$q.screen.height
70
+ this.scrollAreaMaxHeight = screenHeight * 0.75 // 75vh
71
+ let width = 420
72
+ if (this.$q.screen.lt.sm) {
73
+ this.scrollAreaMaxHeight = screenHeight * 0.60
74
+ width = 300
75
+ } else if (this.$q.screen.lt.md) {
76
+ this.scrollAreaMaxHeight = screenHeight * 0.65
77
+ width = 340
78
+ } else if (this.$q.screen.lt.lg) {
79
+ this.scrollAreaMaxHeight = screenHeight * 0.70
80
+ width = 380
81
+ }
82
+ return `height: ${this.scrollAreaMaxHeight}px; width: ${width}px`
72
83
  },
73
84
  layersByCategory () {
74
85
  const layers = _.values(this.layers)
@@ -95,6 +106,11 @@ export default {
95
106
  return _.difference(layers, categories)
96
107
  }
97
108
  },
109
+ data () {
110
+ return {
111
+ scrollAreaMaxHeight: 0
112
+ }
113
+ },
98
114
  methods: {
99
115
  getId (category) {
100
116
  return _.kebabCase(category.name)
@@ -128,10 +144,13 @@ export default {
128
144
  })
129
145
  }
130
146
  },
131
- created () {
147
+ beforeCreate () {
132
148
  // Load the required components
149
+ this.$options.components['k-scroll-area'] = this.$load('frame/KScrollArea')
133
150
  this.$options.components['k-panel'] = this.$load('frame/KPanel')
134
151
  this.$options.components['k-layers-selector'] = this.$load('catalog/KLayersSelector')
152
+ },
153
+ created () {
135
154
  // Categorize layers
136
155
  this.categorize()
137
156
  }
@@ -55,7 +55,7 @@ export default {
55
55
  field: {
56
56
  component: 'form/KFileField',
57
57
  label: 'KImportLayer.FILE_FIELD_LABEL',
58
- mimeTypes: '.json,.geojson,application/json,application/geo+json'
58
+ mimeTypes: '.json,.geojson,.gpx,.kml'
59
59
  }
60
60
  }
61
61
  },
@@ -88,8 +88,6 @@ export default {
88
88
  },
89
89
  featureId: {
90
90
  type: 'string',
91
- maxLength: 256,
92
- minLength: 2,
93
91
  default: this.guessFeatureId(),
94
92
  field: {
95
93
  component: 'form/KSelectField',
@@ -98,7 +96,7 @@ export default {
98
96
  }
99
97
  }
100
98
  },
101
- required: ['name', 'featureId']
99
+ required: ['name']
102
100
  }
103
101
  },
104
102
  onFileFormFieldChanged (field, value) {
@@ -122,10 +120,10 @@ export default {
122
120
  if (this.file) {
123
121
  const properties = _.keys(_.get(this.file, 'schema.properties', {}))
124
122
  for (const prop of properties) {
125
- if (prop.toLowerCase().includes('id', 'fid', 'featureid', '_id', 'objectid')) return prop
123
+ if (_.indexOf(['id', 'fid', 'featureid', '_id', 'objectid'], prop.toLowerCase()) >= 0) return prop
126
124
  }
127
125
  }
128
- return ''
126
+ return undefined
129
127
  },
130
128
  onClose () {
131
129
  this.$emit('done')
@@ -135,37 +133,12 @@ export default {
135
133
  const propertiesResult = this.$refs.propertiesForm.validate()
136
134
  if (!fileResult.isValid || !propertiesResult.isValid) return
137
135
  this.importing = true
138
- // Create the layer accordingly the input fields
139
- const geoJson = this.file.content
140
- // Create an empty layer used as a container
141
- const engine = {
142
- type: 'geoJson',
143
- isVisible: true,
144
- realtime: true
145
- }
146
- const newLayer = {
136
+ await this.kActivity.addGeoJsonLayer({
147
137
  name: propertiesResult.values.name,
148
138
  description: propertiesResult.values.description,
149
- type: 'OverlayLayer',
150
- icon: 'insert_drive_file',
151
- scope: 'user',
152
- isDataEditable: true, // Flag as editable
153
- featureId: propertiesResult.values.featureId,
154
- leaflet: engine,
155
- // Avoid sharing reference to the same object although options are similar
156
- // otherwise updating one will automatically update the other one
157
- cesium: Object.assign({}, engine),
158
- schema: {
159
- name: this.file.name,
160
- content: this.file.schema
161
- }
162
- }
163
- await this.kActivity.addLayer(newLayer)
164
- // Assign the features to the layer
165
- await this.kActivity.updateLayer(newLayer.name, geoJson)
166
- // Zoom to it
167
- if (geoJson.bbox) this.kActivity.zoomToBBox(geoJson.bbox)
168
- else this.kActivity.zoomToLayer(newLayer.name)
139
+ schema: { name: this.file.name, content: this.file.schema },
140
+ featureId: propertiesResult.values.featureId
141
+ }, this.file.content)
169
142
  this.importing = false
170
143
  this.$emit('done')
171
144
  }
@@ -7,8 +7,9 @@
7
7
  :buttons="buttons"
8
8
  v-model="isModalOpened"
9
9
  @opened="$emit('opened')"
10
- @closed="$emit('closed')">
11
- <div slot="modal-content" id="layer-categories-content">
10
+ @closed="$emit('closed')"
11
+ >
12
+ <div id="layer-categories-content">
12
13
  <q-card-section id="layer-categories-list" v-if="mode === 'list'">
13
14
  <k-list
14
15
  style="min-height: 50px; min-width: 200px"
@@ -3,9 +3,9 @@
3
3
  <slot name="header" />
4
4
  <div v-if="layers.length > 0">
5
5
  <template v-for="layer in layers">
6
- <div :key="getId(layer)" :id="getId(layer)" class="row items-center justify-between q-pl-md q-pr-sm no-span">
6
+ <div :key="getId(layer)" :id="getId(layer)" class="full-width row items-center q-pl-md q-pr-sm no-wrap">
7
7
  <!-- Layer name -->
8
- <div v-bind:class="{
8
+ <div class="ellipsis" v-bind:class="{
9
9
  'text-primary text-weight-bold': layer.isVisible,
10
10
  'text-grey-6': layer.isDisabled
11
11
  }">
@@ -22,11 +22,11 @@
22
22
  </q-tooltip>
23
23
  </div>
24
24
  <q-space />
25
- <q-icon name="las la-exclamation-circle" size="md" color="warning" v-if="layer.isDisabled">
25
+ <q-icon name="las la-exclamation-circle" size="sm" color="warning" v-if="layer.isDisabled">
26
26
  <q-tooltip>{{ $t('KLayersSelector.LAYER_DISABLED') }}</q-tooltip>
27
27
  </q-icon>
28
28
  <!-- Layer toggle -->
29
- <q-toggle :value="layer.isVisible" :disable="layer.isDisabled" @input="onLayerClicked(layer)"/>
29
+ <q-toggle :value="layer.isVisible" :disable="layer.isDisabled" size="sm" @input="onLayerClicked(layer)" />
30
30
  <!-- Layer actions -->
31
31
  <k-panel
32
32
  :id="`${layer.name}-actions`"
@@ -37,7 +37,7 @@
37
37
  </div>
38
38
  </template>
39
39
  </div>
40
- <div v-else-if="!options.hideIfEmpty" class="row justify-center q-pb-sm">
40
+ <div v-else-if="!options.hideIfEmpty" class="row justify-center q-pa-sm">
41
41
  <k-stamp icon="las la-exclamation-circle" icon-size="sm" :text="$t('KLayersSelector.NO_LAYER_AVAILABLE')" direction="horizontal" />
42
42
  </div>
43
43
  <slot name="footer" />
@@ -66,7 +66,9 @@ export default {
66
66
  },
67
67
  methods: {
68
68
  getId (layer) {
69
- return _.kebabCase(layer.name)
69
+ const name = _.kebabCase(layer.name)
70
+ if (_.startsWith(name, 'layers-')) return name
71
+ return 'layers-' + name
70
72
  },
71
73
  layerIcon (layer) {
72
74
  return utils.getIconName(layer, 'icon')
@@ -33,7 +33,7 @@
33
33
  </template>
34
34
  </k-layers-selector>
35
35
  </div>
36
- <div v-else class="row justify-center q-pb-sm">
36
+ <div v-else class="row justify-center q-pa-sm">
37
37
  <k-stamp icon="las la-exclamation-circle" icon-size="sm" :text="$t('KWeatherLayersSelector.NO_MODEL_AVAILABLE')" direction="horizontal" />
38
38
  </div>
39
39
  </template>
@@ -1,10 +1,10 @@
1
1
  <template>
2
- <div :style="widgetStyle()">
2
+ <div :style="widgetStyle">
3
3
  <div v-if="schema && properties" class="fit row">
4
4
  <k-panel id="information-box-actions" class="q-pa-sm" :content="actions" direction="vertical" />
5
- <q-scroll-area class="col fit" :thumb-style="thumbStyle" :bar-style="barStyle">
5
+ <k-scroll-area class="col" :maxHeight="widgetHeight">
6
6
  <k-view class="q-pa-md" :schema="schema" :values="properties" :separators="true" />
7
- </q-scroll-area>
7
+ </k-scroll-area>
8
8
  </div>
9
9
  <div v-else class="absolute-center">
10
10
  <k-stamp icon="las la-exclamation-circle" icon-size="3rem" :text="$t('KInformationBox.NO_FEATURE_PROPERTIES')" />
@@ -14,7 +14,7 @@
14
14
 
15
15
  <script>
16
16
  import _ from 'lodash'
17
- import { colors, copyToClipboard, exportFile } from 'quasar'
17
+ import { copyToClipboard, exportFile } from 'quasar'
18
18
  import { baseWidget } from '../../../../core/client/mixins'
19
19
  import { generatePropertiesSchema } from '../../utils'
20
20
 
@@ -34,18 +34,6 @@ export default {
34
34
  },
35
35
  data () {
36
36
  return {
37
- thumbStyle: {
38
- right: '4px',
39
- borderRadius: '5px',
40
- backgroundColor: colors.getBrand('primary'),
41
- width: '6px'
42
- },
43
- barStyle: {
44
- right: '2px',
45
- borderRadius: '5px',
46
- backgroundColor: colors.getBrand('accent'),
47
- width: '10px'
48
- },
49
37
  schema: null,
50
38
  properties: null,
51
39
  actions: []
@@ -115,11 +103,14 @@ export default {
115
103
  }
116
104
  }
117
105
  },
118
- created () {
106
+ beforeCreate () {
119
107
  // laod the required components
108
+ this.$options.components['k-scroll-area'] = this.$load('frame/KScrollArea')
120
109
  this.$options.components['k-panel'] = this.$load('frame/KPanel')
121
110
  this.$options.components['k-view'] = this.$load('form/KView')
122
111
  this.$options.components['k-stamp'] = this.$load('frame/KStamp')
112
+ },
113
+ created () {
123
114
  // Registers the actions
124
115
  this.actions = {
125
116
  default: [
@@ -1,6 +1,7 @@
1
1
  <template>
2
- <div :style="widgetStyle()">
2
+ <div :style="widgetStyle">
3
3
  <div class="fit row">
4
+ <q-resize-observer @resize="onResized" />
4
5
  <k-panel id="mapillary-actions" class="q-pa-sm" :content="actions" direction="vertical" />
5
6
  <div class="col" id="mapillary-container"></div>
6
7
  </div>
@@ -123,6 +124,9 @@ export default {
123
124
  this.bearing = await this.mapillaryViewer.getBearing()
124
125
  this.centerMap()
125
126
  this.kActivity.updateSelectionHighlight('mapillary', this.getMarkerFeature())
127
+ },
128
+ onResized () {
129
+ if (this.mapillaryViewer) this.mapillaryViewer.resize()
126
130
  }
127
131
  },
128
132
  beforeCreate () {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div :style="widgetStyle()">
2
+ <div :style="widgetStyle">
3
3
  <div class="fit row">
4
4
  <q-resize-observer @resize="onResized" />
5
5
  <!-- Actions -->
@@ -32,12 +32,15 @@ import centroid from '@turf/centroid'
32
32
  import chroma from 'chroma-js'
33
33
  import Chart from 'chart.js'
34
34
  import 'chartjs-plugin-annotation'
35
+ import Papa from 'papaparse'
35
36
  import { getTimeInterval } from '../../utils'
37
+ import { downloadAsBlob } from '../../../../core/client/utils'
38
+ import { Units } from '../../../../core/client/units'
36
39
  import { Time } from '../../../../core/client/time'
37
40
  import { baseWidget } from '../../../../core/client/mixins'
38
41
 
39
42
  export default {
40
- name: 'k-time-series-widget',
43
+ name: 'k-time-series',
41
44
  inject: ['kActivity'],
42
45
  mixins: [baseWidget],
43
46
  props: {
@@ -101,6 +104,10 @@ export default {
101
104
  hasVariable (name, properties) {
102
105
  return (properties[name] && Array.isArray(properties[name]))
103
106
  },
107
+ getSelectedRunTime () {
108
+ // Set default run as latest
109
+ return this.runTime || _.last(this.runTimes)
110
+ },
104
111
  setupTimeTicks () {
105
112
  if (!this.times || !this.graphWidth) return
106
113
  // Choose the right step size to ensure we have almost 100px between hour ticks
@@ -145,24 +152,50 @@ export default {
145
152
  this.timeRange = null
146
153
  }
147
154
  },
155
+ setupAvailableRunTimes () {
156
+ this.runTimes = []
157
+ const runTime = this.probedLocation.runTime
158
+ this.probedVariables.forEach(variable => {
159
+ if (!variable.runTimes) return
160
+ // Check if we are targetting a specific level
161
+ const name = (this.kActivity.selectedLevel ? `${variable.name}-${this.kActivity.selectedLevel}` : variable.name)
162
+
163
+ if (runTime && runTime[name]) this.runTimes.push(runTime[name])
164
+ })
165
+ // Make union of all available run times
166
+ this.runTimes = _.union(...this.runTimes).map(time => moment.utc(time)).sort((a, b) => a - b)
167
+ },
148
168
  setupAvailableDatasets () {
149
169
  this.datasets = []
150
170
  const time = this.probedLocation.time || this.probedLocation.forecastTime
171
+ const runTime = this.probedLocation.runTime
151
172
  const properties = this.probedLocation.properties
152
173
  // Generate a color palette in case the variables does not provide it
153
174
  const colors = _.shuffle(chroma.scale('Spectral').colors(this.probedVariables.length))
154
175
  this.probedVariables.forEach((variable, index) => {
155
176
  // Check if we are targetting a specific level
156
177
  const name = (this.kActivity.selectedLevel ? `${variable.name}-${this.kActivity.selectedLevel}` : variable.name)
157
- const unit = variable.units[0]
178
+ // Falback to base unit
179
+ const baseUnit = variable.units[0]
180
+ // Get default unit for this quantity instead if available
181
+ const defaultUnit = Units.getDefaultUnit(baseUnit)
182
+ const unit = (variable.units.includes(defaultUnit) ? defaultUnit : baseUnit)
158
183
  const label = this.$t(variable.label) || variable.label
159
184
  // Aggregated variable available for feature ?
160
185
  if (this.hasVariable(name, properties)) {
186
+ // Build data structure as expected by visualisation
187
+ let values = properties[name].map((value, index) => ({ x: time[name][index], y: Units.convert(value, baseUnit, unit) }))
188
+ // Keep only selected value if multiple are provided for the same time (eg different forecasts)
189
+ if (variable.runTimes && !_.isEmpty(_.get(runTime, name)) && this.getSelectedRunTime()) {
190
+ values = values.filter((value, index) => (runTime[name][index] === this.getSelectedRunTime().toISOString()))
191
+ } else values = _.uniqBy(values, 'x')
192
+ // Then transform to date object as expected by visualisation
193
+ values = values.map((value) => Object.assign(value, { x: new Date(value.x) })).filter(this.filter)
161
194
  this.datasets.push(_.merge({
162
- label: `${label} (${unit})`,
195
+ label: `${label} (${Units.getUnitSymbol(unit)})`,
163
196
  borderColor: colors[index],
164
197
  backgroundColor: colors[index],
165
- data: properties[name].map((value, index) => ({ x: new Date(time[name][index]), y: value })).filter(this.filter),
198
+ data: values,
166
199
  yAxisID: unit
167
200
  }, _.omit(variable.chartjs, 'yAxis')))
168
201
  }
@@ -176,7 +209,11 @@ export default {
176
209
  this.probedVariables.forEach(variable => {
177
210
  // Check if we are targetting a specific level
178
211
  const name = (this.kActivity.selectedLevel ? `${variable.name}-${this.kActivity.selectedLevel}` : variable.name)
179
- const unit = variable.units[0]
212
+ // Falback to base unit
213
+ const baseUnit = variable.units[0]
214
+ // Get default unit for this quantity instead if available
215
+ const defaultUnit = Units.getDefaultUnit(baseUnit)
216
+ const unit = (variable.units.includes(defaultUnit) ? defaultUnit : baseUnit)
180
217
  // Variable available for feature ?
181
218
  // Check also if axis already created
182
219
  if (this.hasVariable(name, properties) && !_.find(this.yAxes, axis => axis.id === unit)) {
@@ -185,7 +222,7 @@ export default {
185
222
  position: isLeft ? 'left' : 'right',
186
223
  scaleLabel: {
187
224
  display: true,
188
- labelString: unit
225
+ labelString: Units.getUnitSymbol(unit)
189
226
  }
190
227
  }, _.get(variable.chartjs, 'yAxis', {})))
191
228
  // Alternate axes by default
@@ -276,6 +313,7 @@ export default {
276
313
  // Setup the graph
277
314
  this.setupAvailableTimes()
278
315
  this.setupTimeTicks()
316
+ this.setupAvailableRunTimes()
279
317
  this.setupAvailableDatasets()
280
318
  this.setupAvailableYAxes()
281
319
 
@@ -381,6 +419,14 @@ export default {
381
419
  onUpdateSpan (span) {
382
420
  this.$store.set('timeseries.span', span)
383
421
  },
422
+ onUpdateRun (runTime) {
423
+ this.runTime = runTime
424
+ // Update tooltip action
425
+ const action = _.find(this.actions, { id: 'run-options' })
426
+ action.tooltip = this.$t('KTimeSeries.RUN') + ' (' + Time.format(this.getSelectedRunTime(), 'date.short') +
427
+ ' - ' + Time.format(this.getSelectedRunTime(), 'time.short') + ')'
428
+ this.setupGraph()
429
+ },
384
430
  updateProbedLocationHighlight () {
385
431
  if (!this.probedLocation) return
386
432
  const windDirection = (this.kActivity.selectedLevel ? `windDirection-${this.kActivity.selectedLevel}` : 'windDirection')
@@ -397,6 +443,20 @@ export default {
397
443
  onCenterOn () {
398
444
  this.kActivity.centerOnSelection()
399
445
  },
446
+ onExportSeries () {
447
+ const json = this.times.map(time => {
448
+ const row = {
449
+ [this.$t('KTimeSeries.TIME_LABEL')]: time.toISOString()
450
+ }
451
+ this.datasets.forEach(dataset => {
452
+ const value = _.find(dataset.data, item => item.x.toISOString() === time.toISOString())
453
+ row[dataset.label] = value ? value.y : null
454
+ })
455
+ return row
456
+ })
457
+ const csv = Papa.unparse(json)
458
+ downloadAsBlob(csv, this.$t('KTimeSeries.SERIES_EXPORT_FILE'), 'text/csv;charset=utf-8;')
459
+ },
400
460
  updateProbedLocationName () {
401
461
  this.probedLocationName = ''
402
462
  if (!this.probedLocation) return
@@ -420,9 +480,10 @@ export default {
420
480
  option.default = true
421
481
  }
422
482
  })
423
- // Registers the actions
483
+ // Registers the base actions
424
484
  this.actions = [
425
485
  { id: 'center-view', icon: 'las la-eye', tooltip: 'KTimeSeries.CENTER_ON', handler: this.onCenterOn },
486
+ { id: 'export-feature', icon: 'las la-file-download', tooltip: this.$t('KTimeSeries.EXPORT_SERIES'), handler: this.onExportSeries },
426
487
  {
427
488
  component: 'input/KOptionsChooser',
428
489
  id: 'timespan-options',
@@ -432,6 +493,8 @@ export default {
432
493
  on: { event: 'option-chosen', listener: this.onUpdateSpan }
433
494
  }
434
495
  ]
496
+ // Clear previous run timle setup if any
497
+ this.runTime = null
435
498
  // Then manage selection
436
499
  this.kActivity.addSelectionHighlight('time-series')
437
500
  this.kActivity.centerOnSelection()
@@ -459,8 +522,28 @@ export default {
459
522
  (name ? ` (${name})` : ` (${longitude.toFixed(2)}°, ${latitude.toFixed(2)}°)`))
460
523
  }
461
524
  this.updateProbedLocationName()
462
- this.setupGraph()
525
+ await this.setupGraph()
463
526
  this.updateProbedLocationHighlight()
527
+
528
+ // When forecast data are available allow to select wich run to use
529
+ if (this.runTimes && (this.runTimes.length > 1)) {
530
+ // Select latest runTime as default option
531
+ const runOptions = this.runTimes.map(runTime => ({
532
+ label: Time.format(runTime, 'date.short') + ' - ' + Time.format(runTime, 'time.short'),
533
+ value: runTime
534
+ }))
535
+ _.last(runOptions).default = true
536
+ // Registers the action
537
+ this.actions.push({
538
+ component: 'input/KOptionsChooser',
539
+ id: 'run-options',
540
+ icon: 'las la-clock',
541
+ tooltip: this.$t('KTimeSeries.RUN') + ' (' + Time.format(this.getSelectedRunTime(), 'date.short') +
542
+ ' - ' + Time.format(this.getSelectedRunTime(), 'time.short') + ')',
543
+ options: runOptions,
544
+ on: { event: 'option-chosen', listener: this.onUpdateRun }
545
+ })
546
+ }
464
547
  }
465
548
  },
466
549
  created () {
@@ -11,7 +11,11 @@
11
11
  "ALERTS_LIMIT": "Too much alerts to display all of them",
12
12
  "FILE_IMPORT_ERROR": "File import has failed",
13
13
  "CANNOT_CHECK_ALERT_MISSING_SERVICE": "Last check failed due to unavailable service",
14
- "CANNOT_CHECK_ALERT_MISSING_DATA": "Last check failed due to unavailable data"
14
+ "CANNOT_CHECK_ALERT_MISSING_DATA": "Last check failed due to unavailable data",
15
+ "INVALID_GEOJSON_FILE": "{{file}} is not a valid GeoJSON file",
16
+ "INVALID_GEOJSON_CRS": "{{file}} has an unsupported Coordinates Reference System (CRS)",
17
+ "INVALID_GPX_FILE": "{{file}} is not a valid GPX file",
18
+ "INVALID_KML_FILE": "{{file}} is not a valid KML file"
15
19
  },
16
20
  "mixins": {
17
21
  "navigator": {
@@ -21,7 +25,7 @@
21
25
  "IMPORTED_DATA_NAME": "My data"
22
26
  },
23
27
  "legend": {
24
- "CONVERT_UNITS": "{{layer}}: convert to {{unit}}"
28
+ "CONVERT_UNITS": "Click to change unit"
25
29
  },
26
30
  "activity": {
27
31
  "ADD_LAYER": "Add a new layer",
@@ -65,7 +69,8 @@
65
69
  "SYNCHRONIZE_TIMELINE_LABEL": "Synchronize with timeline",
66
70
  "TOOLS": "Tools",
67
71
  "SAVE_LAYER_EDITION_CHANGES": "Save edition changes",
68
- "DISCARD_LAYER_EDITION_CHANGES": "Discard edition changes"
72
+ "DISCARD_LAYER_EDITION_CHANGES": "Discard edition changes",
73
+ "CAPTURE_VIEW": "Capture the view"
69
74
  },
70
75
  "timeseries": {
71
76
  "FORECAST_PROBE": "Forecast"
@@ -202,21 +207,6 @@
202
207
  "LAYER_CATEGORY_ICON_FIELD_LABEL": "Select an icon for this category",
203
208
  "LAYER_CATEGORY_LAYERS_FIELD_LABEL": "Select the layers in this category",
204
209
  "LAYER_CATEGORY_EXCLUSIVE_FIELD_LABEL": "Make selection exclusive within this category",
205
- "UPDATE_SETTINGS_TITLE": "Your settings",
206
- "TIME_FORMAT_SETTINGS": "Time/Date format",
207
- "TIME_FORMAT_SHORT_TIME_FIELD_LABEL": "Short time format",
208
- "TIME_FORMAT_SHORT_TIME_FIELD_HELPER": "<a target='_blank' href='https://momentjs.com/docs/#/displaying/format/'>&#x1F6C8;</a>",
209
- "TIME_FORMAT_LONG_TIME_FIELD_LABEL": "Long time format",
210
- "TIME_FORMAT_LONG_TIME_FIELD_HELPER": "<a target='_blank' href='https://momentjs.com/docs/#/displaying/format/'>&#x1F6C8;</a>",
211
- "TIME_FORMAT_SHORT_DATE_FIELD_LABEL": "Short date format",
212
- "TIME_FORMAT_SHORT_DATE_FIELD_HELPER": "<a target='_blank' href='https://momentjs.com/docs/#/displaying/format/'>&#x1F6C8;</a>",
213
- "TIME_FORMAT_LONG_DATE_FIELD_LABEL": "Long date format",
214
- "TIME_FORMAT_LONG_DATE_FIELD_HELPER": "<a target='_blank' href='https://momentjs.com/docs/#/displaying/format/'>&#x1F6C8;</a>",
215
- "TIME_FORMAT_SHORT_YEAR_FIELD_LABEL": "Short year format",
216
- "TIME_FORMAT_SHORT_YEAR_FIELD_HELPER": "<a target='_blank' href='https://momentjs.com/docs/#/displaying/format/'>&#x1F6C8;</a>",
217
- "TIME_FORMAT_LONG_YEAR_FIELD_LABEL": "Long year format",
218
- "TIME_FORMAT_LONG_YEAR_FIELD_HELPER": "<a target='_blank' href='https://momentjs.com/docs/#/displaying/format/'>&#x1F6C8;</a>",
219
- "TIME_FORMAT_UTC_FIELD_LABEL": "UTC time display mode",
220
210
  "MAP_SETTINGS": "Map parameters",
221
211
  "RESTORE_VIEW_FIELD_LABEL": "Save current extent",
222
212
  "RESTORE_LAYERS_FIELD_LABEL": "Save active layers",
@@ -224,6 +214,7 @@
224
214
  "LOCATION_FORMAT_HELPER": "<a target='_blank' href='https://github.com/nerik/formatcoords#formatting'>&#x1F6C8;</a>",
225
215
  "TIMELINE_SETTINGS": "Timeline parameters",
226
216
  "TIMELINE_STEP": "Timeline step (in minutes)",
217
+ "TIMELINE_INTERVAL": "Real-time data refresh update interval",
227
218
  "TIMESERIES_SETTINGS": "Timeseries parameters",
228
219
  "TIMESERIES_SPAN": "Timeseries span (in hours)"
229
220
  },
@@ -244,6 +235,13 @@
244
235
  "COPY_LOCATION_LABEL": "Copy the coordinates in your clipboard using this button.",
245
236
  "LOCATION_TRACKING_LABEL": "Drag the screen to display the coordinates of its center and release to keep track of it.",
246
237
  "TRACK_BACK_LABEL": "Then stop tracking by going back to the actions.",
238
+ "MEASURE_LABEL": "Activate measure tools using this button.",
239
+ "MEASURE_DISTANCE_LABEL": "Measure a distance using this button.",
240
+ "MEASURE_DISTANCE_DETAILS_LABEL": "Draw the line segment(s) you'd like to measure on the map and hover any elements to get measure information.",
241
+ "MEASURE_AREA_LABEL": "Measure an area using this button.",
242
+ "MEASURE_AREA_DETAILS_LABEL": "Draw the polygons(s) you'd like to measure on the map and hover any elements to get measure information.",
243
+ "CLEAR_MEASURE_LABEL": "Clear your current measurements using this button.",
244
+ "MEASURE_BACK_LABEL": "Then stop measuring by going back to the actions.",
247
245
  "TOGGLE_VR_LABEL": "Switch to Virtual Reality (VR) mode with this button.",
248
246
  "TOGGLE_FULLSCREEN_LABEL": "Switch to fullscreen mode with this button.",
249
247
  "TOGGLE_CATALOG_LABEL": "Open the catalog with this button."
@@ -359,13 +357,19 @@
359
357
  "KTimeSeries": {
360
358
  "NO_DATA_AVAILABLE": "No data available",
361
359
  "CENTER_ON": "Center the view on the probed location",
362
- "SPAN": "Timeseries span"
360
+ "SPAN": "Timeseries span",
361
+ "RUN": "Forecast run",
362
+ "TIME_LABEL": "Time",
363
+ "EXPORT_SERIES": "Export data",
364
+ "SERIES_EXPORT_FILE": "Series.csv"
363
365
  },
364
366
  "KCatalogPanel": {
365
367
  "BASE_LAYERS": "Base Layers",
366
368
  "TERRAIN_LAYERS": "Terrain layers",
367
369
  "OVERLAY_LAYERS": "My layers",
368
370
  "MEASURE_LAYERS": "Measure layers",
371
+ "INFRASTRUCTURE_LAYERS": "Infrastructures",
372
+ "ADMINISTRATIVE_LAYERS": "Administrative",
369
373
  "METEO_LAYERS": "Meteo forecasts",
370
374
  "BUSINESS_LAYERS": "Business layers",
371
375
  "CAPTURED_LAYERS": "Captured views",
@@ -410,9 +414,10 @@
410
414
  },
411
415
  "KLayerStyleForm": {
412
416
  "BASE": "Base properties",
413
- "DEFAULT_VISIBILITY": "Visibilité par défaut",
417
+ "DEFAULT_VISIBILITY": "Visible by default",
414
418
  "MIN_ZOOM": "Visible from level",
415
419
  "MAX_ZOOM": "Visible until level",
420
+ "SELECTABLE": "Selectable",
416
421
  "LAYER_OPACITY": "Transparent layer",
417
422
  "OPACITY": "Opacity",
418
423
  "POINTS": "Markers",
@@ -549,5 +554,31 @@
549
554
  "EDIT_PROPERTIES": "Edit feature properties",
550
555
  "DRAG_FEATURES": "Move features",
551
556
  "REMOVE_FEATURES": "Remove features"
557
+ },
558
+ "KCaptureToolbar": {
559
+ "SD_LABEL": "Standard Definition",
560
+ "SD_DESCRIPTION": "4:3, 640 x 480",
561
+ "HD_LABEL": "High Definition",
562
+ "HD_DESCRIPTION": "16:9, 1280 x 720",
563
+ "FHD_LABEL": "Full HD",
564
+ "FHD_DESCRIPTION": "16:9, 1920 x 1080",
565
+ "QHD_LABEL": "Quad HD",
566
+ "QHD_DESCRIPTION": "16:9, 2560 x 1440",
567
+ "2K_LABEL": "2K",
568
+ "2K_DESCRIPTION": "1:1.77, 2048 x 1080",
569
+ "4K_LABEL": "4K or Ultra HD",
570
+ "4K_DESCRIPTION": "1:1.9, 3840 x 2160",
571
+ "8K_LABEL": "8K or Full Ultra HD",
572
+ "8K_DESCRIPTION": "16∶9, 7680 x 4320",
573
+ "CAPTURE_ACTION": "Capture view",
574
+ "CAPTURING_VIEW": "Waiting for capturing view"
575
+ },
576
+ "KMeasureTool": {
577
+ "TOOL_BUTTON_LABEL": "Display the measure tool",
578
+ "CLEAR": "Clear all measurements",
579
+ "MEASURE_DISTANCE": "Measure a distance",
580
+ "MEASURE_AREA": "Measure an area",
581
+ "DISPLAY_MEASURE_VALUE": "Display measure values",
582
+ "CLICK_TO_CHANGE_UNIT": "Click to change unit"
552
583
  }
553
584
  }