@kalisio/kdk 2.4.1 → 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 +55 -28
  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 +55 -27
  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 +2 -2
  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/WindBarb.js +323 -0
  510. package/map/client/leaflet/utils/index.js +1 -0
  511. package/map/client/leaflet/utils/utils.events.js +8 -3
  512. package/map/client/leaflet/utils/utils.geojson.js +221 -0
  513. package/map/client/leaflet/utils/utils.style.js +10 -9
  514. package/map/client/map.js +3 -0
  515. package/map/client/mixins/globe/mixin.base-globe.js +151 -19
  516. package/map/client/mixins/globe/mixin.geojson-layers.js +208 -86
  517. package/map/client/mixins/globe/mixin.popup.js +3 -2
  518. package/map/client/mixins/globe/mixin.style.js +3 -1
  519. package/map/client/mixins/globe/mixin.tooltip.js +3 -2
  520. package/map/client/mixins/map/index.js +1 -3
  521. package/map/client/mixins/map/mixin.base-map.js +267 -79
  522. package/map/client/mixins/map/mixin.canvas-layers.js +44 -10
  523. package/map/client/mixins/map/mixin.edit-layers.js +142 -57
  524. package/map/client/mixins/map/mixin.geojson-layers.js +127 -204
  525. package/map/client/mixins/map/mixin.pmtiles-layers.js +24 -11
  526. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +1 -2
  527. package/map/client/mixins/map/mixin.tiled-wind-layers.js +2 -1
  528. package/map/client/mixins/mixin.activity.js +61 -41
  529. package/map/client/mixins/mixin.context.js +19 -14
  530. package/map/client/mixins/mixin.feature-selection.js +0 -1
  531. package/map/client/mixins/mixin.feature-service.js +41 -59
  532. package/map/client/mixins/mixin.weacast.js +1 -1
  533. package/map/client/navigator.js +38 -0
  534. package/map/client/pixi-utils.js +1 -1
  535. package/map/client/planets.js +1 -1
  536. package/map/client/readers/reader.kml.js +57 -1
  537. package/map/client/utils/index.js +1 -0
  538. package/map/client/utils/utils.capture.js +10 -7
  539. package/map/client/utils/utils.catalog.js +2 -2
  540. package/map/client/utils/utils.features.js +193 -39
  541. package/map/client/utils/utils.js +0 -21
  542. package/map/client/utils/utils.layers.js +381 -4
  543. package/map/client/utils/utils.location.js +39 -74
  544. package/map/client/utils/utils.offline.js +89 -0
  545. package/map/client/utils/utils.style.js +133 -80
  546. package/map/common/geotiff-grid-source.js +2 -1
  547. package/map/common/permissions.js +2 -0
  548. package/map/common/schemas/capture.create.json +4 -4
  549. package/map/common/schemas/catalog.update.json +18 -2
  550. package/map/common/schemas/projects.create.json +2 -2
  551. package/map/common/schemas/projects.update.json +2 -2
  552. package/map/common/tms-utils.js +5 -5
  553. package/map/common/wcs-grid-source.js +2 -2
  554. package/map/common/wcs-utils.js +8 -8
  555. package/map/common/wfs-utils.js +10 -10
  556. package/map/common/wms-utils.js +7 -7
  557. package/map/common/wmts-utils.js +6 -6
  558. package/package.json +7 -4
  559. package/test/api/core/account.test.js +0 -72
  560. package/test/api/core/authentication.test.js +184 -0
  561. package/test/api/core/config/default.cjs +1 -3
  562. package/test/api/core/index.test.js +33 -96
  563. package/test/api/core/offline.test.js +55 -0
  564. package/test/api/core/push.test.js +3 -3
  565. package/test/api/core/{test-log-2024-06-06.log → test-log-2025-02-05.log} +3 -3
  566. package/test/api/core/{test-log-2024-11-15.log → test-log-2025-05-21.log} +1 -9
  567. package/test/api/map/alerts.test.js +1 -1
  568. package/test/api/map/config/default.cjs +2 -1
  569. package/test/api/map/data/vigicrues.observations.Q.json +47042 -0
  570. package/test/api/map/index.test.js +113 -9
  571. package/test/api/map/style.test.js +62 -0
  572. package/test/client/core/layout.js +2 -2
  573. package/test/client/core/runner.js +1 -1
  574. package/test/client/core/utils.js +52 -0
  575. package/test/client/map/catalog.js +1 -0
  576. package/core/api/hooks/hooks.groups.js +0 -48
  577. package/core/api/hooks/hooks.organisations.js +0 -152
  578. package/core/api/models/organisations.model.mongodb.js +0 -3
  579. package/core/api/models/tags.model.mongodb.js +0 -10
  580. package/core/api/services/groups/groups.hooks.js +0 -31
  581. package/core/api/services/organisations/organisations.hooks.js +0 -31
  582. package/core/api/services/organisations/organisations.service.js +0 -86
  583. package/core/api/services/tags/tags.hooks.js +0 -31
  584. package/core/api/utils.js +0 -11
  585. package/core/client/components/KChipsPane.vue +0 -103
  586. package/core/client/components/document/index.js +0 -9
  587. package/core/client/components/team/KAddMember.vue +0 -378
  588. package/core/client/components/team/KAddTag.vue +0 -121
  589. package/core/client/components/team/KChangeRole.vue +0 -118
  590. package/core/client/components/team/KGroupCard.vue +0 -110
  591. package/core/client/components/team/KGroupsActivity.vue +0 -78
  592. package/core/client/components/team/KJoinGroup.vue +0 -132
  593. package/core/client/components/team/KMemberCard.vue +0 -328
  594. package/core/client/components/team/KMemberFilter.vue +0 -49
  595. package/core/client/components/team/KMembersActivity.vue +0 -136
  596. package/core/client/components/team/KOrganisationsActivity.vue +0 -51
  597. package/core/client/components/team/KTagCard.vue +0 -72
  598. package/core/client/components/team/KTagsActivity.vue +0 -73
  599. package/core/client/components/team/index.js +0 -9
  600. package/core/client/mixins/mixin.base-context.js +0 -54
  601. package/core/client/utils/utils.platform.js +0 -12
  602. package/core/common/schemas/groups.create.json +0 -28
  603. package/core/common/schemas/groups.update.json +0 -28
  604. package/core/common/schemas/organisations.create.json +0 -28
  605. package/core/common/schemas/organisations.update.json +0 -49
  606. package/core/common/schemas/tags.create.json +0 -35
  607. package/core/common/schemas/tags.update.json +0 -35
  608. package/coverage/tmp/coverage-280506-1731704745613-0.json +0 -1
  609. package/coverage/tmp/coverage-280518-1731704745599-0.json +0 -1
  610. package/coverage/tmp/coverage-280529-1731704745588-0.json +0 -1
  611. package/coverage/tmp/coverage-280541-1731704745574-0.json +0 -1
  612. package/coverage/tmp/coverage-280548-1731704745545-0.json +0 -1
  613. package/map/client/components/KFeaturesFilter.vue +0 -259
  614. package/map/client/components/KLayerStyleEditor.vue +0 -118
  615. package/map/client/components/KLayerStyleForm.vue +0 -740
  616. package/map/client/components/KLevelSlider.vue +0 -100
  617. package/map/client/components/KNorth.vue +0 -31
  618. package/map/client/components/KPositionIndicator.vue +0 -83
  619. package/map/client/components/catalog/KCreateProject.vue +0 -100
  620. package/map/client/mixins/map/mixin.forecast-layers.js +0 -81
  621. package/map/client/mixins/map/mixin.georaster-layers.js +0 -107
  622. package/test/api/core/team.test.js +0 -670
  623. package/test/api/core/test-log-2023-12-19.log +0 -7
  624. package/test/api/core/test-log-2024-01-04.log +0 -14
  625. package/test/api/core/test-log-2024-05-14.log +0 -6
  626. package/test/api/core/test-log-2024-06-26.log +0 -25
  627. package/test/api/core/test-log-2024-06-28.log +0 -2
  628. package/test/api/core/test-log-2024-07-09.log +0 -0
  629. package/test/api/core/test-log-2024-08-13.log +0 -69
  630. package/test/api/core/test-log-2024-10-28.log +0 -53
  631. package/test/api/core/test-log-2024-11-05.log +0 -30
  632. package/test/api/core/test-log-2024-11-18.log +0 -0
  633. package/test/api/core/test-log-2024-12-03.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,20 +2,23 @@
