@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
@@ -6,26 +6,42 @@ import { uid } from 'quasar'
6
6
  import { Time, Units } from '../../../../core.client.js'
7
7
  import { fetchGeoJson, getFeatureId, processFeatures, getFeatureStyleType, isInMemoryLayer } from '../../utils.js'
8
8
  import { convertSimpleStyleToPointStyle, convertSimpleStyleToLineStyle, convertSimpleStyleToPolygonStyle } from '../../utils/utils.style.js'
9
- import { convertToCesiumFromSimpleStyle, getPointSimpleStyle, getLineSimpleStyle, getPolygonSimpleStyle } from '../../cesium/utils/utils.style.js'
9
+ import { convertToCesiumFromSimpleStyle, getPointSimpleStyle, getLineSimpleStyle, getPolygonSimpleStyle, convertToCesiumFromStyle } from '../../cesium/utils/utils.style.js'
10
+ import { createPrimitiveWithMovingTexture, findPrimitiveForEntity } from '../../cesium/utils/utils.cesium.js'
11
+ import { hasUnitInCesiumLayerTemplate, updateCesiumGeoJsonEntity, GeoJsonCesiumLayerFilters } from '../../cesium/utils/utils.geojson.js'
10
12
 
11
13
  // Custom entity types that can be created from a base entity like eg a polyline
12
- const CustomTypes = ['wall', 'corridor']
14
+ const CustomTypes = ['wall', 'corridor', 'stroke']
13
15
  // Generate an id for a custom entity type, eg 'wall'
14
16
  function getCustomEntityId (id, type) {
15
17
  return `${id}-${type}`
16
18
  }
19
+ // Generate original id from a custom id
20
+ function getOriginalEntityId (customId, type) {
21
+ const suffix = `-${type}`
22
+ return customId.endsWith(suffix) ? customId.slice(0, -suffix.length) : ''
23
+ }
24
+
25
+ function addCustomPrimitive (activity, dataSource, id, primitive, material) {
26
+ const oldCustom = dataSource.primitives.get(id)
27
+ if (oldCustom) {
28
+ activity.viewer.scene.primitives.remove(oldCustom.primitive)
29
+ const index = activity.cesiumMaterials.indexOf(oldCustom.material)
30
+ activity.cesiumMaterials.splice(index, 1)
31
+ }
32
+ dataSource.primitives.set(id, { primitive, material })
33
+ activity.viewer.scene.primitives.add(primitive)
34
+ activity.cesiumMaterials.push(material)
35
+ }
17
36
 
