@kalisio/kdk 2.4.0 → 2.5.1

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 (647) hide show
  1. package/core/api/application.js +12 -12
  2. package/core/api/authentication.js +51 -7
  3. package/core/api/hooks/hooks.authentication.js +1 -59
  4. package/core/api/hooks/hooks.authorisations.js +8 -102
  5. package/core/api/hooks/hooks.model.js +4 -0
  6. package/core/api/hooks/hooks.push.js +18 -14
  7. package/core/api/hooks/hooks.users.js +0 -91
  8. package/core/api/hooks/index.js +0 -2
  9. package/core/api/services/account/account.service.js +1 -1
  10. package/core/api/services/authorisations/authorisations.service.js +28 -29
  11. package/core/api/services/index.js +38 -50
  12. package/core/api/services/messages/messages.hooks.js +4 -3
  13. package/core/api/services/users/users.service.js +5 -0
  14. package/core/client/api.js +182 -71
  15. package/core/client/broadcaster.js +20 -0
  16. package/core/client/capabilities.js +17 -7
  17. package/core/client/components/KActivity.vue +29 -34
  18. package/core/client/components/KAvatar.vue +0 -6
  19. package/core/client/components/KChip.vue +142 -39
  20. package/core/client/components/KContent.vue +13 -32
  21. package/core/client/components/KDialog.vue +29 -8
  22. package/core/client/components/KEditor.vue +120 -0
  23. package/core/client/components/KFollower.vue +75 -0
  24. package/core/client/components/KLogo.vue +2 -3
  25. package/core/client/components/KModal.vue +30 -10
  26. package/core/client/components/KSponsor.vue +1 -1
  27. package/core/client/components/KTextArea.vue +2 -5
  28. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  29. package/core/client/components/account/KProfile.vue +52 -14
  30. package/core/client/components/account/KSubscription.vue +19 -9
  31. package/core/client/components/account/KSubscriptionsManager.vue +10 -11
  32. package/core/client/components/action/KAction.vue +44 -24
  33. package/core/client/components/action/KBugReportAction.vue +4 -5
  34. package/core/client/components/action/KToggleStickyVisibility.vue +41 -0
  35. package/core/client/components/action/KToggleWidgetVisibility.vue +41 -0
  36. package/core/client/components/app/KPlatform.vue +122 -35
  37. package/core/client/components/app/KRequestProgressBar.vue +59 -0
  38. package/core/client/components/app/KSettings.vue +13 -2
  39. package/core/client/components/app/KTour.vue +2 -2
  40. package/core/client/components/chart/KTimeSeriesChart.vue +11 -3
  41. package/core/client/components/collection/KCard.vue +27 -33
  42. package/core/client/components/collection/KCardSection.vue +3 -23
  43. package/core/client/components/collection/KColumn.vue +0 -5
  44. package/core/client/components/collection/KDescriptionCardSection.vue +10 -5
  45. package/core/client/components/collection/KFilterView.vue +15 -0
  46. package/core/client/components/collection/KGrid.vue +4 -9
  47. package/core/client/components/collection/KHistory.vue +0 -5
  48. package/core/client/components/collection/KHistoryEntry.vue +0 -2
  49. package/core/client/components/collection/KItem.vue +1 -2
  50. package/core/client/components/collection/KSearchFilterControl.vue +139 -0
  51. package/core/client/components/collection/KTable.vue +1 -4
  52. package/core/client/components/collection/KTagsFilterControl.vue +70 -0
  53. package/core/client/components/collection/KTagsFilterView.vue +61 -0
  54. package/core/client/components/collection/KTimeFilterControl.vue +40 -0
  55. package/core/client/components/collection/KTimeFilterView.vue +106 -0
  56. package/core/client/components/collection/KTimeLine.vue +18 -11
  57. package/core/client/components/document/KBrowser.vue +283 -0
  58. package/core/client/components/document/KCsv.vue +52 -0
  59. package/core/client/components/document/KDocument.vue +19 -5
  60. package/core/client/components/document/KImage.vue +50 -19
  61. package/core/client/components/document/KMarkdown.vue +10 -2
  62. package/core/client/components/document/KUploader.vue +126 -0
  63. package/core/client/components/document/KVideo.vue +39 -0
  64. package/core/client/components/form/KDateField.vue +70 -0
  65. package/core/client/components/form/KDateTimeRangeField.vue +6 -17
  66. package/core/client/components/form/KDatetimeField.vue +6 -13
  67. package/core/client/components/form/KForm.vue +8 -8
  68. package/core/client/components/form/KOptionsField.vue +2 -0
  69. package/core/client/components/form/KResolutionField.vue +54 -52
  70. package/core/client/components/form/KSelectField.vue +27 -13
  71. package/core/client/components/form/KTextareaField.vue +23 -5
  72. package/core/client/components/graphics/KIcon.vue +64 -0
  73. package/core/client/components/index.js +1 -3
  74. package/core/client/components/input/KColorPicker.vue +70 -0
  75. package/core/client/components/input/KIconPicker.vue +188 -0
  76. package/core/client/components/input/KShapePicker.vue +81 -0
  77. package/core/client/components/input/index.js +7 -1
  78. package/core/client/components/layout/KFab.vue +1 -1
  79. package/core/client/components/layout/KLayout.vue +14 -2
  80. package/core/client/components/layout/KOpener.vue +9 -11
  81. package/core/client/components/layout/KPage.vue +31 -17
  82. package/core/client/components/layout/KWindow.vue +34 -18
  83. package/core/client/components/menu/KMenu.vue +52 -36
  84. package/core/client/components/menu/KSubMenu.vue +105 -0
  85. package/core/client/components/messages/KMessageCard.vue +207 -0
  86. package/core/client/components/messages/KMessageComposer.vue +199 -0
  87. package/core/client/components/messages/KMessagesTimeLine.vue +137 -0
  88. package/core/client/components/messages/index.js +7 -0
  89. package/core/client/components/screen/KErrorScreen.vue +2 -3
  90. package/core/client/components/screen/KLogoutScreen.vue +3 -1
  91. package/core/client/components/screen/KOAuthLoginScreen.vue +15 -0
  92. package/core/client/components/screen/KOAuthLogoutScreen.vue +33 -0
  93. package/core/client/components/screen/KUnauthorizedScreen.vue +16 -0
  94. package/core/client/components/time/KAbsoluteTimeRange.vue +7 -14
  95. package/core/client/components/time/KDate.vue +56 -26
  96. package/core/client/components/time/KDateTime.vue +93 -37
  97. package/core/client/components/time/KDateTimeRange.vue +197 -52
  98. package/core/client/components/time/KTime.vue +56 -26
  99. package/core/client/composables/activity.js +40 -30
  100. package/core/client/composables/{counter.js → collection-counter.js} +2 -4
  101. package/core/client/composables/collection-filter.js +111 -0
  102. package/core/client/composables/collection-timerange.js +56 -0
  103. package/core/client/composables/collection.js +13 -11
  104. package/core/client/composables/context.js +92 -0
  105. package/core/client/composables/errors.js +83 -0
  106. package/core/client/composables/index.js +5 -1
  107. package/core/client/composables/layout.js +14 -11
  108. package/core/client/composables/messages.js +4 -4
  109. package/core/client/composables/pwa.js +20 -27
  110. package/core/client/composables/schema.js +1 -1
  111. package/core/client/composables/screen.js +21 -9
  112. package/core/client/composables/selection.js +16 -4
  113. package/core/client/composables/session.js +13 -7
  114. package/core/client/composables/store.js +2 -1
  115. package/core/client/context.js +38 -0
  116. package/core/client/directives/v-hover.js +7 -4
  117. package/core/client/document.js +43 -15
  118. package/core/client/events.js +2 -2
  119. package/core/client/exporter.js +5 -4
  120. package/core/client/filter.js +1 -8
  121. package/core/client/guards.js +3 -3
  122. package/core/client/hooks/hooks.logger.js +1 -1
  123. package/core/client/hooks/hooks.offline.js +32 -0
  124. package/core/client/hooks/index.js +2 -1
  125. package/core/client/i18n/core_en.json +95 -268
  126. package/core/client/i18n/core_fr.json +181 -353
  127. package/core/client/index.js +22 -8
  128. package/core/client/layout.js +64 -25
  129. package/core/client/local-cache.js +67 -0
  130. package/core/client/local-storage.js +6 -2
  131. package/core/client/mixins/index.js +0 -1
  132. package/core/client/mixins/mixin.base-activity.js +22 -10
  133. package/core/client/mixins/mixin.base-editor.js +1 -1
  134. package/core/client/mixins/mixin.base-field.js +10 -1
  135. package/core/client/mixins/mixin.base-item.js +14 -11
  136. package/core/client/mixins/mixin.service.js +1 -5
  137. package/core/client/platform.js +44 -0
  138. package/core/client/readers/reader.blob.js +3 -3
  139. package/core/client/readers/reader.csv.js +2 -2
  140. package/core/client/readers/reader.json.js +2 -2
  141. package/core/client/services/index.js +7 -11
  142. package/core/client/storage.js +43 -8
  143. package/core/client/template-context.js +14 -14
  144. package/core/client/time.js +3 -3
  145. package/core/client/units.js +7 -4
  146. package/core/client/utils/index.js +6 -5
  147. package/core/client/utils/utils.collection.js +71 -0
  148. package/core/client/utils/utils.colors.js +29 -8
  149. package/core/client/utils/utils.content.js +14 -14
  150. package/core/client/utils/utils.files.js +17 -0
  151. package/core/client/utils/utils.items.js +4 -0
  152. package/core/client/utils/utils.math.js +18 -1
  153. package/core/client/utils/utils.push.js +22 -13
  154. package/core/client/utils/utils.screen.js +6 -2
  155. package/core/client/utils/utils.services.js +42 -0
  156. package/core/client/utils/utils.session.js +48 -12
  157. package/core/client/utils/utils.shapes.js +15 -11
  158. package/core/common/permissions.js +3 -108
  159. package/core/common/schemas/messages.update.json +16 -0
  160. package/core/common/schemas/settings.update.json +27 -8
  161. package/core/common/utils.js +2 -0
  162. package/core/common/utils.offline.js +38 -0
  163. package/coverage/core/api/application.js.html +296 -296
  164. package/coverage/core/api/authentication.js.html +206 -74
  165. package/coverage/core/api/db.js.html +61 -61
  166. package/coverage/core/api/hooks/hooks.authentication.js.html +15 -189
  167. package/coverage/core/api/hooks/hooks.authorisations.js.html +180 -462
  168. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  169. package/coverage/core/api/hooks/hooks.logger.js.html +16 -16
  170. package/coverage/core/api/hooks/hooks.model.js.html +69 -57
  171. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  172. package/coverage/core/api/hooks/hooks.push.js.html +58 -46
  173. package/coverage/core/api/hooks/hooks.query.js.html +142 -142
  174. package/coverage/core/api/hooks/hooks.schemas.js.html +1 -1
  175. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  176. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  177. package/coverage/core/api/hooks/hooks.users.js.html +54 -327
  178. package/coverage/core/api/hooks/index.html +64 -94
  179. package/coverage/core/api/hooks/index.js.html +4 -10
  180. package/coverage/core/api/index.html +41 -56
  181. package/coverage/core/api/index.js.html +1 -1
  182. package/coverage/core/api/marshall.js.html +9 -9
  183. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  184. package/coverage/core/api/models/index.html +13 -58
  185. package/coverage/core/api/models/messages.model.mongodb.js.html +35 -35
  186. package/coverage/core/api/models/organisations.model.mongodb.js.html +3 -3
  187. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  188. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  189. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  190. package/coverage/core/api/services/account/account.service.js.html +67 -67
  191. package/coverage/core/api/services/account/index.html +16 -16
  192. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  193. package/coverage/core/api/services/authorisations/authorisations.service.js.html +141 -144
  194. package/coverage/core/api/services/authorisations/index.html +19 -19
  195. package/coverage/core/api/services/databases/databases.hooks.js.html +82 -82
  196. package/coverage/core/api/services/databases/databases.service.js.html +20 -20
  197. package/coverage/core/api/services/databases/index.html +32 -32
  198. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  199. package/coverage/core/api/services/groups/index.html +1 -1
  200. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  201. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  202. package/coverage/core/api/services/import-export/index.html +1 -1
  203. package/coverage/core/api/services/index.html +21 -21
  204. package/coverage/core/api/services/index.js.html +118 -154
  205. package/coverage/core/api/services/mailer/index.html +1 -1
  206. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  207. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  208. package/coverage/core/api/services/messages/index.html +21 -21
  209. package/coverage/core/api/services/messages/messages.hooks.js.html +89 -86
  210. package/coverage/core/api/services/organisations/index.html +1 -1
  211. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  212. package/coverage/core/api/services/organisations/organisations.service.js.html +23 -23
  213. package/coverage/core/api/services/push/index.html +1 -1
  214. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  215. package/coverage/core/api/services/push/push.service.js.html +1 -1
  216. package/coverage/core/api/services/storage/index.html +5 -5
  217. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  218. package/coverage/core/api/services/storage/storage.service.js.html +27 -27
  219. package/coverage/core/api/services/tags/index.html +1 -1
  220. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  221. package/coverage/core/api/services/users/index.html +23 -8
  222. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  223. package/coverage/core/api/services/users/users.service.js.html +100 -0
  224. package/coverage/core/api/utils.js.html +1 -1
  225. package/coverage/core/common/errors.js.html +1 -1
  226. package/coverage/core/common/index.html +42 -27
  227. package/coverage/core/common/index.js.html +1 -1
  228. package/coverage/core/common/permissions.js.html +195 -510
  229. package/coverage/core/common/schema.js.html +1 -1
  230. package/coverage/core/common/utils.js.html +12 -6
  231. package/coverage/core/common/utils.offline.js.html +199 -0
  232. package/coverage/index.html +142 -172
  233. package/coverage/lcov-report/core/api/application.js.html +296 -296
  234. package/coverage/lcov-report/core/api/authentication.js.html +206 -74
  235. package/coverage/lcov-report/core/api/db.js.html +61 -61
  236. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +15 -189
  237. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +180 -462
  238. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  239. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +16 -16
  240. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +69 -57
  241. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  242. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +58 -46
  243. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +142 -142
  244. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +1 -1
  245. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  246. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  247. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +54 -327
  248. package/coverage/lcov-report/core/api/hooks/index.html +64 -94
  249. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  250. package/coverage/lcov-report/core/api/index.html +41 -56
  251. package/coverage/lcov-report/core/api/index.js.html +1 -1
  252. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  253. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  254. package/coverage/lcov-report/core/api/models/index.html +13 -58
  255. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +35 -35
  256. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +3 -3
  257. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  258. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  259. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  260. package/coverage/lcov-report/core/api/services/account/account.service.js.html +67 -67
  261. package/coverage/lcov-report/core/api/services/account/index.html +16 -16
  262. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  263. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +141 -144
  264. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  265. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +82 -82
  266. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +20 -20
  267. package/coverage/lcov-report/core/api/services/databases/index.html +32 -32
  268. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  269. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  270. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  271. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  272. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  273. package/coverage/lcov-report/core/api/services/index.html +21 -21
  274. package/coverage/lcov-report/core/api/services/index.js.html +118 -154
  275. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  276. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  277. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  278. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  279. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +89 -86
  280. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  281. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  282. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +23 -23
  283. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  284. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  285. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  286. package/coverage/lcov-report/core/api/services/storage/index.html +5 -5
  287. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  288. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +27 -27
  289. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  290. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  291. package/coverage/lcov-report/core/api/services/users/index.html +23 -8
  292. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  293. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  294. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  295. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  296. package/coverage/lcov-report/core/common/index.html +42 -27
  297. package/coverage/lcov-report/core/common/index.js.html +1 -1
  298. package/coverage/lcov-report/core/common/permissions.js.html +195 -510
  299. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  300. package/coverage/lcov-report/core/common/utils.js.html +12 -6
  301. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  302. package/coverage/lcov-report/index.html +142 -172
  303. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +125 -29
  304. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  305. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +20 -44
  306. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  307. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  308. package/coverage/lcov-report/map/api/index.html +1 -1
  309. package/coverage/lcov-report/map/api/index.js.html +1 -1
  310. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  311. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  312. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +49 -7
  313. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  314. package/coverage/lcov-report/map/api/models/index.html +22 -7
  315. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  316. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +112 -0
  317. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  318. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  319. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  320. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +29 -11
  321. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  322. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  323. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  324. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +78 -9
  325. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  326. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  327. package/coverage/lcov-report/map/api/services/index.html +5 -5
  328. package/coverage/lcov-report/map/api/services/index.js.html +287 -50
  329. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  330. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  331. package/coverage/lcov-report/map/api/services/styles/index.html +116 -0
  332. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +196 -0
  333. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  334. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  335. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +8 -5
  336. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  337. package/coverage/lcov-report/map/common/index.html +7 -7
  338. package/coverage/lcov-report/map/common/index.js.html +1 -1
  339. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  340. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  341. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  342. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  343. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  344. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  345. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  346. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  347. package/coverage/lcov-report/map/common/wcs-utils.js.html +9 -9
  348. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  349. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  350. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  351. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  352. package/coverage/lcov.info +2581 -3278
  353. package/coverage/map/api/hooks/hooks.catalog.js.html +125 -29
  354. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  355. package/coverage/map/api/hooks/hooks.query.js.html +20 -44
  356. package/coverage/map/api/hooks/index.html +7 -7
  357. package/coverage/map/api/hooks/index.js.html +1 -1
  358. package/coverage/map/api/index.html +1 -1
  359. package/coverage/map/api/index.js.html +1 -1
  360. package/coverage/map/api/marshall.js.html +1 -1
  361. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  362. package/coverage/map/api/models/catalog.model.mongodb.js.html +49 -7
  363. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  364. package/coverage/map/api/models/index.html +22 -7
  365. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  366. package/coverage/map/api/models/styles.model.mongodb.js.html +112 -0
  367. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  368. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  369. package/coverage/map/api/services/alerts/index.html +1 -1
  370. package/coverage/map/api/services/catalog/catalog.hooks.js.html +29 -11
  371. package/coverage/map/api/services/catalog/index.html +5 -5
  372. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  373. package/coverage/map/api/services/daptiles/index.html +1 -1
  374. package/coverage/map/api/services/features/features.hooks.js.html +78 -9
  375. package/coverage/map/api/services/features/features.service.js.html +307 -4
  376. package/coverage/map/api/services/features/index.html +7 -7
  377. package/coverage/map/api/services/index.html +5 -5
  378. package/coverage/map/api/services/index.js.html +287 -50
  379. package/coverage/map/api/services/projects/index.html +1 -1
  380. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  381. package/coverage/map/api/services/styles/index.html +116 -0
  382. package/coverage/map/api/services/styles/styles.hooks.js.html +196 -0
  383. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  384. package/coverage/map/common/errors.js.html +1 -1
  385. package/coverage/map/common/geotiff-grid-source.js.html +8 -5
  386. package/coverage/map/common/grid.js.html +1 -1
  387. package/coverage/map/common/index.html +7 -7
  388. package/coverage/map/common/index.js.html +1 -1
  389. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  390. package/coverage/map/common/moment-utils.js.html +1 -1
  391. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  392. package/coverage/map/common/opendap-utils.js.html +1 -1
  393. package/coverage/map/common/permissions.js.html +10 -4
  394. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  395. package/coverage/map/common/tms-utils.js.html +6 -6
  396. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  397. package/coverage/map/common/wcs-utils.js.html +9 -9
  398. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  399. package/coverage/map/common/wfs-utils.js.html +11 -11
  400. package/coverage/map/common/wms-utils.js.html +8 -8
  401. package/coverage/map/common/wmts-utils.js.html +7 -7
  402. package/coverage/tmp/coverage-323534-1747828879483-0.json +1 -0
  403. package/coverage/tmp/coverage-323546-1747828879453-0.json +1 -0
  404. package/coverage/tmp/coverage-323557-1747828879439-0.json +1 -0
  405. package/coverage/tmp/coverage-323569-1747828879416-0.json +1 -0
  406. package/coverage/tmp/coverage-323576-1747828879390-0.json +1 -0
  407. package/extras/configs/helpers.js +78 -0
  408. package/extras/configs/panes.left.js +118 -0
  409. package/extras/configs/panes.top.js +222 -0
  410. package/extras/configs/stickies.js +57 -0
  411. package/extras/configs/widgets.left.js +23 -0
  412. package/extras/configs/widgets.top.js +73 -0
  413. package/extras/css/core.variables.scss +8 -0
  414. package/extras/images/north.svg +3 -0
  415. package/extras/tours/map/side-nav.js +3 -3
  416. package/map/api/hooks/hooks.catalog.js +56 -23
  417. package/map/api/hooks/hooks.query.js +16 -24
  418. package/map/api/models/catalog.model.mongodb.js +16 -2
  419. package/{core/api/models/groups.model.mongodb.js → map/api/models/styles.model.mongodb.js} +2 -1
  420. package/map/api/services/catalog/catalog.hooks.js +13 -7
  421. package/map/api/services/features/features.hooks.js +28 -5
  422. package/map/api/services/features/features.service.js +101 -0
  423. package/map/api/services/index.js +125 -46
  424. package/map/api/services/styles/styles.hooks.js +37 -0
  425. package/map/client/cesium/utils/index.js +1 -0
  426. package/map/client/cesium/utils/utils.cesium.js +397 -0
  427. package/map/client/cesium/utils/utils.features.js +8 -0
  428. package/map/client/cesium/utils/utils.geojson.js +59 -0
  429. package/map/client/cesium/utils/utils.style.js +134 -17
  430. package/map/client/components/KEditLayerData.vue +17 -79
  431. package/map/client/components/KFeatureEditor.vue +2 -7
  432. package/map/client/components/KFeaturesChart.vue +2 -6
  433. package/map/client/components/KFeaturesFilterEditor.vue +300 -0
  434. package/map/client/components/KFeaturesFilterManager.vue +196 -0
  435. package/map/client/components/KFeaturesTable.vue +0 -5
  436. package/map/client/components/KFilterCondition.vue +303 -0
  437. package/map/client/components/KLayerEditionToolbar.vue +4 -3
  438. package/map/client/components/KLayerEditor.vue +451 -36
  439. package/map/client/components/KMeasureTool.vue +36 -9
  440. package/map/client/components/KProjectMenu.vue +14 -8
  441. package/map/client/components/catalog/KAddLayer.vue +0 -4
  442. package/map/client/components/catalog/KBaseLayersSelector.vue +42 -46
  443. package/map/client/components/catalog/KConnectLayer.vue +295 -291
  444. package/map/client/components/catalog/KCreateLayer.vue +141 -146
  445. package/map/client/components/catalog/KCreateOfflineView.vue +100 -0
  446. package/map/client/components/catalog/KCreateView.vue +2 -8
  447. package/map/client/components/catalog/KFilteredLayerItem.vue +72 -25
  448. package/map/client/components/catalog/KImportLayer.vue +121 -129
  449. package/map/client/components/catalog/KLayerItem.vue +44 -32
  450. package/map/client/components/catalog/KLayersPanel.vue +45 -17
  451. package/map/client/components/catalog/KLayersSelector.vue +51 -50
  452. package/map/client/components/catalog/KProjectManager.vue +4 -8
  453. package/map/client/components/catalog/KProjectSelector.vue +33 -2
  454. package/map/client/components/catalog/KProjectsPanel.vue +84 -106
  455. package/map/client/components/catalog/KSelectLayers.vue +56 -69
  456. package/map/client/components/catalog/KSelectViews.vue +56 -69
  457. package/map/client/components/catalog/KViewSelector.vue +32 -2
  458. package/map/client/components/catalog/KViewsPanel.vue +178 -110
  459. package/map/client/components/catalog/KWeatherLayersSelector.vue +77 -85
  460. package/map/client/components/form/KLocationField.vue +21 -2
  461. package/map/client/components/form/KOwsLayerField.vue +1 -1
  462. package/map/client/components/form/KOwsServiceField.vue +102 -63
  463. package/map/client/components/form/KSelectLayersField.vue +1 -1
  464. package/map/client/components/form/KSelectViewsField.vue +1 -1
  465. package/map/client/components/form/KTimezoneField.vue +0 -1
  466. package/map/client/components/legend/KLegend.vue +4 -4
  467. package/map/client/components/location/KLocationCardSection.vue +16 -0
  468. package/map/client/components/location/KLocationMap.vue +3 -2
  469. package/map/client/components/location/KLocationSearch.vue +46 -8
  470. package/map/client/components/location/KLocationTimeLineCard.vue +25 -3
  471. package/map/client/components/location/KLocationTip.vue +57 -10
  472. package/map/client/components/selection/KFeaturesSelection.vue +71 -0
  473. package/map/client/components/selection/KSelectedLayerFeatures.vue +343 -0
  474. package/map/client/components/{KAttribution.vue → stickies/KAttribution.vue} +39 -33
  475. package/map/client/components/stickies/KLevelSlider.vue +114 -0
  476. package/map/client/components/stickies/KNorthArrow.vue +26 -0
  477. package/map/client/components/stickies/KPosition.vue +103 -0
  478. package/map/client/components/stickies/KTarget.vue +34 -0
  479. package/map/client/components/styles/KLayerStyleAction.vue +58 -0
  480. package/map/client/components/styles/KStyleEditor.vue +273 -0
  481. package/map/client/components/styles/KStyleEditorSection.vue +79 -0
  482. package/map/client/components/styles/KStyleManager.vue +183 -0
  483. package/map/client/components/styles/KStylePreview.vue +64 -0
  484. package/map/client/components/styles/KStylePreviewItem.vue +68 -0
  485. package/map/client/components/styles/KStylePropertiesGroup.vue +76 -0
  486. package/map/client/components/styles/KStyleProperty.vue +136 -0
  487. package/map/client/components/styles/KStyleTip.vue +118 -0
  488. package/map/client/components/tools/KGeolocateTool.vue +3 -2
  489. package/map/client/components/tools/KSearchTool.vue +34 -6
  490. package/map/client/components/widget/KMapillaryViewer.vue +1 -1
  491. package/map/client/components/widget/KStackableTimeSeries.vue +8 -5
  492. package/map/client/composables/activity.js +29 -43
  493. package/map/client/composables/catalog.js +1 -1
  494. package/map/client/composables/highlight.js +117 -57
  495. package/map/client/composables/location.js +33 -14
  496. package/map/client/composables/project.js +9 -10
  497. package/map/client/composables/selection.js +136 -23
  498. package/map/client/geocoder.js +104 -0
  499. package/map/client/geolocation.js +1 -1
  500. package/map/client/globe.js +3 -0
  501. package/map/client/hooks/hooks.offline.js +95 -0
  502. package/map/client/hooks/index.js +1 -0
  503. package/map/client/i18n/map_en.json +159 -94
  504. package/map/client/i18n/map_fr.json +186 -127
  505. package/map/client/index.js +3 -0
  506. package/map/client/init.js +44 -8
  507. package/map/client/leaflet/BoxSelection.js +2 -2
  508. package/map/client/leaflet/GradientPath.js +84 -4
  509. package/map/client/leaflet/TiledFeatureLayer.js +2 -3
  510. package/map/client/leaflet/WindBarb.js +323 -0
  511. package/map/client/leaflet/utils/index.js +1 -0
  512. package/map/client/leaflet/utils/utils.events.js +8 -3
  513. package/map/client/leaflet/utils/utils.geojson.js +221 -0
  514. package/map/client/leaflet/utils/utils.style.js +10 -9
  515. package/map/client/map.js +3 -0
  516. package/map/client/mixins/globe/mixin.base-globe.js +151 -19
  517. package/map/client/mixins/globe/mixin.geojson-layers.js +208 -86
  518. package/map/client/mixins/globe/mixin.popup.js +3 -2
  519. package/map/client/mixins/globe/mixin.style.js +3 -1
  520. package/map/client/mixins/globe/mixin.tooltip.js +3 -2
  521. package/map/client/mixins/map/index.js +1 -3
  522. package/map/client/mixins/map/mixin.base-map.js +267 -79
  523. package/map/client/mixins/map/mixin.canvas-layers.js +44 -10
  524. package/map/client/mixins/map/mixin.edit-layers.js +142 -57
  525. package/map/client/mixins/map/mixin.geojson-layers.js +129 -205
  526. package/map/client/mixins/map/mixin.pmtiles-layers.js +24 -11
  527. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +1 -2
  528. package/map/client/mixins/map/mixin.tiled-wind-layers.js +2 -1
  529. package/map/client/mixins/mixin.activity.js +61 -41
  530. package/map/client/mixins/mixin.context.js +19 -14
  531. package/map/client/mixins/mixin.feature-selection.js +0 -1
  532. package/map/client/mixins/mixin.feature-service.js +41 -59
  533. package/map/client/mixins/mixin.weacast.js +1 -1
  534. package/map/client/navigator.js +38 -0
  535. package/map/client/pixi-utils.js +1 -1
  536. package/map/client/planets.js +1 -1
  537. package/map/client/readers/reader.kml.js +57 -1
  538. package/map/client/utils/index.js +1 -0
  539. package/map/client/utils/utils.capture.js +10 -7
  540. package/map/client/utils/utils.catalog.js +2 -2
  541. package/map/client/utils/utils.features.js +193 -39
  542. package/map/client/utils/utils.js +8 -19
  543. package/map/client/utils/utils.layers.js +381 -4
  544. package/map/client/utils/utils.location.js +39 -74
  545. package/map/client/utils/utils.offline.js +89 -0
  546. package/map/client/utils/utils.style.js +133 -80
  547. package/map/client/utils/utils.time-series.js +99 -25
  548. package/map/common/geotiff-grid-source.js +2 -1
  549. package/map/common/permissions.js +2 -0
  550. package/map/common/schemas/capture.create.json +4 -4
  551. package/map/common/schemas/catalog.update.json +18 -2
  552. package/map/common/schemas/projects.create.json +2 -2
  553. package/map/common/schemas/projects.update.json +2 -2
  554. package/map/common/tms-utils.js +5 -5
  555. package/map/common/wcs-grid-source.js +2 -2
  556. package/map/common/wcs-utils.js +8 -8
  557. package/map/common/wfs-utils.js +10 -10
  558. package/map/common/wms-utils.js +7 -7
  559. package/map/common/wmts-utils.js +6 -6
  560. package/package.json +7 -4
  561. package/test/api/core/account.test.js +0 -72
  562. package/test/api/core/authentication.test.js +184 -0
  563. package/test/api/core/config/default.cjs +1 -3
  564. package/test/api/core/index.test.js +33 -96
  565. package/test/api/core/offline.test.js +55 -0
  566. package/test/api/core/push.test.js +3 -3
  567. package/test/api/core/{test-log-2024-06-06.log → test-log-2025-02-05.log} +3 -3
  568. package/test/api/core/{test-log-2024-11-15.log → test-log-2025-05-21.log} +1 -9
  569. package/test/api/map/alerts.test.js +1 -1
  570. package/test/api/map/config/default.cjs +2 -1
  571. package/test/api/map/data/vigicrues.observations.Q.json +47042 -0
  572. package/test/api/map/index.test.js +113 -9
  573. package/test/api/map/style.test.js +62 -0
  574. package/test/client/core/layout.js +2 -2
  575. package/test/client/core/runner.js +1 -1
  576. package/test/client/core/utils.js +52 -0
  577. package/test/client/map/catalog.js +1 -0
  578. package/core/api/hooks/hooks.groups.js +0 -48
  579. package/core/api/hooks/hooks.organisations.js +0 -152
  580. package/core/api/models/organisations.model.mongodb.js +0 -3
  581. package/core/api/models/tags.model.mongodb.js +0 -10
  582. package/core/api/services/groups/groups.hooks.js +0 -31
  583. package/core/api/services/organisations/organisations.hooks.js +0 -31
  584. package/core/api/services/organisations/organisations.service.js +0 -86
  585. package/core/api/services/tags/tags.hooks.js +0 -31
  586. package/core/api/utils.js +0 -11
  587. package/core/client/components/KChipsPane.vue +0 -103
  588. package/core/client/components/document/index.js +0 -9
  589. package/core/client/components/team/KAddMember.vue +0 -378
  590. package/core/client/components/team/KAddTag.vue +0 -121
  591. package/core/client/components/team/KChangeRole.vue +0 -118
  592. package/core/client/components/team/KGroupCard.vue +0 -110
  593. package/core/client/components/team/KGroupsActivity.vue +0 -78
  594. package/core/client/components/team/KJoinGroup.vue +0 -132
  595. package/core/client/components/team/KMemberCard.vue +0 -328
  596. package/core/client/components/team/KMemberFilter.vue +0 -49
  597. package/core/client/components/team/KMembersActivity.vue +0 -136
  598. package/core/client/components/team/KOrganisationsActivity.vue +0 -51
  599. package/core/client/components/team/KTagCard.vue +0 -72
  600. package/core/client/components/team/KTagsActivity.vue +0 -73
  601. package/core/client/components/team/index.js +0 -9
  602. package/core/client/mixins/mixin.base-context.js +0 -54
  603. package/core/client/utils/utils.platform.js +0 -12
  604. package/core/common/schemas/groups.create.json +0 -28
  605. package/core/common/schemas/groups.update.json +0 -28
  606. package/core/common/schemas/organisations.create.json +0 -28
  607. package/core/common/schemas/organisations.update.json +0 -49
  608. package/core/common/schemas/tags.create.json +0 -35
  609. package/core/common/schemas/tags.update.json +0 -35
  610. package/coverage/tmp/coverage-280506-1731704745613-0.json +0 -1
  611. package/coverage/tmp/coverage-280518-1731704745599-0.json +0 -1
  612. package/coverage/tmp/coverage-280529-1731704745588-0.json +0 -1
  613. package/coverage/tmp/coverage-280541-1731704745574-0.json +0 -1
  614. package/coverage/tmp/coverage-280548-1731704745545-0.json +0 -1
  615. package/map/client/components/KFeaturesFilter.vue +0 -259
  616. package/map/client/components/KLayerStyleEditor.vue +0 -118
  617. package/map/client/components/KLayerStyleForm.vue +0 -740
  618. package/map/client/components/KLevelSlider.vue +0 -100
  619. package/map/client/components/KNorth.vue +0 -31
  620. package/map/client/components/KPositionIndicator.vue +0 -83
  621. package/map/client/components/catalog/KCreateProject.vue +0 -100
  622. package/map/client/mixins/map/mixin.forecast-layers.js +0 -81
  623. package/map/client/mixins/map/mixin.georaster-layers.js +0 -107
  624. package/test/api/core/team.test.js +0 -670
  625. package/test/api/core/test-log-2023-12-19.log +0 -7
  626. package/test/api/core/test-log-2024-01-04.log +0 -14
  627. package/test/api/core/test-log-2024-05-14.log +0 -6
  628. package/test/api/core/test-log-2024-06-26.log +0 -25
  629. package/test/api/core/test-log-2024-06-28.log +0 -2
  630. package/test/api/core/test-log-2024-07-09.log +0 -0
  631. package/test/api/core/test-log-2024-08-13.log +0 -69
  632. package/test/api/core/test-log-2024-10-28.log +0 -53
  633. package/test/api/core/test-log-2024-11-05.log +0 -30
  634. package/test/api/map/test-log-2023-11-24.log +0 -121
  635. package/test/api/map/test-log-2023-12-12.log +0 -29
  636. package/test/api/map/test-log-2023-12-13.log +0 -5
  637. package/test/api/map/test-log-2024-01-04.log +0 -2
  638. package/test/api/map/test-log-2024-01-11.log +0 -1
  639. package/test/api/map/test-log-2024-01-25.log +0 -19
  640. package/test/api/map/test-log-2024-06-06.log +0 -39
  641. package/test/api/map/test-log-2024-08-13.log +0 -13
  642. package/test/api/map/test-log-2024-08-20.log +0 -55
  643. package/test/api/map/test-log-2024-09-09.log +0 -92
  644. package/test/api/map/test-log-2024-10-28.log +0 -11
  645. /package/extras/{logos → images}/kalisio.png +0 -0
  646. /package/extras/{icons → images}/target.svg +0 -0
  647. /package/test/api/map/data/{vigicrues.observations.json → vigicrues.observations.H.json} +0 -0