2
2
  <KLocationSearch
3
3
  v-model="location"
4
4
  :geocoders="geocoders"
5
+ :autofocus="autofocus"
6
+ :viewbox="viewbox"
7
+ :limit="limit"
5
8
  :style="computedStyle"
6
9
  />
7
10
  </template>
8
11
 
9
12
  <script setup>
10
- import { ref, computed, watch, onBeforeUnmount } from 'vue'
13
+ import { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
11
14
  import { uid, getCssVar, useQuasar } from 'quasar'
12
15
  import bbox from '@turf/bbox'
13
- import KLocationSearch from '../location/KLocationSearch.vue'
14
16
  import { useCurrentActivity } from '../../composables'
17
+ import KLocationSearch from '../location/KLocationSearch.vue'
15
18
 
16
19
  // Data
17
20
  const $q = useQuasar()
18
- const { CurrentActivity } = useCurrentActivity()
21
+ const { CurrentActivityContext, CurrentActivity } = useCurrentActivity()
19
22
  const location = ref(null)
20
23
  const LocationLayerName = uid()
21
24
 
@@ -24,9 +27,23 @@ defineProps({
24
27
  geocoders: {
25
28
  type: Array,
26
29
  default: () => []
30
+ },
31
+ limit: {
32
+ type: Number,
33
+ default: 25,
34
+ validator: (value) => {
35
+ return value > 0 && value < 500
36
+ }
37
+ },
38
+ autofocus: {
39
+ type: Boolean,
40
+ default: false
27
41
  }
28
42
  })
29
43
 
44
+ // Data
45
+ const viewbox = ref(null)
46
+
30
47
  // Computed
31
48
  const computedStyle = computed(() => {
32
49
  if ($q.screen.lt.md) return 'width: 80vw'
@@ -37,7 +54,7 @@ const computedStyle = computed(() => {
37
54
  // Functions
38
55
  async function createLocationLayer () {
39
56
  // create the layer
40
- const style = CurrentActivity.value.activityOptions.engine.style.location
57
+ const style = CurrentActivityContext.config.engine.style.location
41
58
  await CurrentActivity.value.addLayer({
42
59
  name: LocationLayerName,
43
60
  type: 'OverlayLayer',
@@ -80,19 +97,30 @@ async function createLocationLayer () {
80
97
  CurrentActivity.value.zoomToBBox(bbox(location.value))
81
98
  }
82
99
  }
83
-
84
100
  async function removeLocationLayer () {
85
101
  if (CurrentActivity.value) await CurrentActivity.value.removeLayer(LocationLayerName)
86
102
  }
103
+ function onMoveEnd () {
104
+ const bounds = CurrentActivity.value.getBounds()
105
+ viewbox.value = [bounds[0][1], bounds[0][0], bounds[1][1], bounds[1][0]]
106
+ }
87
107
 
88
- // Watchers
108
+ // Watch
89
109
  watch(location, async (newLocation, previousLocation) => {
90
110
  if (previousLocation) await removeLocationLayer()
91
111
  if (newLocation) await createLocationLayer()
92
112
  })
93
113
 
94
114
  // Hooks
115
+ onMounted(() => {
116
+ // start listening moveend event to update the current viewbox
117
+ CurrentActivity.value.$engineEvents.on('moveend', onMoveEnd)
118
+ onMoveEnd()
119
+ })
95
120
  onBeforeUnmount(async () => {
121
+ // stop listening moveend event
122
+ CurrentActivity.value.$engineEvents.off('moveend', onMoveEnd)
123
+ // remove the marker if any
96
124
  if (location.value) await removeLocationLayer()
97
125
  })
98
126
  </script>
@@ -58,7 +58,7 @@ export default {
58
58
  style: {
59
59
  shape: 'none',
60
60
  icon: {
61
- url: '/icons/kdk/mapillary-marker.png',
61
+ url: '/kdk/mapillary-marker.png',
62
62
  size: 40,
63
63
  rotation: bearing
64
64
  }
@@ -22,6 +22,7 @@
22
22
  :end-time="endTime"
23
23
  @zoom-start="onZoomStart"
24
24
  @zoom-end="onZoomEnd"
25
+ @legend-clicked="onLegendClicked"
25
26
  />
26
27
  <KDataTable v-else
27
28
  :ref="components[index].onTableRef"
@@ -55,6 +56,7 @@
55
56
  :end-time="endTime"
56
57
  @zoom-start="onZoomStart"
57
58
  @zoom-end="onZoomEnd"
59
+ @legend-clicked="onLegendClicked"
58
60
  />
59
61
  <KDataTable v-else
60
62
  :ref="components[index].onTableRef"
@@ -84,11 +86,6 @@ import KPanel from '../../../../core/client/components/KPanel.vue'
84
86
  import KTimeSeriesChart from '../../../../core/client/components/chart/KTimeSeriesChart.vue'
85
87
  import KDataTable from '../../../../core/client/components/chart/KDataTable.vue'
86
88
 
87
- const emit = defineEmits(['zoom-start', 'zoom-end'])
88
- // const timeseries = [
89
- // { label: 'group1', series: [] }
90
- // { label: 'group2', series: [] }
91
- // ]
92
89
  const props = defineProps({
93
90
  timeSeries: { type: Array, default: () => [] },
94
91
  xAxisKey: { type: String, default: 'x' },
@@ -102,6 +99,9 @@ const props = defineProps({
102
99
  exportOptions: { type: Object, default: () => ({}) }
103
100
  })
104
101
 
102
+ // Emits
103
+ const emit = defineEmits(['zoom-start', 'zoom-end', 'legend-clicked'])
104
+
105
105
  // data
106
106
  const components = ref([])
107
107
  const startTime = ref(null)
@@ -195,6 +195,9 @@ function onZoomEnd ({ chart, start, end }) {
195
195
  endTime.value = moment.utc(end)
196
196
  emit('zoom-end', { chart, start, end, zoomHistory })
197
197
  }
198
+ function onLegendClicked (legendItem, legend) {
199
+ emit('legend-clicked', legendItem, legend)
200
+ }
198
201
  function update () {
199
202
  _.forEach(components.value, component => {
200
203
  if (component.chart) component.chart.update()
@@ -1,55 +1,57 @@
1
1
  import _ from 'lodash'
2
- import { onBeforeUnmount, unref, shallowRef } from 'vue'
2
+ import { unref, shallowRef } from 'vue'
3
3
  import * as composables from '../../../core/client/composables/index.js'
4
- import { api } from '../../../core/client/api.js'
5
4
  import { useSelection } from './selection.js'
6
5
  import { useProbe } from './probe.js'
7
6
  import { useHighlight } from './highlight.js'
8
7
 
8
+ const ActivityComposables = {}
9
+
9
10
  // When creating an activity we are interested by all aspects
10
11
  export function useActivity (name, options = {}) {
11
12
  _.defaults(options, { selection: true, probe: true, highlight: true })
12
13
 
14
+ // data
13
15
  const coreActivity = composables.useActivity(name, options)
16
+ const { CurrentActivityContext } = coreActivity
14
17
  let selection, probe, highlight
15
18
 
19
+ // functions
20
+ function setCurrentActivity (activity) {
21
+ coreActivity.setCurrentActivity(activity)
22
+ if (selection) selection.setCurrentActivity(activity)
23
+ if (probe) probe.setCurrentActivity(activity)
24
+ if (highlight) highlight.setCurrentActivity(activity)
25
+ }
26
+
16
27
  // expose
17
28
  const expose = {
18
29
  ...coreActivity
19
30
  }
20
31
  if (options.selection) {
21
- selection = useSelection(name, _.get(coreActivity, 'options.selection'))
32
+ selection = useSelection(name, _.get(CurrentActivityContext, 'config.selection'))
22
33
  Object.assign(expose, {
23
34
  ...selection
24
35
  })
25
36
  }
26
37
  if (options.probe) {
27
- probe = useProbe(name, _.get(coreActivity, 'options.probe'))
38
+ probe = useProbe(name, _.get(CurrentActivityContext, 'config.probe'))
28
39
  Object.assign(expose, {
29
40
  ...probe
30
41
  })
31
42
  }
32
43
  if (options.highlight) {
33
- highlight = useHighlight(name, _.get(coreActivity, 'options.highlight'))
44
+ highlight = useHighlight(name, _.get(CurrentActivityContext, 'config.highlight'))
34
45
  Object.assign(expose, {
35
46
  ...highlight
36
47
  })
37
48
  }
38
-
39
- // functions
40
- function setCurrentActivity (activity) {
41
- coreActivity.setCurrentActivity(activity)
42
- if (selection) selection.setCurrentActivity(activity)
43
- if (probe) probe.setCurrentActivity(activity)
44
- if (highlight) highlight.setCurrentActivity(activity)
45
- }
46
-
47
- // Cleanup on destroy
48
- onBeforeUnmount(() => setCurrentActivity(null))
49
-
50
- return Object.assign(expose, {
49
+ Object.assign(expose, {
51
50
  setCurrentActivity
52
51
  })
52
+ // Store exposed data and functions so that useCurrentActivity() will return the same context
53
+ _.set(ActivityComposables, name, expose)
54
+ return expose
53
55
  }
54
56
 
55
57
  const activityProject = shallowRef(null)
@@ -58,7 +60,10 @@ const activityProject = shallowRef(null)
58
60
  export function useCurrentActivity (options = {}) {
59
61
  _.defaults(options, { selection: true, probe: true })
60
62
 
61
- const { kActivity, kActivityName, state: activityState, options: activityOptions } = composables.useCurrentActivity()
63
+ // data
64
+ const coreActivity = composables.useCurrentActivity()
65
+ const { CurrentActivityContext } = coreActivity
66
+
62
67
  // functions
63
68
  function setActivityProject (project) {
64
69
  activityProject.value = unref(project)
@@ -69,33 +74,14 @@ export function useCurrentActivity (options = {}) {
69
74
 
70
75
  // expose
71
76
  const expose = {
72
- kActivity,
73
- CurrentActivity: kActivity,
74
- kActivityName,
75
- CurrentActivityName: kActivityName,
77
+ ...coreActivity,
76
78
  setActivityProject,
77
79
  getActivityProject
78
80
  }
79
- if (kActivityName.value) {
80
- Object.assign(expose, {
81
- state: activityState,
82
- options: activityOptions
83
- })
84
- if (options.selection) {
85
- Object.assign(expose, {
86
- ...useSelection(kActivityName.value, _.get(options, 'selection'))
87
- })
88
- }
89
- if (options.probe) {
90
- Object.assign(expose, {
91
- ...useProbe(kActivityName.value, _.get(options, 'probe'))
92
- })
93
- }
94
- if (options.highlight) {
95
- Object.assign(expose, {
96
- ...useHighlight(kActivityName.value, _.get(options, 'highlight'))
97
- })
98
- }
81
+ if (CurrentActivityContext.name) {
82
+ // Retrieved the same exposed data and function from useActivity()
83
+ Object.assign(expose, _.get(ActivityComposables, CurrentActivityContext.name))
99
84
  }
85
+
100
86
  return expose
101
87
  }
@@ -12,7 +12,7 @@ export function useCatalog (options = {}) {
12
12
  categories: {},
13
13
  sublegends: {},
14
14
  views: {},
15
- // Default to global catalog
15
+ // Default to contextual or global catalog depending on store
16
16
  context: '',
17
17
  // Default to app API
18
18
  planetApi: api
@@ -3,46 +3,53 @@ import config from 'config'
3
3
  import bbox from '@turf/bbox'
4
4
  import bboxPolygon from '@turf/bbox-polygon'
5
5
  import { uid } from 'quasar'
6
- import { unref, onUnmounted } from 'vue'
7
- import { getFeatureId, getFeatureStyleType, isLayerHighlightable } from '../utils.js'
6
+ import { unref, onBeforeMount, onBeforeUnmount } from 'vue'
7
+ import * as utils from '../utils.js'
8
8
  import * as composables from '../../../core/client/composables/index.js'
9
9
 
10
10
  export const HighlightsLayerName = uid()
11
11
  // This ensure it is on top of everything else
12
12
  export const HighlightsZIndex = 999
13
+ // This ensure highlight encompasses the target feature
14
+ export const HighlightMargin = 8
13
15
 
14
16
  export function useHighlight (name, options = {}) {
17
+ // Data
18
+ let highlightMode = 'highlightable-layers'
19
+ let layerServiceEventListeners = {}
15
20
  // Set default options
16
21
  options = Object.assign({ updateDelay: 250 }, options)
17
22
  // Retrieve activity
18
23
  const { kActivity } = composables.useCurrentActivity()
19
24
  // Avoid using .value everywhere
20
25
  let activity = unref(kActivity)
21
-
22
- // Data
23
26
  // highlight store for context
24
27
  const { store, clear, set, get, unset, has } = composables.useStore(`highlights.${name}`)
25
28
  // global highlight store
26
29
  const { forOwn } = composables.useStore('highlights')
27
30
 
28
- // functions
31
+ // Functions
29
32
  function setCurrentActivity (newActivity) {
30
33
  // Avoid multiple updates
31
34
  if (activity === newActivity) return
32
35
  // Remove highlights on previous activity and set it on new one
33
36
  if (activity) {
34
37
  removeHighlightsLayer()
38
+ activity.$engineEvents.off('layer-added', listenToFeaturesServiceEventsForLayer)
39
+ activity.$engineEvents.off('layer-removed', unlistenToFeaturesServiceEventsForLayer)
35
40
  activity.$engineEvents.off('layer-added', createHighlightsLayer)
36
41
  activity.$engineEvents.off('layer-disabled', onHighlightedLayerDisabled)
37
42
  activity.$engineEvents.off('layer-enabled', onHighlightedLayerEnabled)
38
43
  }
39
44
  activity = newActivity
40
- if (newActivity) {
45
+ if (activity) {
46
+ activity.$engineEvents.on('layer-added', listenToFeaturesServiceEventsForLayer)
47
+ activity.$engineEvents.on('layer-removed', unlistenToFeaturesServiceEventsForLayer)
41
48
  // When at least one layer is added we know the catalog has been loaded
42
49
  // so that we can add our highlight layer, before that it would be cleared by catalog loading
43
- newActivity.$engineEvents.on('layer-added', createHighlightsLayer)
44
- newActivity.$engineEvents.on('layer-disabled', onHighlightedLayerDisabled)
45
- newActivity.$engineEvents.on('layer-enabled', onHighlightedLayerEnabled)
50
+ activity.$engineEvents.on('layer-added', createHighlightsLayer)
51
+ activity.$engineEvents.on('layer-disabled', onHighlightedLayerDisabled)
52
+ activity.$engineEvents.on('layer-enabled', onHighlightedLayerEnabled)
46
53
  }
47
54
  }
48
55
  function getHighlightId (feature, layer) {
@@ -51,73 +58,80 @@ export function useHighlight (name, options = {}) {
51
58
  let id = `${name}`
52
59
  if (layer) id += `-${_.kebabCase(layer.name)}`
53
60
  if (feature) {
54
- const featureId = getFeatureId(feature, layer)
61
+ const featureId = utils.getFeatureId(feature, layer)
55
62
  if (featureId) id += `-${featureId}`
56
63
  }
57
64
  return id
58
65
  }
66
+ function isHighlightFor (highlightId, layer, feature) {
67
+ return feature ? highlightId.includes(`-${utils.getFeatureId(feature, layer)}`) : highlightId.includes(`-${_.kebabCase(layer.name)}`)
68
+ }
59
69
  function hasHighlight (feature, layer) {
60
70
  return has(getHighlightId(feature, layer))
61
71
  }
62
72
  function getHighlight (feature, layer) {
63
73
  return get(getHighlightId(feature, layer))
64
74
  }
75
+ function setHighlightGeometry (feature, highlight) {
76
+ // Assign geometry
77
+ Object.assign(highlight, feature.geometry
78
+ ? { geometry: feature.geometry }
79
+ : { geometry: { type: 'Point', coordinates: [_.get(feature, 'lng', 0), _.get(feature, 'lat', 0)] } }
80
+ )
81
+ // Use bbox for line/polygons
82
+ if (options.asBbox && (highlight.geometry.type !== 'Point')) {
83
+ Object.assign(highlight, bboxPolygon(bbox(highlight)))
84
+ }
85
+ requestHighlightsLayerUpdate()
86
+ }
87
+ function setHighlightMode (mode = 'highlightable-layers') {
88
+ highlightMode = mode
89
+ }
65
90
  function highlight (feature, layer, selected = true) {
66
- if (layer && !isLayerHighlightable(layer)) return
91
+ if (layer && (highlightMode === 'highlightable-layers') && !utils.isLayerHighlightable(layer)) return
67
92
  const highlightId = getHighlightId(feature, layer)
68
93
  // Define default highlight feature
69
94
  const highlight = {
70
95
  highlightId,
71
96
  type: 'Feature',
72
- isDisabled: (layer ? layer.isDisabled : false),
73
97
  properties: Object.assign({
74
98
  zOrder: 0,
75
99
  }, options)
76
100
  }
77
- // Assign geometry
78
- Object.assign(highlight, feature.geometry
79
- ? { geometry: feature.geometry }
80
- : { geometry: { type: 'Point', coordinates: [_.get(feature, 'lng', 0), _.get(feature, 'lat', 0)] } }
81
- )
82
- // Use bbox for line/polygons
83
- if (options.asBbox && (highlight.geometry.type !== 'Point')) {
84
- Object.assign(highlight, bboxPolygon(bbox(highlight)))
85
- }
101
+ setHighlightGeometry(feature, highlight)
86
102
  // Assign style
87
103
  if (selected) {
88
104
  // Do not alter config object
89
- const selectionStylePath = `engines.${activity.engine}.style.selection.${getFeatureStyleType(highlight)}`
105
+ const selectionStylePath = `engines.${activity.engine}.style.selection.${utils.getFeatureStyleType(highlight)}`
90
106
  let highlightStyle = _.cloneDeep(_.get(config, selectionStylePath, {}))
91
107
  if (activity.is2D()) {
92
108
  // adapt the size to the marker using feature style
109
+ let radius = _.get(feature, 'style.radius')
93
110
  let size = _.get(feature, 'style.size')
94
- if (size) {
95
- if (!Array.isArray(size)) size = [size, size]
96
- } else {
97
- let radius = _.get(feature, 'style.radius')
98
- if (radius) size = [radius * 2, radius * 2]
111
+ if (size && !Array.isArray(size)) {
112
+ size = [size, size]
99
113
  }
100
114
  // adapt the size to the marker using layer style
101
- if (!size) {
115
+ if (!size && !radius) {
102
116
  size = _.get(layer, `${activity.engine}.style.point.size`)
103
- if (size) {
104
- if (!Array.isArray(size)) size = [size, size]
105
- } else {
106
- let radius = _.get(layer, `${activity.engine}.style.point.radius`)
107
- if (radius) size = [radius * 2, radius * 2]
117
+ radius = _.get(layer, `${activity.engine}.style.point.radius`)
118
+ if (size && !Array.isArray(size)) {
119
+ size = [size, size]
108
120
  }
109
121
  }
110
- if (size) Object.assign(highlightStyle, { size: [size[0] + 8, size[1] + 8] })
122
+ // If highlight size is based on a shape with a radius use it, otherwise go for size
123
+ if (radius) Object.assign(highlightStyle, { radius: radius + 0.5 * HighlightMargin })
124
+ else if (size) Object.assign(highlightStyle, { size: [size[0] + HighlightMargin, size[1] + HighlightMargin] })
111
125
  }
112
126
  Object.assign(highlight, { style: highlightStyle })
113
127
  } else {
114
- // retrieve feature sytle
128
+ // Retrieve feature sytle
115
129
  Object.assign(highlight, { style: feature.style })
116
130
  }
117
131
  // Add additional information provided by feature, if any, for custom styling
118
132
  _.merge(highlight, _.omit(feature, ['geometry', 'style']))
119
133
  set(highlightId, highlight)
120
- requestHighlightsLayerUpdate()
134
+ setHighlightEnabled(feature, layer, layer ? !layer.isDisabled : true)
121
135
  return highlight
122
136
  }
123
137
  function unhighlight (feature, layer) {
@@ -125,17 +139,29 @@ export function useHighlight (name, options = {}) {
125
139
  unset(highlightId)
126
140
  requestHighlightsLayerUpdate()
127
141
  }
142
+ function setHighlightEnabled (feature, layer, enabled = true) {
143
+ const highlight = getHighlight(feature, layer)
144
+ _.set(highlight, 'style.visibility', enabled)
145
+ requestHighlightsLayerUpdate()
146
+ }
147
+ function setHighlightsEnabled (layer, enabled = true) {
148
+ getHighlights(layer).forEach(highlight => setHighlightEnabled(highlight, layer, enabled))
149
+ }
128
150
  function clearHighlights () {
129
151
  clear()
130
152
  requestHighlightsLayerUpdate()
131
153
  }
132
- function getHighlightedFeatures () {
154
+ function getHighlights (layer, feature) {
133
155
  // Iterate over all highlights
134
156
  let features = []
135
157
  // For each highlight store
136
- forOwn((store, key) => {
158
+ forOwn(store => {
137
159
  // Retrieve features in highlight store
138
- features = features.concat(_.flatten(_.values(store)))
160
+ _.forOwn(store, (value, key) => {
161
+ if (!layer || (layer && isHighlightFor(key, layer, feature))) {
162
+ features.push(value)
163
+ }
164
+ })
139
165
  })
140
166
  return features
141
167
  }
@@ -174,7 +200,7 @@ export function useHighlight (name, options = {}) {
174
200
  }
175
201
  function updateHighlightsLayer () {
176
202
  // Get all highlights
177
- let features = getHighlightedFeatures()
203
+ let features = getHighlights()
178
204
  // Filter invisible ones
179
205
  features = features.filter(feature => !feature.isDisabled)
180
206
  // Order from back to front
@@ -183,7 +209,7 @@ export function useHighlight (name, options = {}) {
183
209
  activity.updateLayer(HighlightsLayerName, {
184
210
  type: 'FeatureCollection',
185
211
  features
186
- }, { replace: true }) // Always start from fresh data as we debounce the update and might multiple operations might generate a wrong order otherwise
212
+ }, { replace: true }) // Always start from fresh data as we debounce the update and multiple operations might generate a wrong order otherwise
187
213
  }
188
214
  }
189
215
  // In order to avoid updating the layer too much often we queue a request update every N ms
@@ -194,39 +220,73 @@ export function useHighlight (name, options = {}) {
194
220
  if (activity) activity.removeLayer(HighlightsLayerName)
195
221
  }
196
222
  function onHighlightedLayerDisabled (layer) {
197
- // Get all highlights
198
- const features = getHighlightedFeatures()
199
- // Tag layer' features as invisible
200
- features.forEach(feature => {
201
- const suffix = `-${_.kebabCase(layer.name)}-${getFeatureId(feature, layer)}`
202
- if (feature.highlightId.endsWith(suffix)) feature.isDisabled = true
223
+ // Tag all highlights as invisible
224
+ getHighlights(layer).forEach(highlight => {
225
+ setHighlightEnabled(highlight, layer, false)
203
226
  })
204
- requestHighlightsLayerUpdate()
205
227
  }
206
228
  function onHighlightedLayerEnabled (layer) {
207
- // Get all highlights
208
- const features = getHighlightedFeatures()
209
- // Tag layer' features as visible
210
- features.forEach(feature => {
211
- const suffix = `-${_.kebabCase(layer.name)}-${getFeatureId(feature, layer)}`
212
- if (feature.highlightId.endsWith(suffix)) feature.isDisabled = false
229
+ // Tag all highlights as visible
230
+ getHighlights(layer).forEach(highlight => {
231
+ setHighlightEnabled(highlight, layer, true)
213
232
  })
214
- requestHighlightsLayerUpdate()
233
+ }
234
+ function listenToFeaturesServiceEventsForLayer (layer) {
235
+ const listeners = utils.listenToFeaturesServiceEventsForLayer(layer, {
236
+ all: onFeatureUpdated, removed: onFeatureRemoved
237
+ }, layerServiceEventListeners[layer._id])
238
+ if (listeners) layerServiceEventListeners[layer._id] = listeners
239
+ }
240
+ function unlistenToFeaturesServiceEventsForLayer (layer) {
241
+ utils.unlistenToFeaturesServiceEventsForLayer(layer, layerServiceEventListeners[layer._id])
242
+ delete layerServiceEventListeners[layer._id]
243
+ }
244
+ function listenToFeaturesServiceEventsForLayers () {
245
+ layerServiceEventListeners = {}
246
+ _.forEach(activity.getLayers(), listenToFeaturesServiceEventsForLayer)
247
+ }
248
+ function unlistenToFeaturesServiceEventsForLayers () {
249
+ _.forOwn(layerServiceEventListeners, unlistenToFeaturesServiceEventsForLayer)
250
+ layerServiceEventListeners = {}
251
+ }
252
+ function onFeatureUpdated (feature, layer) {
253
+ // Find related layer, either directly given in feature if coming from user-defined features service
254
+ // otherwise bound to the listener for features services attached to a built-in layer
255
+ if (!layer && feature.layer) layer = activity.getLayerById(feature.layer)
256
+ if (!layer) return
257
+ if (hasHighlight(feature, layer)) setHighlightGeometry(feature, getHighlight(feature, layer))
258
+ }
259
+ function onFeatureRemoved (feature, layer) {
260
+ // Find related layer, either directly given in feature if coming from user-defined features service
261
+ // otherwise bound to the listener for features services attached to a built-in layer
262
+ if (!layer && feature.layer) layer = activity.getLayerById(feature.layer)
263
+ if (!layer) return
264
+ if (hasHighlight(feature, layer)) unhighlight(feature, layer)
215
265
  }
216
266
 
267
+ // Hooks
268
+ // Initialize on create
269
+ onBeforeMount(() => {
270
+ listenToFeaturesServiceEventsForLayers()
271
+ })
217
272
  // Cleanup on destroy
218
- onUnmounted(() => {
273
+ onBeforeUnmount(() => {
274
+ unlistenToFeaturesServiceEventsForLayers()
219
275
  clearHighlights()
220
276
  })
221
277
 
222
- // expose
278
+ // Expose
223
279
  return {
224
280
  setCurrentActivity,
225
281
  highlights: store,
282
+ setHighlightMode,
226
283
  hasHighlight,
227
284
  getHighlight,
285
+ getHighlights,
228
286
  highlight,
229
287
  unhighlight,
288
+ setHighlightEnabled,
289
+ setHighlightsEnabled,
230
290
  clearHighlights
231
291
  }
232
292
  }