18
- function updateGeoJsonEntity(source, destination) {
19
- destination.position = source.position
20
- destination.orientation = source.orientation
21
- destination.properties = source.properties
22
- destination.description = source.description
23
- // Points
24
- if (source.billboard) destination.billboard = source.billboard
25
- // Lines
26
- if (source.polyline) destination.polyline = source.polyline
27
- // Polygons
28
- if (source.polygon) destination.polygon = source.polygon
37
+ function removeCustomPrimitiveById (activity, dataSource, id) {
38
+ const custom = dataSource.primitives.get(id)
39
+ if (custom) {
40
+ activity.viewer.scene.primitives.remove(custom.primitive)
41
+ const index = activity.cesiumMaterials.indexOf(custom.material)
42
+ activity.cesiumMaterials.splice(index, 1)
43
+ dataSource.primitives.delete(id)
44
+ }
29
45
  }
30
46
 
31
47
  export const geojsonLayers = {
@@ -42,9 +58,9 @@ export const geojsonLayers = {
42
58
  },
43
59
  async loadGeoJson (dataSource, geoJson, options, updateOptions = {}) {
44
60
  const cesiumOptions = options.cesium
61
+ const features = (Array.isArray(geoJson) ? geoJson : (geoJson.type === 'FeatureCollection' ? geoJson.features : [geoJson]))
45
62
  // Remove mode
46
63
  if (_.get(updateOptions, 'remove', false)) {
47
- let features = (geoJson.type === 'FeatureCollection' ? geoJson.features : [geoJson])
48
64
  features.forEach(feature => {
49
65
  const id = getFeatureId(feature, options)
50
66
  CustomTypes.forEach(type => {
@@ -52,10 +68,14 @@ export const geojsonLayers = {
52
68
  if (dataSource.entities.getById(id)) dataSource.entities.removeById(id)
53
69
  // Take care that in case of a custom entity we add it in addition to or instead the original line
54
70
  if (dataSource.entities.getById(customId)) dataSource.entities.removeById(customId)
71
+ // These are special primitives created to support animated walls & corridors
72
+ removeCustomPrimitiveById(this, dataSource, customId)
55
73
  })
56
74
  })
75
+
57
76
  return
58
77
  }
78
+
59
79
  // We use a separated source in order to load data otherwise Cesium will replace previous ones, causing flickering
60
80
  const loadingDataSource = new GeoJsonDataSource()
61
81
  loadingDataSource.notFromDrop = true
@@ -63,22 +83,35 @@ export const geojsonLayers = {
63
83
  // Now we process loaded entities to merge with existing ones if any or add new ones
64
84
  let entities = loadingDataSource.entities.values
65
85
  entities.forEach(entity => {
86
+ // Find matching feature if any and keep track of it as Cesium only keeps properties
87
+ entity.feature = features.find(feature => getFeatureId(feature, options) === entity.id)
66
88
  const previousEntity = dataSource.entities.getById(entity.id)
67
- if (previousEntity) updateGeoJsonEntity(entity, previousEntity)
89
+ if (previousEntity) updateCesiumGeoJsonEntity(entity, previousEntity)
68
90
  else dataSource.entities.add(entity)
69
91
  })
70
92
  // Remove any entity not existing anymore
71
93
  if (_.get(updateOptions, 'removeMissing', cesiumOptions.removeMissing)) {
94
+ const entitiesToRemove = []
72
95
  dataSource.entities.values.forEach(entity => {
73
96
  const id = entity.id
97
+ if (!loadingDataSource.entities.getById(id)) entitiesToRemove.push(id)
74
98
  CustomTypes.forEach(type => {
75
99
  const customId = getCustomEntityId(id, type)
76
- if (!loadingDataSource.entities.getById(id)) dataSource.entities.removeById(id)
77
100
  // Take care that in case of a custom entity we add it in addition to or instead the original line
78
- if (dataSource.entities.getById(customId)) dataSource.entities.removeById(customId)
101
+ if (dataSource.entities.getById(customId)) entitiesToRemove.push(customId)
79
102
  })
80
103
  })
104
+ entitiesToRemove.forEach(id => dataSource.entities.removeById(id))
105
+ // Cleanup custom primitives if needed too
106
+ for (const id of dataSource.primitives.keys()) {
107
+ CustomTypes.forEach(type => {
108
+ const entityId = getOriginalEntityId(id, type)
109
+ if (entityId && !loadingDataSource.entities.contains(entityId))
110
+ removeCustomPrimitiveById(this, dataSource, id)
111
+ })
112
+ }
81
113
  }
114
+
82
115
  // Process specific entities
83
116
  entities = dataSource.entities.values
84
117
  const entitiesToAdd = []
@@ -110,56 +143,81 @@ export const geojsonLayers = {
110
143
  entitiesToRemove.push(entity)
111
144
  }
112
145
  // Walls
113
- const wall = _.get(properties, 'wall')
146
+ const wall = _.get(properties, 'wall') || _.get(properties, 'entityStyle.wall')
114
147
  if (wall && entity.polyline) {
115
148
  const { stroke, strokeWidth, fill } = this.convertFromSimpleStyleOrDefaults(properties)
116
149
  // Simply push the entity, other options like font will be set using styling options
117
150
  // This one will come in addition to the original line
118
151
  const wallId = getCustomEntityId(entity.id, 'wall')
119
- entitiesToAdd.push({
120
- id: wallId,
121
- parent: entity,
122
- name: entity.name ? entity.name : wallId,
123
- description: entity.description.getValue(0),
124
- properties: entity.properties.getValue(0),
125
- wall: {
126
- positions: entity.polyline.positions.getValue(0),
127
- material: new ColorMaterialProperty(fill),
128
- outlineColor: new ConstantProperty(stroke),
129
- outlineWidth: strokeWidth,
130
- outline: new ConstantProperty(true)
152
+
153
+ const texture = _.get(properties, 'entityStyle.wall.material.image')
154
+ if (texture && _.get(properties, 'entityStyle.wall.animateMaterialAlongPath', false)) {
155
+ const options = _.get(properties, 'entityStyle.wall')
156
+ options.positions = entity.polyline.positions.getValue(0)
157
+ const { primitive, material } = createPrimitiveWithMovingTexture('wall', options)
158
+ if (primitive) {
159
+ addCustomPrimitive(this, dataSource, wallId, primitive, material)
131
160
  }
132
- })
161
+ entitiesToRemove.push(entity)
162
+ } else {
163
+ entitiesToAdd.push({
164
+ id: wallId,
165
+ parent: entity,
166
+ name: entity.name ? entity.name : wallId,
167
+ description: entity.description.getValue(0),
168
+ properties: entity.properties.getValue(0),
169
+ wall: {
170
+ positions: entity.polyline.positions.getValue(0),
171
+ material: new ColorMaterialProperty(fill),
172
+ outlineColor: new ConstantProperty(stroke),
173
+ outlineWidth: strokeWidth,
174
+ outline: new ConstantProperty(true)
175
+ }
176
+ })
177
+ }
133
178
  }
134
179
  // Corridors
135
- const corridor = _.get(properties, 'corridor')
180
+ const corridor = _.get(properties, 'corridor') || _.get(properties, 'entityStyle.corridor')
136
181
  if (corridor && entity.polyline) {
137
182
  const { stroke, strokeWidth, fill } = this.convertFromSimpleStyleOrDefaults(properties)
138
183
  // Simply push the entity, other options like width be set using styling options
139
184
  // This one will come in replacement to the original line
140
185
  const corridorId = getCustomEntityId(entity.id, 'corridor')
141
- entitiesToAdd.push({
142
- id: corridorId,
143
- parent: entity,
144
- name: entity.name ? entity.name : corridorId,
145
- description: entity.description.getValue(0),
146
- properties: entity.properties.getValue(0),
147
- corridor: {
148
- positions: entity.polyline.positions.getValue(0),
149
- material: new ColorMaterialProperty(fill),
150
- outlineColor: new ConstantProperty(stroke),
151
- outlineWidth: strokeWidth,
152
- outline: new ConstantProperty(true)
186
+
187
+ const texture = _.get(properties, 'entityStyle.corridor.material.image')
188
+ if (texture && _.get(properties, 'entityStyle.corridor.animateMaterialAlongPath', false)) {
189
+ const options = _.get(properties, 'entityStyle.corridor')
190
+ options.positions = entity.polyline.positions.getValue(0)
191
+ const { primitive, material } = createPrimitiveWithMovingTexture('corridor', options)
192
+ if (primitive) {
193
+ addCustomPrimitive(this, dataSource, corridorId, primitive, material)
153
194
  }
154
- })
155
- entitiesToRemove.push(entity)
195
+ entitiesToRemove.push(entity)
196
+ } else {
197
+ entitiesToAdd.push({
198
+ id: corridorId,
199
+ parent: entity,
200
+ name: entity.name ? entity.name : corridorId,
201
+ description: entity.description.getValue(0),
202
+ properties: entity.properties.getValue(0),
203
+ corridor: {
204
+ positions: entity.polyline.positions.getValue(0),
205
+ material: new ColorMaterialProperty(fill),
206
+ outlineColor: new ConstantProperty(stroke),
207
+ outlineWidth: strokeWidth,
208
+ outline: new ConstantProperty(true)
209
+ }
210
+ })
211
+ entitiesToRemove.push(entity)
212
+ }
156
213
  }
157
214
  // Billboard with 'none' shape should be removed as Cesium creates it even if the maki icon id is unknown
158
215
  if (entity.billboard && (_.get(properties, 'marker-symbol') === 'none')) {
159
216
  entitiesToRemove.push(entity)
160
217
  }
161
218
  // Labels
162
- const text = _.get(properties, 'icon-text')
219
+ const text = _.get(properties, 'icon-text') || _.get(properties, 'entityStyle.label.text')
220
+ const billboardImage = _.get(properties, 'entityStyle.billboard.image')
163
221
  if (text) {
164
222
  const { stroke, strokeWidth, fill } = this.convertFromSimpleStyleOrDefaults(properties)
165
223
  // Simply push the entity, other options like font will be set using styling options
@@ -175,10 +233,38 @@ export const geojsonLayers = {
175
233
  fillColor: new ConstantProperty(fill),
176
234
  outlineColor: new ConstantProperty(stroke),
177
235
  outlineWidth: strokeWidth
178
- }
236
+ },
237
+ billboard: billboardImage ? { image: billboardImage } : undefined
179
238
  })
180
239
  entitiesToRemove.push(entity)
181
240
  }
241
+ // Clamped to ground polygons with stroke
242
+ // Need to add a new entity for stroke since Cesium does not support it
243
+ if (_.get(entity, 'polygon') && _.get(properties, 'entityStyle.polygon.perPositionHeight') === false) {
244
+ const strokeId = getCustomEntityId(entity.id, 'stroke')
245
+ const { stroke, strokeWidth } = this.convertFromSimpleStyleOrDefaults(properties)
246
+ const nullAltitude = _.every(_.get(entity, 'feature.geometry.coordinates[0]', []), coord => {
247
+ return coord.length > 2 && coord[2] === 0
248
+ })
249
+ if (nullAltitude) {
250
+ const strokeEntity = {
251
+ id: strokeId,
252
+ name: entity.name ? entity.name : strokeId,
253
+ description: entity.description.getValue(0),
254
+ properties: entity.properties.getValue(0),
255
+ polyline: {
256
+ positions: entity.polygon.hierarchy.getValue().positions,
257
+ width: strokeWidth,
258
+ material: stroke,
259
+ clampToGround: true
260
+ }
261
+ }
262
+ entitiesToAdd.push(strokeEntity)
263
+ if (dataSource.entities.getById(strokeEntity.id)) {
264
+ entitiesToRemove.push(strokeEntity)
265
+ }
266
+ }
267
+ }
182
268
  }
183
269
  entitiesToRemove.forEach(entity => dataSource.entities.remove(entity))
184
270
  entitiesToAdd.forEach(entity => dataSource.entities.add(entity))
@@ -200,7 +286,8 @@ export const geojsonLayers = {
200
286
  await this.loadGeoJson(dataSource, this.getFeatures(options), options, updateOptions)
201
287
  } else if (options.service) { // Check for feature service layers only, in this case update in place
202
288
  // If no probe reference, nothing to be initialized
203
- await this.loadGeoJson(dataSource, this.getFeatures(options), options, updateOptions)
289
+ // Get original layer options to ensure we have the latest ones while getting features (e.g. filters toggle)
290
+ await this.loadGeoJson(dataSource, this.getFeatures(Object.assign({}, options, this.getLayerByName(options.name))), options, updateOptions)
204
291
  } else if (sourceTemplate) {
205
292
  const sourceToFetch = dataSource.sourceCompiler({ time: Time.getCurrentTime() })
206
293
  if (!dataSource.lastFetchedSource || (dataSource.lastFetchedSource !== sourceToFetch)) {
@@ -239,16 +326,49 @@ export const geojsonLayers = {
239
326
  if (!options.featureId && !feature._id) feature._id = uid().toString()
240
327
  // Cesium expect id to be in a 'id' property
241
328
  feature.id = getFeatureId(feature, options)
329
+
330
+ let type = getFeatureStyleType(feature)
331
+ if (_.has(feature, 'properties.entityStyle')) {
332
+ // Walls and corridors must be treated as polygons in style editor
333
+ if (_.has(feature, 'properties.entityStyle.wall')) type = 'polygon'
334
+ else if (_.has(feature, 'properties.entityStyle.corridor')) type = 'polygon'
335
+ }
336
+ if (_.get(feature, 'style.extrude')) type = 'polygon'
337
+
338
+ if (!_.has(feature, 'style')) {
339
+ // No style means first load
340
+ // Get feature style from properties (simple style)
341
+ const style = type === 'point'
342
+ ? convertSimpleStyleToPointStyle(feature.properties)
343
+ : type === 'line'
344
+ ? convertSimpleStyleToLineStyle(feature.properties)
345
+ : convertSimpleStyleToPolygonStyle(feature.properties)
346
+ _.set(feature, 'style', style)
347
+ }
348
+
242
349
  // We cannot access data outside the properties object of a feature in Cesium
243
350
  // As a consequence we copy back any style information inside
244
351
  // We need to convert to simple-style spec as cesium manages this only
245
352
  // We also need to merge all styling properties as some entities requires eg both line/polygon style (wall polylines or corridor polygons)
246
- const simpleStyle = Object.assign(getPointSimpleStyle(feature, options, engine), getLineSimpleStyle(feature, options, engine), getPolygonSimpleStyle(feature, options, engine))
353
+ const stylePerType = {
354
+ point: getPointSimpleStyle(feature, options, engine),
355
+ line: getLineSimpleStyle(feature, options, engine),
356
+ polygon: getPolygonSimpleStyle(feature, options, engine)
357
+ }
358
+
359
+ // Apply the style according to the feature type to the end to prevent overriding
360
+ const simpleStyle = Object.assign(...Object.values(stylePerType), stylePerType[type])
361
+
247
362
  // Manage our extended simple-style spec
248
363
  const text = _.get(feature, 'style.text.label')
249
364
  if (text) simpleStyle['icon-text'] = text
250
365
  if (!feature.properties) feature.properties = simpleStyle
251
366
  else Object.assign(feature.properties, simpleStyle)
367
+
368
+ const cesiumStyle = convertToCesiumFromStyle(feature, options)
369
+ _.mergeWith(feature, cesiumStyle, (objValue, srcValue) => {
370
+ if (_.isArray(objValue)) return srcValue
371
+ })
252
372
  }
253
373
  // For activities
254
374
  if (_.has(this, 'activityOptions.engine.cluster')) {
@@ -314,6 +434,10 @@ export const geojsonLayers = {
314
434
  if (!dataSource || !dataSource.name) {
315
435
  dataSource = new GeoJsonDataSource()
316
436
  dataSource.notFromDrop = true
437
+
438
+ // This is where we'll store custom primitives used for animated walls/corridors.
439
+ // Key is feature id, value is associated primitive object
440
+ dataSource.primitives = new Map()
317
441
  // Check for realtime layers
318
442
  if (cesiumOptions.realtime) {
319
443
  await this.createCesiumRealtimeGeoJsonLayer(dataSource, options)
@@ -346,16 +470,18 @@ export const geojsonLayers = {
346
470
  // Retrieve the layer
347
471
  const layer = this.getCesiumLayerByName(name)
348
472
  if (!layer) return // Cannot update invisible layer
349
- if (typeof layer.updateGeoJson === 'function') layer.updateGeoJson(geoJson, updateOptions)
473
+ // Update the geoJson layer
474
+ // Need to await to make zoomToLayer work properly on load
475
+ if (typeof layer.updateGeoJson === 'function') await layer.updateGeoJson(geoJson, updateOptions)
350
476
 
351
477
  // We keep geojson data for in memory layer in a cache since
352
478
  // these layers will be destroyed when hidden. We need to be able to restore
353
479
  // them when they get shown again
354
480
  const baseLayer = this.getLayerByName(name)
355
481
  if (isInMemoryLayer(baseLayer)) {
356
- this.geojsonCache[name] = geoJson
482
+ this.geojsonCache[name] = await this.toGeoJson(name)
357
483
  }
358
- this.onLayerUpdated(baseLayer, layer, { features: geoJson.features || [geoJson] })
484
+ this.onLayerUpdated(baseLayer, layer, { features: geoJson ? geoJson.features || [geoJson] : [] })
359
485
  },
360
486
  onLayerUpdated (layer, cesiumLayer, data) {
361
487
  this.$emit('layer-updated', layer, cesiumLayer, data)
@@ -363,19 +489,7 @@ export const geojsonLayers = {
363
489
  },
364
490
  onCurrentTimeChangedGeoJsonLayers (time) {
365
491
  // Need to update layers that require an update at a given frequency
366
- const geoJsonlayers = _.values(this.layers).filter(sift({
367
- // Possible for realtime layers only
368
- 'cesium.type': 'geoJson',
369
- 'cesium.realtime': true,
370
- $or: [ // Supported by template URL or time-based features service
371
- { 'cesium.sourceTemplate': { $exists: true } },
372
- { service: { $exists: true } }
373
- ],
374
- // Skip layers powered by realtime service events
375
- serviceEvents: { $ne: true },
376
- // Skip invisible layers
377
- isVisible: true
378
- }))
492
+ const geoJsonlayers = _.values(this.layers).filter(sift(GeoJsonCesiumLayerFilters.TimeUpdate))
379
493
  geoJsonlayers.forEach(async geoJsonlayer => {
380
494
  // Retrieve the layer
381
495
  const dataSource = this.getCesiumLayerByName(geoJsonlayer.name)
@@ -391,32 +505,15 @@ export const geojsonLayers = {
391
505
  const units = _.map(Units.getUnits(quantity), 'name')
392
506
  // Need to update layers with variables affected by the unit change,
393
507
  // ie which style depends on it
394
- let geoJsonlayers = _.values(this.layers).filter(sift({
395
- 'cesium.type': 'geoJson',
396
- 'cesium.realtime': true,
397
- // Not sure why but this does not seem to work with sift
398
- //'variables': { $elemMatch: { unit: { $in: units } } },
399
- 'variables': { $exists: true },
400
- isVisible: true,
401
- 'cesium.style': { $exists: true },
402
- 'cesium.template': { $exists: true }
403
- }))
508
+ let geoJsonlayers = _.values(this.layers).filter(sift(GeoJsonCesiumLayerFilters.UnitUpdate))
404
509
  // Check for each layer if it uses the target unit and templated style uses the unit system or not
405
510
  geoJsonlayers = geoJsonlayers.filter(layer => {
406
- const unit = _.intersection(units, _.map(layer.variables, 'unit'))
407
- if (_.isEmpty(unit)) return false
408
- for (const template of layer.cesium.template) {
409
- if (template.startsWith('style.')) {
410
- const style = _.get(layer.cesium, template)
411
- if ((typeof style === 'string') && style.includes('Units')) return true
412
- }
413
- }
414
- return false
511
+ return hasUnitInCesiumLayerTemplate(units, layer)
415
512
  })
416
513
  // Then retrieve the engine layers and update
417
514
  geoJsonlayers.forEach(layer => {
418
515
  // Retrieve the layer
419
- const dataSource = this.getCesiumLayerByName(geoJsonlayer.name)
516
+ const dataSource = this.getCesiumLayerByName(layer.name)
420
517
  dataSource.updateGeoJson()
421
518
  })
422
519
  })
@@ -439,6 +536,31 @@ export const geojsonLayers = {
439
536
  if (_.has(this.geojsonCache, layer.name)) {
440
537
  delete this.geojsonCache[layer.name]
441
538
  }
539
+ },
540
+ selectFeaturesForPostProcess (effect, layerName, featureIds) {
541
+ // Make sure post process is enabled
542
+ const stage = this.getPostProcessStage(effect)
543
+ if (!stage) return
544
+ // Make sure layer exists
545
+ const layer = this.getCesiumLayerByName(layerName)
546
+ if (!layer) return
547
+ // Expect layer to be a datasource
548
+ if (!layer.entities) return
549
+
550
+ const ids = Array.isArray(featureIds) ? featureIds : [ featureIds ]
551
+ const primitives = []
552
+ ids.forEach((id) => {
553
+ // Lookup entity based on featureId
554
+ const entity = layer.entities.getById(id)
555
+ if (!entity) return
556
+ // Lookup associated primitive
557
+ const primitive = findPrimitiveForEntity(entity, this.viewer)
558
+ if (!primitive) return
559
+
560
+ primitives.push(primitive)
561
+ })
562
+
563
+ stage.selected = primitives
442
564
  }
443
565
  },
444
566
  created () {
@@ -23,8 +23,9 @@ export const popup = {
23
23
  if (!text) {
24
24
  if (popupStyle.template) {
25
25
  const compiler = popupStyle.compiler
26
- // FIXME: the whole feature is lost by Cesium so that top-level properties have disappeared
27
- text = compiler({ feature: { properties }, properties, $t: this.$t, Units, Time, moment })
26
+ // The whole feature is lost by Cesium so that top-level properties have disappeared
27
+ // but we try to keep track of it eg in GeoJson layers
28
+ text = compiler({ feature: entity.feature || { properties }, properties, $t: this.$t, Units, Time, moment })
28
29
  } else if (popupStyle.pick) {
29
30
  properties = _.pick(properties, popupStyle.pick)
30
31
  } else if (popupStyle.omit) {
@@ -57,7 +57,9 @@ export const style = {
57
57
  const entityStyle = _.cloneDeep(cesiumOptions.entityStyle)
58
58
  entityStyleTemplate.forEach(entry => {
59
59
  // Perform templating, set using simple spec mapping first then raw if property not found
60
- let value = entry.compiler({ properties, chroma, moment, Units, Time })
60
+ // The whole feature is lost by Cesium so that top-level properties have disappeared
61
+ // but we try to keep track of it eg in GeoJson layers
62
+ let value = entry.compiler({ feature: entity.feature || { properties }, properties, chroma, moment, Units, Time })
61
63
  const property = entry.property
62
64
  // Handle specific case of orientation
63
65
  if ((property === 'orientation') && entity.position) {
@@ -38,8 +38,9 @@ export const tooltip = {
38
38
  if (text && (typeof text.toString === 'function')) text = text.toString()
39
39
  } else if (tooltipStyle.template) {
40
40
  const compiler = tooltipStyle.compiler
41
- // FIXME: the whole feature is lost by Cesium so that top-level properties have disappeared
42
- text = compiler({ feature: { properties }, properties, $t: this.$t, Units, Time, moment })
41
+ // The whole feature is lost by Cesium so that top-level properties have disappeared
42
+ // but we try to keep track of it eg in GeoJson layers
43
+ text = compiler({ feature: entity.feature || { properties }, properties, $t: this.$t, Units, Time, moment })
43
44
  }
44
45
  }
45
46
  if (text) {
@@ -1,8 +1,6 @@
1
1
  export * from './mixin.base-map.js'
2
2
  export * from './mixin.geojson-layers.js'
3
3
  export * from './mixin.file-layers.js'
4
- export * from './mixin.forecast-layers.js'
5
- export * from './mixin.georaster-layers.js'
6
4
  export * from './mixin.edit-layers.js'
7
5
  export * from './mixin.style.js'
8
6
  export * from './mixin.tooltip.js'
@@ -14,4 +12,4 @@ export * from './mixin.heatmap-layers.js'
14
12
  export * from './mixin.mapillary-layers.js'
15
13
  export * from './mixin.gsmap-layers.js'
16
14
  export * from './mixin.canvas-layers.js'
17
- export * from './mixin.pmtiles-layers.js'
15
+ export * from './mixin.pmtiles-layers.js'