@@ -2,100 +2,18 @@ import L from 'leaflet'
2
2
  import _ from 'lodash'
3
3
  import sift from 'sift'
4
4
  import logger from 'loglevel'
5
- import lineOffset from '@turf/line-offset'
6
- import 'leaflet-realtime'
5
+ import { point, rhumbDistance, rhumbBearing, rhumbDestination } from '@turf/turf'
7
6
  import { Time, Units, utils as kdkCoreUtils } from '../../../../core.client.js'
8
- import { GradientPath } from '../../leaflet/GradientPath.js'
7
+ import { getUpdateFeatureFunction, hasUnitInLeafletLayerTemplate, GeoJsonLeafletLayerFilters } from '../../leaflet/utils/utils.geojson.js'
9
8
  import { MaskLayer } from '../../leaflet/MaskLayer.js'
10
9
  import { TiledFeatureLayer } from '../../leaflet/TiledFeatureLayer.js'
11
10
  import {
12
11
  fetchGeoJson, LeafletEvents, bindLeafletEvents, unbindLeafletEvents, getFeatureId, isInMemoryLayer, getFeatureStyleType,
13
12
  convertSimpleStyleToPointStyle, convertSimpleStyleToLineStyle, convertSimpleStyleToPolygonStyle, createMarkerFromPointStyle
14
13
  } from '../../utils.map.js'
14
+ import * as maths from '../../../../core/client/utils/utils.math.js'
15
15
  import * as wfs from '../../../common/wfs-utils.js'
16
16
 
17
- // Override default remove handler for leaflet-realtime due to
18
- // https://github.com/perliedman/leaflet-realtime/issues/177
19
- const Realtime = L.Realtime.extend({
20
- remove: function (geojson) {
21
- if (typeof geojson === 'undefined') {
22
- return L.Layer.prototype.remove.call(this)
23
- } else {
24
- return L.Realtime.prototype.remove.call(this, geojson)
25
- }
26
- }
27
- })
28
- L.realtime = function (src, options) {
29
- return new Realtime(src, options)
30
- }
31
- // Override default Polyline simplify function to manage offset
32
- const simplifyPoints = L.Polyline.prototype._simplifyPoints
33
- L.Polyline.include({
34
- _simplifyPoints: function () {
35
- simplifyPoints.call(this)
36
- // Offset simplified version
37
- if (this.options.offset) {
38
- // We'd like to ensure a pixel constant offset when zooming
39
- // Zoom 0 resolution is 156 543 m/pixel at equator in default map tiles,
40
- // we take latitude into account to account for a convergence factor
41
- const latitude = this.getBounds().getCenter().lat
42
- const factor = 156543 / Math.pow(2, this._map.getZoom()) / Math.cos(latitude * Math.PI / 180)
43
- const offset = Math.max(1, this.options.offset * factor)
44
-
45
- for (let i = 0; i < this._parts.length; i++) {
46
- let latLngs = this._parts[i].map(point => this._map.layerPointToLatLng(point))
47
- // Ensure a large enough precision for computation (defaults to 6 in Leaflet)
48
- const coords = L.GeoJSON.latLngsToCoords(latLngs, 0, false, 12)
49
- const feature = lineOffset({ type: 'LineString', coordinates: coords }, offset, { units: 'meters' })
50
- latLngs = L.GeoJSON.coordsToLatLngs(feature.geometry.coordinates, 0)
51
- this._parts[i] = latLngs.map(latlng => this._map.latLngToLayerPoint(latlng))
52
- }
53
- }
54
- }
55
- })
56
-
57
- // Override default Leaflet GeoJson utility to manage some specific use cases
58
- const geometryToLayer = L.GeoJSON.geometryToLayer
59
- L.GeoJSON.geometryToLayer = function (geojson, options) {
60
- const geometry = geojson.geometry
61
- const properties = geojson.properties
62
- if (geometry && properties && properties.geodesic) {
63
- if (geometry.type === 'LineString') {
64
- return new L.Geodesic([L.GeoJSON.coordsToLatLngs(geometry.coordinates, 0)],
65
- Object.assign({ steps: 4 }, options.style(geojson)))
66
- } else if (geometry.type === 'MultiLineString') {
67
- const coords = geometry.coordinates.map((lineString) => L.GeoJSON.coordsToLatLngs(lineString, 0))
68
- return new L.Geodesic(coords, Object.assign({ steps: 4 }, options.style(geojson)))
69
- } else if (geometry.type === 'Point') {
70
- const layer = new L.GeodesicCircle(L.GeoJSON.coordsToLatLng(geometry.coordinates),
71
- Object.assign({ fill: true, steps: 360, radius: properties.radius }, options.style(geojson)))
72
- return layer
73
- }
74
- }
75
- if (geometry && properties && properties.gradient) {
76
- if (geometry.type === 'LineString') {
77
- return new GradientPath(geojson, options.style(geojson))
78
- }
79
- }
80
- if (geometry && properties && properties.mask) {
81
- if (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {
82
- return new MaskLayer(geojson, options.style(geojson))
83
- }
84
- }// Automate Leaflet.PolylineOffset plugin use
85
- if (geometry && properties && properties.offset) {
86
- if (geometry.type === 'LineString') {
87
- options = Object.assign({ offset: properties.offset }, options)
88
- }
89
- }
90
- // As we do so this breaks leaflet-arrowheads plugin
91
- const layer = geometryToLayer(geojson, options)
92
- if (geometry && (options.arrowheads || (properties && properties.arrowheads))) {
93
- if (layer instanceof L.Polyline) layer.arrowheads(options.arrowheads || properties.arrowheads)
94
- }
95
-
96
- return layer
97
- }
98
-
99
17
  export const geojsonLayers = {
100
18
  emits: [
101
19
  'layer-updated'
@@ -116,75 +34,7 @@ export const geojsonLayers = {
116
34
  }
117
35
  // Custom update function to ensure dynamic styling works as expected
118
36
  if (!_.has(leafletOptions, 'updateFeature')) {
119
- leafletOptions.updateFeature = function (feature, oldLayer) {
120
- // A new feature is coming, create it
121
- if (!oldLayer) return
122
- const staticGeometry = _.get(leafletOptions, 'staticGeometry', false)
123
- // Keep track of previous geometry if we don't want to update it
124
- // Indeed, styling might depend on it
125
- if (staticGeometry) feature.geometry = _.get(oldLayer, 'feature.geometry')
126
-
127
- // An existing one is found, simply update styling, properties, etc.
128
- leafletOptions.onEachFeature(feature, oldLayer)
129
- if (oldLayer.setStyle) {
130
- // Some vector layers can be used for points, eg circleMarker,
131
- // in this case we use marker styling instead of lines/polygons styling
132
- if (feature.geometry.type === 'Point') {
133
- // FIXME: updating style in place does not seem to work, so for now we recreate the whole marker
134
- // oldLayer.setStyle(leafletOptions.pointToLayer(feature))
135
- return
136
- } else {
137
- oldLayer.setStyle(leafletOptions.style(feature))
138
- }
139
- }
140
- // We want to restore values that were there till now but are missing from the input feature.
141
- // Deep for time and runtime that might contain objects with variables
142
- _.defaultsDeep(feature, _.pick(oldLayer.feature, ['time', 'runTime']))
143
- // _NOT_ deep for properties, otherwise it'll merge array and object properties between the two
144
- const oldProps = _.get(oldLayer.feature, 'properties')
145
- if (oldProps) {
146
- if (!feature.properties) feature.properties = {}
147
- _.defaults(feature.properties, oldProps)
148
- }
149
- if (oldLayer.setIcon) {
150
- // FIXME: updating icon in place requires to recreate it anyway, so for now we recreate the whole marker
151
- // oldLayer.setIcon(_.get(leafletOptions.pointToLayer(feature, oldLayer.getLatLng()), 'options.icon'))
152
- return
153
- }
154
- // Now update coordinates if not static geometry
155
- if (staticGeometry) return oldLayer
156
- // The feature is changing its geometry type, recreate it
157
- const oldType = _.get(oldLayer, 'feature.geometry.type')
158
- const type = _.get(feature, 'geometry.type')
159
- if (type !== oldType) return
160
- const coordinates = feature.geometry.coordinates
161
- // FIXME: support others geometry types ?
162
- switch (type) {
163
- case 'Point':
164
- oldLayer.setLatLng(L.GeoJSON.coordsToLatLngs(coordinates))
165
- break
166
- case 'LineString':
167
- case 'MultiLineString':
168
- if (typeof oldLayer.setData === 'function') {
169
- // Support Gradient Path
170
- oldLayer.setData(feature)
171
- } else if (feature.properties.geodesic) {
172
- // Support geodesic line & linestrings
173
- const latlngs = type === 'LineString'
174
- ? [L.GeoJSON.coordsToLatLngs(coordinates, 0)]
175
- : coordinates.map((linestring) => L.GeoJSON.coordsToLatLngs(linestring, 0))
176
- oldLayer.setLatLngs(latlngs)
177
- } else {
178
- oldLayer.setLatLngs(L.GeoJSON.coordsToLatLngs(coordinates, type === 'LineString' ? 0 : 1))
179
- }
180
- break
181
- case 'Polygon':
182
- case 'MultiPolygon':
183
- oldLayer.setLatLngs(L.GeoJSON.coordsToLatLngs(coordinates, type === 'Polygon' ? 1 : 2))
184
- break
185
- }
186
- return oldLayer
187
- }
37
+ leafletOptions.updateFeature = getUpdateFeatureFunction(leafletOptions)
188
38
  }
189
39
  // Check for feature service layers
190
40
  if (options.service) {
@@ -198,7 +48,8 @@ export const geojsonLayers = {
198
48
  leafletOptions.removeMissing = false
199
49
  // Fetching is managed by tiles but even for manual update leaflet realtime require a src
200
50
  _.set(leafletOptions, 'source', async (successCallback, errorCallback) => {})
201
- // Generate fetch function for tiled feature layer
51
+ // Generate fetch functions for tiled feature layer
52
+ leafletOptions.probeSource = (baseQuery) => this.getProbeFeatures(_.merge({ baseQuery }, options))
202
53
  leafletOptions.featureSource = (baseQuery) => this.getFeatures(_.merge({ baseQuery }, options))
203
54
  } else {
204
55
  leafletOptions.removeMissing = !options.probeService
@@ -208,7 +59,11 @@ export const geojsonLayers = {
208
59
  if (!initialized) {
209
60
  try {
210
61
  // Use probes as reference
211
- successCallback(await this.getProbeFeatures(options))
62
+ const geoJson = await this.getProbeFeatures(options)
63
+ // When probes are fetched, we flag them with a 'measureRequestIssued' property that we may use in dynamic styling
64
+ const features = (geoJson.type === 'FeatureCollection' ? geoJson.features : [geoJson])
65
+ features.forEach(feature => { feature.measureRequestIssued = true })
66
+ successCallback(geoJson)
212
67
  initialized = true
213
68
  } catch (error) {
214
69
  errorCallback(error)
@@ -216,7 +71,8 @@ export const geojsonLayers = {
216
71
  }
217
72
  try {
218
73
  // Then update features
219
- successCallback(await this.getFeatures(options))
74
+ const geoJson = await this.getFeatures(options)
75
+ successCallback(geoJson)
220
76
  } catch (error) {
221
77
  errorCallback(error)
222
78
  }
@@ -236,7 +92,7 @@ export const geojsonLayers = {
236
92
  SRSNAME: 'EPSG:4326', // result in 4326
237
93
  BBOX: `${query.south},${query.west},${query.north},${query.east},urn:ogc:def:crs:EPSG::4326` // request bbox
238
94
  }, options.wfs.searchParams)
239
- return wfs.GetFeature(options.wfs.url, options.wfs.version, options.wfs.layer, searchParams, { xml2json: false })
95
+ return wfs.GetFeature(options.wfs.url, options.wfs.version, options.wfs.layer, searchParams, options.wfs.headers, { xml2json: false })
240
96
  }
241
97
  }
242
98
  } else if (_.has(leafletOptions, 'sourceTemplate')) {
@@ -395,7 +251,9 @@ export const geojsonLayers = {
395
251
  // Add FeatureGroup interface so that layer edition works as well
396
252
  layer.toGeoJSON = () => ({ type: 'FeatureCollection', features: _.values(layer._features) })
397
253
  layer.clearLayers = () => layer._onNewData(true, { type: 'FeatureCollection', features: [] })
398
- layer.addLayer = (geoJsonLayer) => layer._onNewData(true, geoJsonLayer.toGeoJSON())
254
+ layer.getLayers = () => _.values(layer._featureLayers)
255
+ layer.addLayer = (geoJsonLayer) => layer._onNewData(false, geoJsonLayer.toGeoJSON())
256
+ layer.removeLayer = (geoJsonLayer) => layer.remove(geoJsonLayer.toGeoJSON())
399
257
  // We launch a first update to initialize data
400
258
  layer.update()
401
259
  } else {
@@ -464,6 +322,93 @@ export const geojsonLayers = {
464
322
  }
465
323
  return geojsonOptions
466
324
  },
325
+ getUpdateAnimation(name, layer, options, geoJson) {
326
+ const { duration, removeMissing, animate } = options
327
+ const animatedProperties = _.keys(animate)
328
+ const features = (Array.isArray(geoJson) ? geoJson : (geoJson.type === 'FeatureCollection' ? geoJson.features : [geoJson]))
329
+ features.forEach(feature => {
330
+ const previousLayer = layer.getLayer(layer.options.getFeatureId(feature))
331
+ const previousFeature = (previousLayer ? previousLayer.feature : null)
332
+ if (previousFeature) {
333
+ Object.assign(feature, { previousFeature })
334
+ const startLongitude = _.get(feature.previousFeature, 'geometry.coordinates[0]')
335
+ const startLatitude = _.get(feature.previousFeature, 'geometry.coordinates[1]')
336
+ const endLongitude = _.get(feature, 'geometry.coordinates[0]')
337
+ const endLatitude = _.get(feature, 'geometry.coordinates[1]')
338
+ const rhumbStart = point([startLongitude, startLatitude])
339
+ const rhumbEnd = point([endLongitude, endLatitude])
340
+ Object.assign(feature, {
341
+ rhumbStart,
342
+ rhumbEnd,
343
+ rhumbBearing: rhumbBearing(rhumbStart, rhumbEnd),
344
+ rhumbDistance: rhumbDistance(rhumbStart, rhumbEnd)
345
+ })
346
+ }
347
+ })
348
+ return (timestamp) => {
349
+ // Initialize animation time origin
350
+ if (!options.startTime) options.startTime = timestamp
351
+ const { id, startTime } = options
352
+ const elapsed = timestamp - startTime
353
+ const percent = Math.abs(elapsed / (1000 * duration))
354
+ if (percent <= 1) {
355
+ const animatedFeatures = []
356
+ features.forEach(feature => {
357
+ if (!feature.previousFeature) {
358
+ animatedFeatures.push(feature)
359
+ return
360
+ }
361
+ const endLongitude = _.get(feature, 'geometry.coordinates[0]')
362
+ const endLatitude = _.get(feature, 'geometry.coordinates[1]')
363
+ let dLongitude = endLongitude, dLatitude = endLatitude
364
+ if (animate.geometry) {
365
+ const easingGeometryFunction = _.get(animate.geometry, 'easing.function')
366
+ const easingGeometryParameters = _.get(animate.geometry, 'easing.parameters', [])
367
+ const percentGeometry = maths[easingGeometryFunction](percent, ...easingGeometryParameters)
368
+ if (animate.geometry.rhumb) {
369
+ const destination = rhumbDestination(feature.rhumbStart, percentGeometry * feature.rhumbDistance, feature.rhumbBearing)
370
+ dLongitude = _.get(destination, 'geometry.coordinates[0]')
371
+ dLatitude = _.get(destination, 'geometry.coordinates[1]')
372
+ } else {
373
+ const startLongitude = _.get(feature.previousFeature, 'geometry.coordinates[0]')
374
+ const startLatitude = _.get(feature.previousFeature, 'geometry.coordinates[1]')
375
+ const dLongitude = startLongitude + percentGeometry * (endLongitude - startLongitude)
376
+ const dLatitude = startLatitude + percentGeometry * (endLatitude - startLatitude)
377
+ }
378
+ }
379
+ const properties = {}
380
+ animatedProperties.forEach(property => {
381
+ // Skip geometry as specifically managed above
382
+ if (property === 'geometry') return
383
+ const easingPropertyFunction = _.get(animate, `${property}.easing.function`, 'cubicBezier')
384
+ const easingPropertyParameters = _.get(animate, `${property}.easing.parameters`, [])
385
+ const percentProperty = maths[easingPropertyFunction](percent, ...easingPropertyParameters)
386
+ const startValue = _.get(feature.previousFeature, `properties.${property}`)
387
+ const endValue = _.get(feature, `properties.${property}`)
388
+ let dValue = startValue + percentProperty * (endValue - startValue)
389
+ if (_.get(animate, `${property}.bearing`, false)) {
390
+ // Take care to animate using the shortest "path", eg from 355° to 5° avoid running counterclockwise
391
+ // First computes the smallest angle difference, either clockwise or counterclockwise.
392
+ const bearingDifference = (endValue - startValue + 540) % 360 - 180
393
+ // Then normalize the final result to be between 0 and 360
394
+ dValue = (startValue + percentProperty * bearingDifference + 360) % 360
395
+ }
396
+ _.set(properties, property, dValue)
397
+ })
398
+ animatedFeatures.push(_.defaultsDeep({
399
+ geometry: {
400
+ coordinates: [dLongitude, dLatitude]
401
+ },
402
+ properties
403
+ }, feature))
404
+ })
405
+ layer._onNewData(_.isNil(removeMissing) ? layer.options.removeMissing : removeMissing, animatedFeatures)
406
+ options.id = requestAnimationFrame(options.step)
407
+ } else {
408
+ options.id = null
409
+ }
410
+ }
411
+ },
467
412
  updateLayer (name, geoJson, options = {}) {
468
413
  // Retrieve the layer
469
414
  let layer = this.getLeafletLayerByName(name)
@@ -484,7 +429,7 @@ export const geojsonLayers = {
484
429
  const removeMissing = _.get(options, 'removeMissing', layer.options.removeMissing)
485
430
  // Check if clustering on top of a realtime layer, in this case we have a top-level container
486
431
  let container
487
- if (typeof layer.getLayers === 'function') {
432
+ if (layer instanceof L.MarkerClusterGroup) {
488
433
  container = layer
489
434
  layer = container.getLayers().find(layer => layer._container === container)
490
435
  }
@@ -500,7 +445,23 @@ export const geojsonLayers = {
500
445
  features = features.filter(feature => layer.getLayer(layer.options.getFeatureId(feature)))
501
446
  layer.remove(features)
502
447
  } else if (geoJson) {
503
- if (typeof layer._onNewData === 'function') layer._onNewData(removeMissing, geoJson)
448
+ if (typeof layer._onNewData === 'function') {
449
+ const duration = _.get(options, 'duration', 0)
450
+ if (duration) {
451
+ _.defaultsDeep(options, {
452
+ animate: {
453
+ geometry: { easing: { function: 'cubicBezier' }, rhumb: true }
454
+ }
455
+ })
456
+ // Stop any scheduled animation on the same layer
457
+ if (_.has(this.updateAnimations, `${name}.id`)) cancelAnimationFrame(_.get(this.updateAnimations, `${name}.id`))
458
+ options.step = this.getUpdateAnimation(name, layer, options, geoJson)
459
+ options.id = requestAnimationFrame(options.step)
460
+ _.set(this.updateAnimations, name, options)
461
+ } else {
462
+ layer._onNewData(removeMissing, geoJson)
463
+ }
464
+ }
504
465
  } else { // Fetch new data or update in place
505
466
  if (layer.tiledLayer) layer.tiledLayer.redraw()
506
467
  else if (typeof layer.update === 'function') layer.update()
@@ -523,19 +484,7 @@ export const geojsonLayers = {
523
484
  },
524
485
  onCurrentTimeChangedGeoJsonLayers (time) {
525
486
  // Need to update layers that require an update at a given frequency
526
- const geoJsonlayers = _.values(this.layers).filter(sift({
527
- // Possible for realtime layers only
528
- 'leaflet.type': 'geoJson',
529
- 'leaflet.realtime': true,
530
- $or: [ // Supported by template URL or time-based features service
531
- { 'leaflet.sourceTemplate': { $exists: true } },
532
- { service: { $exists: true } }
533
- ],
534
- // Skip layers powered by realtime service events
535
- serviceEvents: { $ne: true },
536
- // Skip invisible layers
537
- isVisible: true
538
- }))
487
+ const geoJsonlayers = _.values(this.layers).filter(sift(GeoJsonLeafletLayerFilters.TimeUpdate))
539
488
  geoJsonlayers.forEach(async geoJsonlayer => {
540
489
  // Retrieve the layer
541
490
  const layer = this.getLeafletLayerByName(geoJsonlayer.name)
@@ -572,27 +521,10 @@ export const geojsonLayers = {
572
521
  const units = _.map(Units.getUnits(quantity), 'name')
573
522
  // Need to update layers with variables affected by the unit change,
574
523
  // ie which style depends on it
575
- let geoJsonlayers = _.values(this.layers).filter(sift({
576
- 'leaflet.type': 'geoJson',
577
- 'leaflet.realtime': true,
578
- // Not sure why but this does not seem to work with sift
579
- //'variables': { $elemMatch: { unit: { $in: units } } },
580
- 'variables': { $exists: true },
581
- isVisible: true,
582
- 'leaflet.style': { $exists: true },
583
- 'leaflet.template': { $exists: true }
584
- }))
524
+ let geoJsonlayers = _.values(this.layers).filter(sift(GeoJsonLeafletLayerFilters.UnitUpdate))
585
525
  // Check for each layer if it uses the target unit and templated style uses the unit system or not
586
526
  geoJsonlayers = geoJsonlayers.filter(layer => {
587
- const unit = _.intersection(units, _.map(layer.variables, 'unit'))
588
- if (_.isEmpty(unit)) return false
589
- for (const template of layer.leaflet.template) {
590
- if (template.startsWith('style.')) {
591
- const style = _.get(layer.leaflet, template)
592
- if ((typeof style === 'string') && style.includes('Units')) return true
593
- }
594
- }
595
- return false
527
+ return hasUnitInLeafletLayerTemplate(units, layer)
596
528
  })
597
529
  // Then retrieve the engine layers and update
598
530
  geoJsonlayers.forEach(layer => {
@@ -608,17 +540,7 @@ export const geojsonLayers = {
608
540
  onMapZoomChangedGeoJsonLayers () {
609
541
  // Need to update layers with tooltip defining a minZoom/maxZoom
610
542
  // as we cannot do that in template because tooltip needs to be recreated/destroyed dynamically
611
- const geoJsonlayers = _.values(this.layers).filter(sift({
612
- 'leaflet.type': 'geoJson',
613
- 'leaflet.realtime': true,
614
- isVisible: true,
615
- // Supported by permanent tooltips only
616
- 'leaflet.tooltip.options.permanent': true,
617
- $or: [
618
- { 'leaflet.tooltip.minZoom': { $exists: true } },
619
- { 'leaflet.tooltip.maxZoom': { $exists: true } }
620
- ]
621
- }))
543
+ const geoJsonlayers = _.values(this.layers).filter(sift(GeoJsonLeafletLayerFilters.TooltipUpdate))
622
544
  geoJsonlayers.forEach(async geoJsonlayer => {
623
545
  // Retrieve the layer
624
546
  const layer = this.getLeafletLayerByName(geoJsonlayer.name)
@@ -644,7 +566,7 @@ export const geojsonLayers = {
644
566
  // Restore geojson data for in-memory layers that was hidden
645
567
  // Directly deal with the leaflet layer instead of calling updateLayer, we are just restoring data
646
568
  // Handle case where there's clustering on top (cf. updateLayer)
647
- if (typeof engineLayer.getLayers === 'function') {
569
+ if (engineLayer instanceof L.MarkerClusterGroup) {
648
570
  const container = engineLayer
649
571
  engineLayer = container.getLayers().find(layer => layer._container === container)
650
572
  }
@@ -671,6 +593,8 @@ export const geojsonLayers = {
671
593
  this.$engineEvents.on('layer-shown', this.onLayerShownGeoJsonLayers)
672
594
  this.$engineEvents.on('layer-removed', this.onLayerRemovedGeoJsonLayers)
673
595
 
596
+ // Used to store animation options when animating a layer
597
+ this.updateAnimations = {}
674
598
  // Cache where we'll store geojson data for in memory layers we'll hide
675
599
  this.geojsonCache = {}
676
600
  },
@@ -5,7 +5,7 @@ import sift from 'sift'
5
5
  import L from 'leaflet'
6
6
  import * as protomaps from 'protomaps-leaflet'
7
7
  import { mapbox_style } from '@kalisio/leaflet-pmtiles'
8
- import { Time, Units, TemplateContext } from '../../../../core/client/index.js'
8
+ import { api, Time, Units, TemplateContext } from '../../../../core/client/index.js'
9
9
 
10
10
  export const pmtilesLayers = {
11
11
  methods: {
@@ -13,6 +13,17 @@ export const pmtilesLayers = {
13
13
  const leafletOptions = options.leaflet || options
14
14
  // Check for valid types
15
15
  if (leafletOptions.type !== 'pmtiles') return
16
+
17
+ // Token required by templating
18
+ const planetApi = (typeof options.getPlanetApi === 'function' ? options.getPlanetApi() : api)
19
+ const apiJwt = (planetApi.hasConfig('apiJwt') ? await planetApi.get('storage').getItem(planetApi.getConfig('apiJwt')) : null)
20
+ const gatewayJwt = (planetApi.hasConfig('gatewayJwt') ? await planetApi.get('storage').getItem(planetApi.getConfig('gatewayJwt')) : null)
21
+
22
+ const urlTemplate = _.get(leafletOptions, 'urlTemplate')
23
+ if (urlTemplate) leafletOptions.url = _.template(urlTemplate)({ apiJwt, gatewayJwt })
24
+ const styleTemplate = _.get(leafletOptions, 'styleTemplate')
25
+ if (styleTemplate) leafletOptions.style = _.template(styleTemplate)({ apiJwt, gatewayJwt })
26
+
16
27
  // Optimize templating by creating compilers up-front
17
28
  const layerStyleTemplate = _.get(leafletOptions, 'template')
18
29
  if (layerStyleTemplate) {
@@ -37,7 +48,7 @@ export const pmtilesLayers = {
37
48
  rules = mapbox_style(style, {})
38
49
  } else {
39
50
  // Manage templating
40
- leafletOptions.template.forEach(entry => {
51
+ _.get(leafletOptions, 'template', []).forEach(entry => {
41
52
  // protomaps allows property functions with zomm/feature as input
42
53
  const f = (zoom, feature) => {
43
54
  const context = Object.assign({ properties: feature.props, feature, chroma, moment, Units, Time, level: this.selectedLevel }, TemplateContext.get())
@@ -45,15 +56,17 @@ export const pmtilesLayers = {
45
56
  }
46
57
  _.set(leafletOptions, entry.property, f)
47
58
  })
48
- const styleRules = _.map(style, rule => Object.assign(_.omit(rule, ['symbolizer']), {
49
- symbolizer: new protomaps[rule.symbolizer.type](rule.symbolizer)
50
- })
51
- )
52
- const isLabelSymbolizer = (rule) => typeof rule.symbolizer.place === 'function'
53
- const isNotLabelSymbolizer = (rule) => !isLabelSymbolizer(rule)
54
- // Support v1.x as well as v2.x
55
- rules.paint_rules = rules.paintRules = _.filter(styleRules, isNotLabelSymbolizer)
56
- rules.label_rules = rules.labelRules = _.filter(styleRules, isLabelSymbolizer)
59
+ if (style) {
60
+ const styleRules = _.map(style, rule => Object.assign(_.omit(rule, ['symbolizer']), {
61
+ symbolizer: new protomaps[rule.symbolizer.type](rule.symbolizer)
62
+ })
63
+ )
64
+ const isLabelSymbolizer = (rule) => typeof rule.symbolizer.place === 'function'
65
+ const isNotLabelSymbolizer = (rule) => !isLabelSymbolizer(rule)
66
+ // Support v1.x as well as v2.x
67
+ rules.paint_rules = rules.paintRules = _.filter(styleRules, isNotLabelSymbolizer)
68
+ rules.label_rules = rules.labelRules = _.filter(styleRules, isLabelSymbolizer)
69
+ }
57
70
  }
58
71
 
59
72
  return this.createLeafletLayer({
@@ -15,11 +15,10 @@ export const tiledMeshLayers = {
15
15
  const colorMap = _.get(options, 'variables[0].chromajs', null)
16
16
  if (colorMap) Object.assign(layerOptions, { chromajs: colorMap })
17
17
 
18
- const apiToken = await this.$api.get('storage').getItem(this.$config('gatewayJwt'))
19
-
20
18
  // Build grid source
21
19
  const [gridKey, gridConf] = extractGridSourceConfig(options)
22
20
  const weacastApi = (typeof options.getPlanetApi === 'function' ? options.getPlanetApi() : this.getWeacastApi())
21
+ const apiToken = (weacastApi.hasConfig('gatewayJwt') ? await weacastApi.get('storage').getItem(weacastApi.getConfig('gatewayJwt')) : null)
23
22
  const gridSource = makeGridSource(gridKey, { weacastApi, apiToken })
24
23
  gridSource.setup(gridConf)
25
24
  if (gridSource.updateCtx) {
@@ -1,4 +1,5 @@
1
1
  import _ from 'lodash'
2
+ import 'leaflet-velocity'
2
3
  import { Time } from '../../../../core/client/time.js'
3
4
  import { makeGridSource, extractGridSourceConfig } from '../../../common/grid.js'
4
5
  import { TiledWindLayer } from '../../leaflet/TiledWindLayer.js'
@@ -25,7 +26,7 @@ export const tiledWindLayers = {
25
26
  vSource.setup(gridConf)
26
27
  if (uSource.updateCtx) {
27
28
  // define variables for source's dynamic properties
28
- const gatewayToken = await this.$api.get('storage').getItem(this.$config('gatewayJwt'))
29
+ const gatewayToken = (weacastApi.hasConfig('gatewayJwt') ? await weacastApi.get('storage').getItem(weacastApi.getConfig('gatewayJwt')) : null)
29
30
  if (gatewayToken) {
30
31
  uSource.updateCtx.jwtToken = gatewayToken
31
32
  vSource.updateCtx.jwtToken = gatewayToken