@kalisio/kdk 2.4.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/core/api/application.js +12 -12
  2. package/core/api/authentication.js +51 -7
  3. package/core/api/hooks/hooks.authentication.js +1 -59
  4. package/core/api/hooks/hooks.authorisations.js +8 -102
  5. package/core/api/hooks/hooks.model.js +4 -0
  6. package/core/api/hooks/hooks.push.js +18 -14
  7. package/core/api/hooks/hooks.users.js +0 -91
  8. package/core/api/hooks/index.js +0 -2
  9. package/core/api/services/account/account.service.js +1 -1
  10. package/core/api/services/authorisations/authorisations.service.js +28 -29
  11. package/core/api/services/index.js +38 -50
  12. package/core/api/services/messages/messages.hooks.js +4 -3
  13. package/core/api/services/users/users.service.js +5 -0
  14. package/core/client/api.js +182 -71
  15. package/core/client/broadcaster.js +20 -0
  16. package/core/client/capabilities.js +17 -7
  17. package/core/client/components/KActivity.vue +29 -34
  18. package/core/client/components/KAvatar.vue +0 -6
  19. package/core/client/components/KChip.vue +142 -39
  20. package/core/client/components/KContent.vue +13 -32
  21. package/core/client/components/KDialog.vue +29 -8
  22. package/core/client/components/KEditor.vue +120 -0
  23. package/core/client/components/KFollower.vue +75 -0
  24. package/core/client/components/KLogo.vue +2 -3
  25. package/core/client/components/KModal.vue +30 -10
  26. package/core/client/components/KSponsor.vue +1 -1
  27. package/core/client/components/KTextArea.vue +2 -5
  28. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  29. package/core/client/components/account/KProfile.vue +52 -14
  30. package/core/client/components/account/KSubscription.vue +19 -9
  31. package/core/client/components/account/KSubscriptionsManager.vue +10 -11
  32. package/core/client/components/action/KAction.vue +44 -24
  33. package/core/client/components/action/KBugReportAction.vue +4 -5
  34. package/core/client/components/action/KToggleStickyVisibility.vue +41 -0
  35. package/core/client/components/action/KToggleWidgetVisibility.vue +41 -0
  36. package/core/client/components/app/KPlatform.vue +122 -35
  37. package/core/client/components/app/KRequestProgressBar.vue +59 -0
  38. package/core/client/components/app/KSettings.vue +13 -2
  39. package/core/client/components/app/KTour.vue +2 -2
  40. package/core/client/components/chart/KTimeSeriesChart.vue +11 -3
  41. package/core/client/components/collection/KCard.vue +27 -33
  42. package/core/client/components/collection/KCardSection.vue +3 -23
  43. package/core/client/components/collection/KColumn.vue +0 -5
  44. package/core/client/components/collection/KDescriptionCardSection.vue +10 -5
  45. package/core/client/components/collection/KFilterView.vue +15 -0
  46. package/core/client/components/collection/KGrid.vue +4 -9
  47. package/core/client/components/collection/KHistory.vue +0 -5
  48. package/core/client/components/collection/KHistoryEntry.vue +0 -2
  49. package/core/client/components/collection/KItem.vue +1 -2
  50. package/core/client/components/collection/KSearchFilterControl.vue +139 -0
  51. package/core/client/components/collection/KTable.vue +1 -4
  52. package/core/client/components/collection/KTagsFilterControl.vue +70 -0
  53. package/core/client/components/collection/KTagsFilterView.vue +61 -0
  54. package/core/client/components/collection/KTimeFilterControl.vue +40 -0
  55. package/core/client/components/collection/KTimeFilterView.vue +106 -0
  56. package/core/client/components/collection/KTimeLine.vue +18 -11
  57. package/core/client/components/document/KBrowser.vue +283 -0
  58. package/core/client/components/document/KCsv.vue +52 -0
  59. package/core/client/components/document/KDocument.vue +19 -5
  60. package/core/client/components/document/KImage.vue +50 -19
  61. package/core/client/components/document/KMarkdown.vue +10 -2
  62. package/core/client/components/document/KUploader.vue +126 -0
  63. package/core/client/components/document/KVideo.vue +39 -0
  64. package/core/client/components/form/KDateField.vue +70 -0
  65. package/core/client/components/form/KDateTimeRangeField.vue +6 -17
  66. package/core/client/components/form/KDatetimeField.vue +6 -13
  67. package/core/client/components/form/KForm.vue +8 -8
  68. package/core/client/components/form/KOptionsField.vue +2 -0
  69. package/core/client/components/form/KResolutionField.vue +54 -52
  70. package/core/client/components/form/KSelectField.vue +27 -13
  71. package/core/client/components/form/KTextareaField.vue +23 -5
  72. package/core/client/components/graphics/KIcon.vue +64 -0
  73. package/core/client/components/index.js +1 -3
  74. package/core/client/components/input/KColorPicker.vue +70 -0
  75. package/core/client/components/input/KIconPicker.vue +188 -0
  76. package/core/client/components/input/KShapePicker.vue +81 -0
  77. package/core/client/components/input/index.js +7 -1
  78. package/core/client/components/layout/KFab.vue +1 -1
  79. package/core/client/components/layout/KLayout.vue +14 -2
  80. package/core/client/components/layout/KOpener.vue +9 -11
  81. package/core/client/components/layout/KPage.vue +31 -17
  82. package/core/client/components/layout/KWindow.vue +34 -18
  83. package/core/client/components/menu/KMenu.vue +52 -36
  84. package/core/client/components/menu/KSubMenu.vue +105 -0
  85. package/core/client/components/messages/KMessageCard.vue +207 -0
  86. package/core/client/components/messages/KMessageComposer.vue +199 -0
  87. package/core/client/components/messages/KMessagesTimeLine.vue +137 -0
  88. package/core/client/components/messages/index.js +7 -0
  89. package/core/client/components/screen/KErrorScreen.vue +2 -3
  90. package/core/client/components/screen/KLogoutScreen.vue +3 -1
  91. package/core/client/components/screen/KOAuthLoginScreen.vue +15 -0
  92. package/core/client/components/screen/KOAuthLogoutScreen.vue +33 -0
  93. package/core/client/components/screen/KUnauthorizedScreen.vue +16 -0
  94. package/core/client/components/time/KAbsoluteTimeRange.vue +7 -14
  95. package/core/client/components/time/KDate.vue +56 -26
  96. package/core/client/components/time/KDateTime.vue +93 -37
  97. package/core/client/components/time/KDateTimeRange.vue +197 -52
  98. package/core/client/components/time/KTime.vue +56 -26
  99. package/core/client/composables/activity.js +40 -30
  100. package/core/client/composables/{counter.js → collection-counter.js} +2 -4
  101. package/core/client/composables/collection-filter.js +111 -0
  102. package/core/client/composables/collection-timerange.js +56 -0
  103. package/core/client/composables/collection.js +13 -11
  104. package/core/client/composables/context.js +92 -0
  105. package/core/client/composables/errors.js +83 -0
  106. package/core/client/composables/index.js +5 -1
  107. package/core/client/composables/layout.js +14 -11
  108. package/core/client/composables/messages.js +4 -4
  109. package/core/client/composables/pwa.js +20 -27
  110. package/core/client/composables/schema.js +1 -1
  111. package/core/client/composables/screen.js +21 -9
  112. package/core/client/composables/selection.js +16 -4
  113. package/core/client/composables/session.js +13 -7
  114. package/core/client/composables/store.js +2 -1
  115. package/core/client/context.js +38 -0
  116. package/core/client/directives/v-hover.js +7 -4
  117. package/core/client/document.js +43 -15
  118. package/core/client/events.js +2 -2
  119. package/core/client/exporter.js +5 -4
  120. package/core/client/filter.js +1 -8
  121. package/core/client/guards.js +3 -3
  122. package/core/client/hooks/hooks.logger.js +1 -1
  123. package/core/client/hooks/hooks.offline.js +32 -0
  124. package/core/client/hooks/index.js +2 -1
  125. package/core/client/i18n/core_en.json +95 -268
  126. package/core/client/i18n/core_fr.json +181 -353
  127. package/core/client/index.js +22 -8
  128. package/core/client/layout.js +64 -25
  129. package/core/client/local-cache.js +67 -0
  130. package/core/client/local-storage.js +6 -2
  131. package/core/client/mixins/index.js +0 -1
  132. package/core/client/mixins/mixin.base-activity.js +22 -10
  133. package/core/client/mixins/mixin.base-editor.js +1 -1
  134. package/core/client/mixins/mixin.base-field.js +10 -1
  135. package/core/client/mixins/mixin.base-item.js +14 -11
  136. package/core/client/mixins/mixin.service.js +1 -5
  137. package/core/client/platform.js +44 -0
  138. package/core/client/readers/reader.blob.js +3 -3
  139. package/core/client/readers/reader.csv.js +2 -2
  140. package/core/client/readers/reader.json.js +2 -2
  141. package/core/client/services/index.js +7 -11
  142. package/core/client/storage.js +43 -8
  143. package/core/client/template-context.js +14 -14
  144. package/core/client/time.js +3 -3
  145. package/core/client/units.js +7 -4
  146. package/core/client/utils/index.js +6 -5
  147. package/core/client/utils/utils.collection.js +71 -0
  148. package/core/client/utils/utils.colors.js +29 -8
  149. package/core/client/utils/utils.content.js +14 -14
  150. package/core/client/utils/utils.files.js +17 -0
  151. package/core/client/utils/utils.items.js +4 -0
  152. package/core/client/utils/utils.math.js +18 -1
  153. package/core/client/utils/utils.push.js +22 -13
  154. package/core/client/utils/utils.screen.js +6 -2
  155. package/core/client/utils/utils.services.js +42 -0
  156. package/core/client/utils/utils.session.js +48 -12
  157. package/core/client/utils/utils.shapes.js +15 -11
  158. package/core/common/permissions.js +3 -108
  159. package/core/common/schemas/messages.update.json +16 -0
  160. package/core/common/schemas/settings.update.json +27 -8
  161. package/core/common/utils.js +2 -0
  162. package/core/common/utils.offline.js +38 -0
  163. package/coverage/core/api/application.js.html +296 -296
  164. package/coverage/core/api/authentication.js.html +206 -74
  165. package/coverage/core/api/db.js.html +61 -61
  166. package/coverage/core/api/hooks/hooks.authentication.js.html +15 -189
  167. package/coverage/core/api/hooks/hooks.authorisations.js.html +180 -462
  168. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  169. package/coverage/core/api/hooks/hooks.logger.js.html +16 -16
  170. package/coverage/core/api/hooks/hooks.model.js.html +69 -57
  171. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  172. package/coverage/core/api/hooks/hooks.push.js.html +58 -46
  173. package/coverage/core/api/hooks/hooks.query.js.html +142 -142
  174. package/coverage/core/api/hooks/hooks.schemas.js.html +1 -1
  175. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  176. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  177. package/coverage/core/api/hooks/hooks.users.js.html +54 -327
  178. package/coverage/core/api/hooks/index.html +64 -94
  179. package/coverage/core/api/hooks/index.js.html +4 -10
  180. package/coverage/core/api/index.html +41 -56
  181. package/coverage/core/api/index.js.html +1 -1
  182. package/coverage/core/api/marshall.js.html +9 -9
  183. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  184. package/coverage/core/api/models/index.html +13 -58
  185. package/coverage/core/api/models/messages.model.mongodb.js.html +35 -35
  186. package/coverage/core/api/models/organisations.model.mongodb.js.html +3 -3
  187. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  188. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  189. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  190. package/coverage/core/api/services/account/account.service.js.html +67 -67
  191. package/coverage/core/api/services/account/index.html +16 -16
  192. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  193. package/coverage/core/api/services/authorisations/authorisations.service.js.html +141 -144
  194. package/coverage/core/api/services/authorisations/index.html +19 -19
  195. package/coverage/core/api/services/databases/databases.hooks.js.html +82 -82
  196. package/coverage/core/api/services/databases/databases.service.js.html +20 -20
  197. package/coverage/core/api/services/databases/index.html +32 -32
  198. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  199. package/coverage/core/api/services/groups/index.html +1 -1
  200. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  201. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  202. package/coverage/core/api/services/import-export/index.html +1 -1
  203. package/coverage/core/api/services/index.html +21 -21
  204. package/coverage/core/api/services/index.js.html +118 -154
  205. package/coverage/core/api/services/mailer/index.html +1 -1
  206. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  207. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  208. package/coverage/core/api/services/messages/index.html +21 -21
  209. package/coverage/core/api/services/messages/messages.hooks.js.html +89 -86
  210. package/coverage/core/api/services/organisations/index.html +1 -1
  211. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  212. package/coverage/core/api/services/organisations/organisations.service.js.html +23 -23
  213. package/coverage/core/api/services/push/index.html +1 -1
  214. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  215. package/coverage/core/api/services/push/push.service.js.html +1 -1
  216. package/coverage/core/api/services/storage/index.html +5 -5
  217. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  218. package/coverage/core/api/services/storage/storage.service.js.html +27 -27
  219. package/coverage/core/api/services/tags/index.html +1 -1
  220. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  221. package/coverage/core/api/services/users/index.html +23 -8
  222. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  223. package/coverage/core/api/services/users/users.service.js.html +100 -0
  224. package/coverage/core/api/utils.js.html +1 -1
  225. package/coverage/core/common/errors.js.html +1 -1
  226. package/coverage/core/common/index.html +42 -27
  227. package/coverage/core/common/index.js.html +1 -1
  228. package/coverage/core/common/permissions.js.html +195 -510
  229. package/coverage/core/common/schema.js.html +1 -1
  230. package/coverage/core/common/utils.js.html +12 -6
  231. package/coverage/core/common/utils.offline.js.html +199 -0
  232. package/coverage/index.html +142 -172
  233. package/coverage/lcov-report/core/api/application.js.html +296 -296
  234. package/coverage/lcov-report/core/api/authentication.js.html +206 -74
  235. package/coverage/lcov-report/core/api/db.js.html +61 -61
  236. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +15 -189
  237. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +180 -462
  238. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  239. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +16 -16
  240. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +69 -57
  241. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  242. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +58 -46
  243. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +142 -142
  244. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +1 -1
  245. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  246. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  247. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +54 -327
  248. package/coverage/lcov-report/core/api/hooks/index.html +64 -94
  249. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  250. package/coverage/lcov-report/core/api/index.html +41 -56
  251. package/coverage/lcov-report/core/api/index.js.html +1 -1
  252. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  253. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  254. package/coverage/lcov-report/core/api/models/index.html +13 -58
  255. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +35 -35
  256. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +3 -3
  257. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  258. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  259. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  260. package/coverage/lcov-report/core/api/services/account/account.service.js.html +67 -67
  261. package/coverage/lcov-report/core/api/services/account/index.html +16 -16
  262. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  263. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +141 -144
  264. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  265. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +82 -82
  266. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +20 -20
  267. package/coverage/lcov-report/core/api/services/databases/index.html +32 -32
  268. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  269. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  270. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  271. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  272. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  273. package/coverage/lcov-report/core/api/services/index.html +21 -21
  274. package/coverage/lcov-report/core/api/services/index.js.html +118 -154
  275. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  276. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  277. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  278. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  279. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +89 -86
  280. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  281. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  282. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +23 -23
  283. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  284. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  285. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  286. package/coverage/lcov-report/core/api/services/storage/index.html +5 -5
  287. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  288. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +27 -27
  289. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  290. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  291. package/coverage/lcov-report/core/api/services/users/index.html +23 -8
  292. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  293. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  294. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  295. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  296. package/coverage/lcov-report/core/common/index.html +42 -27
  297. package/coverage/lcov-report/core/common/index.js.html +1 -1
  298. package/coverage/lcov-report/core/common/permissions.js.html +195 -510
  299. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  300. package/coverage/lcov-report/core/common/utils.js.html +12 -6
  301. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  302. package/coverage/lcov-report/index.html +142 -172
  303. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +125 -29
  304. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  305. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +20 -44
  306. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  307. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  308. package/coverage/lcov-report/map/api/index.html +1 -1
  309. package/coverage/lcov-report/map/api/index.js.html +1 -1
  310. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  311. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  312. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +49 -7
  313. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  314. package/coverage/lcov-report/map/api/models/index.html +22 -7
  315. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  316. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +112 -0
  317. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  318. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  319. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  320. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +29 -11
  321. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  322. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  323. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  324. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +78 -9
  325. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  326. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  327. package/coverage/lcov-report/map/api/services/index.html +5 -5
  328. package/coverage/lcov-report/map/api/services/index.js.html +287 -50
  329. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  330. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  331. package/coverage/lcov-report/map/api/services/styles/index.html +116 -0
  332. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +196 -0
  333. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  334. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  335. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +8 -5
  336. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  337. package/coverage/lcov-report/map/common/index.html +7 -7
  338. package/coverage/lcov-report/map/common/index.js.html +1 -1
  339. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  340. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  341. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  342. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  343. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  344. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  345. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  346. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  347. package/coverage/lcov-report/map/common/wcs-utils.js.html +9 -9
  348. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  349. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  350. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  351. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  352. package/coverage/lcov.info +2581 -3278
  353. package/coverage/map/api/hooks/hooks.catalog.js.html +125 -29
  354. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  355. package/coverage/map/api/hooks/hooks.query.js.html +20 -44
  356. package/coverage/map/api/hooks/index.html +7 -7
  357. package/coverage/map/api/hooks/index.js.html +1 -1
  358. package/coverage/map/api/index.html +1 -1
  359. package/coverage/map/api/index.js.html +1 -1
  360. package/coverage/map/api/marshall.js.html +1 -1
  361. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  362. package/coverage/map/api/models/catalog.model.mongodb.js.html +49 -7
  363. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  364. package/coverage/map/api/models/index.html +22 -7
  365. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  366. package/coverage/map/api/models/styles.model.mongodb.js.html +112 -0
  367. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  368. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  369. package/coverage/map/api/services/alerts/index.html +1 -1
  370. package/coverage/map/api/services/catalog/catalog.hooks.js.html +29 -11
  371. package/coverage/map/api/services/catalog/index.html +5 -5
  372. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  373. package/coverage/map/api/services/daptiles/index.html +1 -1
  374. package/coverage/map/api/services/features/features.hooks.js.html +78 -9
  375. package/coverage/map/api/services/features/features.service.js.html +307 -4
  376. package/coverage/map/api/services/features/index.html +7 -7
  377. package/coverage/map/api/services/index.html +5 -5
  378. package/coverage/map/api/services/index.js.html +287 -50
  379. package/coverage/map/api/services/projects/index.html +1 -1
  380. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  381. package/coverage/map/api/services/styles/index.html +116 -0
  382. package/coverage/map/api/services/styles/styles.hooks.js.html +196 -0
  383. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  384. package/coverage/map/common/errors.js.html +1 -1
  385. package/coverage/map/common/geotiff-grid-source.js.html +8 -5
  386. package/coverage/map/common/grid.js.html +1 -1
  387. package/coverage/map/common/index.html +7 -7
  388. package/coverage/map/common/index.js.html +1 -1
  389. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  390. package/coverage/map/common/moment-utils.js.html +1 -1
  391. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  392. package/coverage/map/common/opendap-utils.js.html +1 -1
  393. package/coverage/map/common/permissions.js.html +10 -4
  394. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  395. package/coverage/map/common/tms-utils.js.html +6 -6
  396. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  397. package/coverage/map/common/wcs-utils.js.html +9 -9
  398. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  399. package/coverage/map/common/wfs-utils.js.html +11 -11
  400. package/coverage/map/common/wms-utils.js.html +8 -8
  401. package/coverage/map/common/wmts-utils.js.html +7 -7
  402. package/coverage/tmp/coverage-323534-1747828879483-0.json +1 -0
  403. package/coverage/tmp/coverage-323546-1747828879453-0.json +1 -0
  404. package/coverage/tmp/coverage-323557-1747828879439-0.json +1 -0
  405. package/coverage/tmp/coverage-323569-1747828879416-0.json +1 -0
  406. package/coverage/tmp/coverage-323576-1747828879390-0.json +1 -0
  407. package/extras/configs/helpers.js +78 -0
  408. package/extras/configs/panes.left.js +118 -0
  409. package/extras/configs/panes.top.js +222 -0
  410. package/extras/configs/stickies.js +57 -0
  411. package/extras/configs/widgets.left.js +23 -0
  412. package/extras/configs/widgets.top.js +73 -0
  413. package/extras/css/core.variables.scss +8 -0
  414. package/extras/images/north.svg +3 -0
  415. package/extras/tours/map/side-nav.js +3 -3
  416. package/map/api/hooks/hooks.catalog.js +56 -23
  417. package/map/api/hooks/hooks.query.js +16 -24
  418. package/map/api/models/catalog.model.mongodb.js +16 -2
  419. package/{core/api/models/groups.model.mongodb.js → map/api/models/styles.model.mongodb.js} +2 -1
  420. package/map/api/services/catalog/catalog.hooks.js +13 -7
  421. package/map/api/services/features/features.hooks.js +28 -5
  422. package/map/api/services/features/features.service.js +101 -0
  423. package/map/api/services/index.js +125 -46
  424. package/map/api/services/styles/styles.hooks.js +37 -0
  425. package/map/client/cesium/utils/index.js +1 -0
  426. package/map/client/cesium/utils/utils.cesium.js +397 -0
  427. package/map/client/cesium/utils/utils.features.js +8 -0
  428. package/map/client/cesium/utils/utils.geojson.js +59 -0
  429. package/map/client/cesium/utils/utils.style.js +134 -17
  430. package/map/client/components/KEditLayerData.vue +17 -79
  431. package/map/client/components/KFeatureEditor.vue +2 -7
  432. package/map/client/components/KFeaturesChart.vue +2 -6
  433. package/map/client/components/KFeaturesFilterEditor.vue +300 -0
  434. package/map/client/components/KFeaturesFilterManager.vue +196 -0
  435. package/map/client/components/KFeaturesTable.vue +0 -5
  436. package/map/client/components/KFilterCondition.vue +303 -0
  437. package/map/client/components/KLayerEditionToolbar.vue +4 -3
  438. package/map/client/components/KLayerEditor.vue +451 -36
  439. package/map/client/components/KMeasureTool.vue +36 -9
  440. package/map/client/components/KProjectMenu.vue +14 -8
  441. package/map/client/components/catalog/KAddLayer.vue +0 -4
  442. package/map/client/components/catalog/KBaseLayersSelector.vue +42 -46
  443. package/map/client/components/catalog/KConnectLayer.vue +295 -291
  444. package/map/client/components/catalog/KCreateLayer.vue +141 -146
  445. package/map/client/components/catalog/KCreateOfflineView.vue +100 -0
  446. package/map/client/components/catalog/KCreateView.vue +2 -8
  447. package/map/client/components/catalog/KFilteredLayerItem.vue +72 -25
  448. package/map/client/components/catalog/KImportLayer.vue +121 -129
  449. package/map/client/components/catalog/KLayerItem.vue +44 -32
  450. package/map/client/components/catalog/KLayersPanel.vue +45 -17
  451. package/map/client/components/catalog/KLayersSelector.vue +51 -50
  452. package/map/client/components/catalog/KProjectManager.vue +4 -8
  453. package/map/client/components/catalog/KProjectSelector.vue +33 -2
  454. package/map/client/components/catalog/KProjectsPanel.vue +84 -106
  455. package/map/client/components/catalog/KSelectLayers.vue +56 -69
  456. package/map/client/components/catalog/KSelectViews.vue +56 -69
  457. package/map/client/components/catalog/KViewSelector.vue +32 -2
  458. package/map/client/components/catalog/KViewsPanel.vue +178 -110
  459. package/map/client/components/catalog/KWeatherLayersSelector.vue +77 -85
  460. package/map/client/components/form/KLocationField.vue +21 -2
  461. package/map/client/components/form/KOwsLayerField.vue +1 -1
  462. package/map/client/components/form/KOwsServiceField.vue +102 -63
  463. package/map/client/components/form/KSelectLayersField.vue +1 -1
  464. package/map/client/components/form/KSelectViewsField.vue +1 -1
  465. package/map/client/components/form/KTimezoneField.vue +0 -1
  466. package/map/client/components/legend/KLegend.vue +4 -4
  467. package/map/client/components/location/KLocationCardSection.vue +16 -0
  468. package/map/client/components/location/KLocationMap.vue +3 -2
  469. package/map/client/components/location/KLocationSearch.vue +46 -8
  470. package/map/client/components/location/KLocationTimeLineCard.vue +25 -3
  471. package/map/client/components/location/KLocationTip.vue +57 -10
  472. package/map/client/components/selection/KFeaturesSelection.vue +71 -0
  473. package/map/client/components/selection/KSelectedLayerFeatures.vue +343 -0
  474. package/map/client/components/{KAttribution.vue → stickies/KAttribution.vue} +39 -33
  475. package/map/client/components/stickies/KLevelSlider.vue +114 -0
  476. package/map/client/components/stickies/KNorthArrow.vue +26 -0
  477. package/map/client/components/stickies/KPosition.vue +103 -0
  478. package/map/client/components/stickies/KTarget.vue +34 -0
  479. package/map/client/components/styles/KLayerStyleAction.vue +58 -0
  480. package/map/client/components/styles/KStyleEditor.vue +273 -0
  481. package/map/client/components/styles/KStyleEditorSection.vue +79 -0
  482. package/map/client/components/styles/KStyleManager.vue +183 -0
  483. package/map/client/components/styles/KStylePreview.vue +64 -0
  484. package/map/client/components/styles/KStylePreviewItem.vue +68 -0
  485. package/map/client/components/styles/KStylePropertiesGroup.vue +76 -0
  486. package/map/client/components/styles/KStyleProperty.vue +136 -0
  487. package/map/client/components/styles/KStyleTip.vue +118 -0
  488. package/map/client/components/tools/KGeolocateTool.vue +3 -2
  489. package/map/client/components/tools/KSearchTool.vue +34 -6
  490. package/map/client/components/widget/KMapillaryViewer.vue +1 -1
  491. package/map/client/components/widget/KStackableTimeSeries.vue +8 -5
  492. package/map/client/composables/activity.js +29 -43
  493. package/map/client/composables/catalog.js +1 -1
  494. package/map/client/composables/highlight.js +117 -57
  495. package/map/client/composables/location.js +33 -14
  496. package/map/client/composables/project.js +9 -10
  497. package/map/client/composables/selection.js +136 -23
  498. package/map/client/geocoder.js +104 -0
  499. package/map/client/geolocation.js +1 -1
  500. package/map/client/globe.js +3 -0
  501. package/map/client/hooks/hooks.offline.js +95 -0
  502. package/map/client/hooks/index.js +1 -0
  503. package/map/client/i18n/map_en.json +159 -94
  504. package/map/client/i18n/map_fr.json +186 -127
  505. package/map/client/index.js +3 -0
  506. package/map/client/init.js +44 -8
  507. package/map/client/leaflet/BoxSelection.js +2 -2
  508. package/map/client/leaflet/GradientPath.js +84 -4
  509. package/map/client/leaflet/TiledFeatureLayer.js +2 -3
  510. package/map/client/leaflet/WindBarb.js +323 -0
  511. package/map/client/leaflet/utils/index.js +1 -0
  512. package/map/client/leaflet/utils/utils.events.js +8 -3
  513. package/map/client/leaflet/utils/utils.geojson.js +221 -0
  514. package/map/client/leaflet/utils/utils.style.js +10 -9
  515. package/map/client/map.js +3 -0
  516. package/map/client/mixins/globe/mixin.base-globe.js +151 -19
  517. package/map/client/mixins/globe/mixin.geojson-layers.js +208 -86
  518. package/map/client/mixins/globe/mixin.popup.js +3 -2
  519. package/map/client/mixins/globe/mixin.style.js +3 -1
  520. package/map/client/mixins/globe/mixin.tooltip.js +3 -2
  521. package/map/client/mixins/map/index.js +1 -3
  522. package/map/client/mixins/map/mixin.base-map.js +267 -79
  523. package/map/client/mixins/map/mixin.canvas-layers.js +44 -10
  524. package/map/client/mixins/map/mixin.edit-layers.js +142 -57
  525. package/map/client/mixins/map/mixin.geojson-layers.js +129 -205
  526. package/map/client/mixins/map/mixin.pmtiles-layers.js +24 -11
  527. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +1 -2
  528. package/map/client/mixins/map/mixin.tiled-wind-layers.js +2 -1
  529. package/map/client/mixins/mixin.activity.js +61 -41
  530. package/map/client/mixins/mixin.context.js +19 -14
  531. package/map/client/mixins/mixin.feature-selection.js +0 -1
  532. package/map/client/mixins/mixin.feature-service.js +41 -59
  533. package/map/client/mixins/mixin.weacast.js +1 -1
  534. package/map/client/navigator.js +38 -0
  535. package/map/client/pixi-utils.js +1 -1
  536. package/map/client/planets.js +1 -1
  537. package/map/client/readers/reader.kml.js +57 -1
  538. package/map/client/utils/index.js +1 -0
  539. package/map/client/utils/utils.capture.js +10 -7
  540. package/map/client/utils/utils.catalog.js +2 -2
  541. package/map/client/utils/utils.features.js +193 -39
  542. package/map/client/utils/utils.js +8 -19
  543. package/map/client/utils/utils.layers.js +381 -4
  544. package/map/client/utils/utils.location.js +39 -74
  545. package/map/client/utils/utils.offline.js +89 -0
  546. package/map/client/utils/utils.style.js +133 -80
  547. package/map/client/utils/utils.time-series.js +99 -25
  548. package/map/common/geotiff-grid-source.js +2 -1
  549. package/map/common/permissions.js +2 -0
  550. package/map/common/schemas/capture.create.json +4 -4
  551. package/map/common/schemas/catalog.update.json +18 -2
  552. package/map/common/schemas/projects.create.json +2 -2
  553. package/map/common/schemas/projects.update.json +2 -2
  554. package/map/common/tms-utils.js +5 -5
  555. package/map/common/wcs-grid-source.js +2 -2
  556. package/map/common/wcs-utils.js +8 -8
  557. package/map/common/wfs-utils.js +10 -10
  558. package/map/common/wms-utils.js +7 -7
  559. package/map/common/wmts-utils.js +6 -6
  560. package/package.json +7 -4
  561. package/test/api/core/account.test.js +0 -72
  562. package/test/api/core/authentication.test.js +184 -0
  563. package/test/api/core/config/default.cjs +1 -3
  564. package/test/api/core/index.test.js +33 -96
  565. package/test/api/core/offline.test.js +55 -0
  566. package/test/api/core/push.test.js +3 -3
  567. package/test/api/core/{test-log-2024-06-06.log → test-log-2025-02-05.log} +3 -3
  568. package/test/api/core/{test-log-2024-11-15.log → test-log-2025-05-21.log} +1 -9
  569. package/test/api/map/alerts.test.js +1 -1
  570. package/test/api/map/config/default.cjs +2 -1
  571. package/test/api/map/data/vigicrues.observations.Q.json +47042 -0
  572. package/test/api/map/index.test.js +113 -9
  573. package/test/api/map/style.test.js +62 -0
  574. package/test/client/core/layout.js +2 -2
  575. package/test/client/core/runner.js +1 -1
  576. package/test/client/core/utils.js +52 -0
  577. package/test/client/map/catalog.js +1 -0
  578. package/core/api/hooks/hooks.groups.js +0 -48
  579. package/core/api/hooks/hooks.organisations.js +0 -152
  580. package/core/api/models/organisations.model.mongodb.js +0 -3
  581. package/core/api/models/tags.model.mongodb.js +0 -10
  582. package/core/api/services/groups/groups.hooks.js +0 -31
  583. package/core/api/services/organisations/organisations.hooks.js +0 -31
  584. package/core/api/services/organisations/organisations.service.js +0 -86
  585. package/core/api/services/tags/tags.hooks.js +0 -31
  586. package/core/api/utils.js +0 -11
  587. package/core/client/components/KChipsPane.vue +0 -103
  588. package/core/client/components/document/index.js +0 -9
  589. package/core/client/components/team/KAddMember.vue +0 -378
  590. package/core/client/components/team/KAddTag.vue +0 -121
  591. package/core/client/components/team/KChangeRole.vue +0 -118
  592. package/core/client/components/team/KGroupCard.vue +0 -110
  593. package/core/client/components/team/KGroupsActivity.vue +0 -78
  594. package/core/client/components/team/KJoinGroup.vue +0 -132
  595. package/core/client/components/team/KMemberCard.vue +0 -328
  596. package/core/client/components/team/KMemberFilter.vue +0 -49
  597. package/core/client/components/team/KMembersActivity.vue +0 -136
  598. package/core/client/components/team/KOrganisationsActivity.vue +0 -51
  599. package/core/client/components/team/KTagCard.vue +0 -72
  600. package/core/client/components/team/KTagsActivity.vue +0 -73
  601. package/core/client/components/team/index.js +0 -9
  602. package/core/client/mixins/mixin.base-context.js +0 -54
  603. package/core/client/utils/utils.platform.js +0 -12
  604. package/core/common/schemas/groups.create.json +0 -28
  605. package/core/common/schemas/groups.update.json +0 -28
  606. package/core/common/schemas/organisations.create.json +0 -28
  607. package/core/common/schemas/organisations.update.json +0 -49
  608. package/core/common/schemas/tags.create.json +0 -35
  609. package/core/common/schemas/tags.update.json +0 -35
  610. package/coverage/tmp/coverage-280506-1731704745613-0.json +0 -1
  611. package/coverage/tmp/coverage-280518-1731704745599-0.json +0 -1
  612. package/coverage/tmp/coverage-280529-1731704745588-0.json +0 -1
  613. package/coverage/tmp/coverage-280541-1731704745574-0.json +0 -1
  614. package/coverage/tmp/coverage-280548-1731704745545-0.json +0 -1
  615. package/map/client/components/KFeaturesFilter.vue +0 -259
  616. package/map/client/components/KLayerStyleEditor.vue +0 -118
  617. package/map/client/components/KLayerStyleForm.vue +0 -740
  618. package/map/client/components/KLevelSlider.vue +0 -100
  619. package/map/client/components/KNorth.vue +0 -31
  620. package/map/client/components/KPositionIndicator.vue +0 -83
  621. package/map/client/components/catalog/KCreateProject.vue +0 -100
  622. package/map/client/mixins/map/mixin.forecast-layers.js +0 -81
  623. package/map/client/mixins/map/mixin.georaster-layers.js +0 -107
  624. package/test/api/core/team.test.js +0 -670
  625. package/test/api/core/test-log-2023-12-19.log +0 -7
  626. package/test/api/core/test-log-2024-01-04.log +0 -14
  627. package/test/api/core/test-log-2024-05-14.log +0 -6
  628. package/test/api/core/test-log-2024-06-26.log +0 -25
  629. package/test/api/core/test-log-2024-06-28.log +0 -2
  630. package/test/api/core/test-log-2024-07-09.log +0 -0
  631. package/test/api/core/test-log-2024-08-13.log +0 -69
  632. package/test/api/core/test-log-2024-10-28.log +0 -53
  633. package/test/api/core/test-log-2024-11-05.log +0 -30
  634. package/test/api/map/test-log-2023-11-24.log +0 -121
  635. package/test/api/map/test-log-2023-12-12.log +0 -29
  636. package/test/api/map/test-log-2023-12-13.log +0 -5
  637. package/test/api/map/test-log-2024-01-04.log +0 -2
  638. package/test/api/map/test-log-2024-01-11.log +0 -1
  639. package/test/api/map/test-log-2024-01-25.log +0 -19
  640. package/test/api/map/test-log-2024-06-06.log +0 -39
  641. package/test/api/map/test-log-2024-08-13.log +0 -13
  642. package/test/api/map/test-log-2024-08-20.log +0 -55
  643. package/test/api/map/test-log-2024-09-09.log +0 -92
  644. package/test/api/map/test-log-2024-10-28.log +0 -11
  645. /package/extras/{logos → images}/kalisio.png +0 -0
  646. /package/extras/{icons → images}/target.svg +0 -0
  647. /package/test/api/map/data/{vigicrues.observations.json → vigicrues.observations.H.json} +0 -0
@@ -1,7 +1,8 @@
1
1
  import _ from 'lodash'
2
2
  import logger from 'loglevel'
3
3
  import config from 'config'
4
- import { Store, utils as kCoreUtils } from '../../../core/client/index.js'
4
+ import { Store } from '../../../core/client/index.js'
5
+ import { filterContent, bindContent, listenToServiceEvents, unlistenToServiceEvents } from '../../../core/client/utils/index.js'
5
6
  import { Geolocation } from '../geolocation.js'
6
7
  import { setEngineJwt, getLayers, getCategories } from '../utils/utils.catalog.js'
7
8
  import * as layers from '../utils/utils.layers.js'
@@ -121,25 +122,34 @@ export const activity = {
121
122
  },
122
123
  isLayerProbable: layers.isLayerProbable,
123
124
  isLayerStorable: layers.isLayerStorable,
125
+ isLayerCached: layers.isLayerCached,
126
+ isLayerCachable: layers.isLayerCachable,
127
+ setLayerCached: layers.setLayerCached,
128
+ setLayerUncached: layers.setLayerUncached,
124
129
  isLayerEditable: layers.isLayerEditable,
125
130
  isLayerRemovable: layers.isLayerRemovable,
126
131
  isLayerStyleEditable: layers.isLayerStyleEditable,
127
132
  isLayerDataEditable: layers.isLayerDataEditable,
128
133
  async resetLayer (layer) {
134
+ // Keep track of data as we will reset the layer
135
+ let geoJson
136
+ if (typeof this.toGeoJson === 'function') geoJson = await this.toGeoJson(layer.name)
129
137
  // Reset layer with new setup but keep track of current visibility state
130
138
  // as adding the layer back will restore default visibility state
131
139
  const isVisible = this.isLayerVisible(layer.name)
132
140
  await this.removeLayer(layer.name)
133
141
  await this.addLayer(layer)
134
142
  if (isVisible) await this.showLayer(layer.name)
143
+ if (geoJson && (typeof this.toGeoJson === 'function')) this.updateLayer(layer.name, geoJson)
135
144
  },
136
145
  configureLayerActions (layer) {
137
146
  let actions = _.get(this, 'activityOptions.layers.actions', [])
138
147
  // Apply filtering
139
- actions = kCoreUtils.filterContent(actions, _.get(this, 'activityOptions.layers.filter', {}))
148
+ actions = filterContent(actions, _.get(this, 'activityOptions.layers.filter', {}))
149
+
140
150
  // As context is different for each item we need to clone the global action configuration
141
151
  // otherwise context will always reference the last processed item
142
- actions = kCoreUtils.bindContent(_.cloneDeep(actions), this)
152
+ actions = bindContent(_.cloneDeep(actions), this, ['dialog'])
143
153
  // Add 'virtual' actions used to trigger the layer/filters
144
154
  actions.push({ id: 'toggle', handler: () => this.onTriggerLayer(layer) })
145
155
  actions.push({ id: 'toggle-filter', handler: (filter) => this.onTriggerLayerFilter(layer, filter) })
@@ -159,7 +169,8 @@ export const activity = {
159
169
  },
160
170
  async onTriggerLayerFilter (layer, filter) {
161
171
  // Can only apply to realtime layers as we need to force a data refresh
162
- if (typeof this.updateLayer === 'function') await this.updateLayer(layer.name)
172
+ // removeMissing seems needed for 3d
173
+ if (typeof this.updateLayer === 'function') await this.updateLayer(layer.name, null, { removeMissing: true})
163
174
  },
164
175
  onZoomIn () {
165
176
  const center = this.getCenter()
@@ -217,6 +228,12 @@ export const activity = {
217
228
  // this one can be triggered from a toolbar to accept or reject changes
218
229
  await this.stopEditLayer(status)
219
230
  },
231
+ async onResetLayerStyle (layer) {
232
+ await layers.editLayerStyle(layer, {})
233
+ if (!layer._id) {
234
+ await this.resetLayer(layer)
235
+ }
236
+ },
220
237
  async onRemoveLayer (layer) {
221
238
  // Stop any running edition
222
239
  if ((typeof this.isLayerEdited === 'function') && this.isLayerEdited(layer)) await this.stopEditLayer('reject')
@@ -235,6 +252,29 @@ export const activity = {
235
252
  if (!this.$q.fullscreen.isActive) this.$q.fullscreen.request()
236
253
  else this.$q.fullscreen.exit()
237
254
  },
255
+ listenToCatalogServiceEvents () {
256
+ // Listen about changes in global/contextual catalog services
257
+ const globalCatalogService = this.$api.getService('catalog', 'global')
258
+ const catalogService = this.$api.getService('catalog')
259
+ this.globalCatalogListeners = listenToServiceEvents('catalog', {
260
+ context: 'global', all: this.onCatalogUpdated, removed: (object) => this.onCatalogUpdated(object, 'removed')
261
+ }, this.globalCatalogListeners)
262
+ if (catalogService && (catalogService !== globalCatalogService)) {
263
+ this.catalogListeners = listenToServiceEvents('catalog', {
264
+ all: this.onCatalogUpdated, removed: (object) => this.onCatalogUpdated(object, 'removed')
265
+ }, this.catalogListeners)
266
+ }
267
+ },
268
+ unlistenToCatalogServiceEvents () {
269
+ if (this.globalCatalogListeners) unlistenToServiceEvents(this.globalCatalogListeners)
270
+ if (this.catalogListeners) unlistenToServiceEvents(this.catalogListeners)
271
+ this.globalCatalogListeners = null
272
+ this.catalogListeners = null
273
+ },
274
+ resetCatalogServiceEventsListeners () {
275
+ // Listening again will unlisten previous ones if any
276
+ this.listenToCatalogServiceEvents()
277
+ },
238
278
  async initialize () {
239
279
  // Check if the activity is using context restoration
240
280
  const hasContext = (typeof this.restoreContext === 'function')
@@ -244,7 +284,7 @@ export const activity = {
244
284
  try {
245
285
  await this.setupWeacast()
246
286
  } catch (error) {
247
- logger.error(`[KDK] ${error}`)
287
+ logger.error('[KDK]', error)
248
288
  }
249
289
  } else {
250
290
  if (weacastEnabled) logger.warn('[KDK] Weacast setup function is missing')
@@ -256,7 +296,7 @@ export const activity = {
256
296
  await this.refreshLayers()
257
297
  if (hasContext) await this.restoreContext('layers')
258
298
  } catch (error) {
259
- logger.error(`[KDK] ${error}`)
299
+ logger.error('[KDK]', error)
260
300
  }
261
301
  // Retrieve the time
262
302
  if (hasContext) await this.restoreContext('time')
@@ -267,42 +307,12 @@ export const activity = {
267
307
  await Geolocation.update()
268
308
  if (Geolocation.hasLocation()) this.center(Geolocation.getLongitude(), Geolocation.getLatitude())
269
309
  }
270
- // Listen about changes in global/contextual catalog services
271
- const globalCatalogService = this.$api.getService('catalog', '')
272
- const catalogService = this.$api.getService('catalog')
273
- // Keep track of binded listeners as we use the same function with different contexts
274
- this.catalogListeners = {}
275
- if (globalCatalogService.events !== undefined) {
276
- globalCatalogService.events.forEach(event => {
277
- // Avoid reentrance
278
- if (!this.catalogListeners[event]) {
279
- this.catalogListeners[event] = (object) => this.onCatalogUpdated(event, object)
280
- globalCatalogService.on(event, this.catalogListeners[event])
281
- if (catalogService && (catalogService !== globalCatalogService)) {
282
- catalogService.on(event, this.catalogListeners[event])
283
- }
284
- }
285
- })
286
- }
310
+ this.listenToCatalogServiceEvents()
287
311
  },
288
312
  finalize () {
289
- // Stop listening about changes in global/contextual catalog services
290
- const globalCatalogService = this.$api.getService('catalog', '')
291
- const catalogService = this.$api.getService('catalog')
292
- if (globalCatalogService.events !== undefined) {
293
- globalCatalogService.events.forEach(event => {
294
- // Avoid reentrance
295
- if (this.catalogListeners[event]) {
296
- globalCatalogService.removeListener(event, this.catalogListeners[event])
297
- if (catalogService && (catalogService !== globalCatalogService)) {
298
- catalogService.removeListener(event, this.catalogListeners[event])
299
- }
300
- }
301
- })
302
- }
303
- this.catalogListeners = {}
313
+ this.unlistenToCatalogServiceEvents()
304
314
  },
305
- async onCatalogUpdated (event, object) {
315
+ async onCatalogUpdated (object, event) {
306
316
  switch (object.type) {
307
317
  case 'Category':
308
318
  // In any case we rebuild categories
@@ -346,16 +356,26 @@ export const activity = {
346
356
  // Take care that if we only use the default options the specific options will be undefined
347
357
  this.activityOptions.engine = _.defaultsDeep(_.get(this.activityOptions, 'engine', {}), defaultOptions)
348
358
  }
349
- },
350
- mounted () {
359
+ // Listen to map events
351
360
  this.$engineEvents.on('map-ready', this.onEngineReady)
352
361
  this.$engineEvents.on('globe-ready', this.onEngineReady)
353
362
  this.$engineEvents.on('layer-added', this.configureLayerActions)
354
363
  },
364
+ mounted () {
365
+ // Target online/offline service depending on status
366
+ this.$events.on('navigator-disconnected', this.resetCatalogServiceEventsListeners)
367
+ this.$events.on('navigator-reconnected', this.resetCatalogServiceEventsListeners)
368
+ this.$events.on('websocket-disconnected', this.resetCatalogServiceEventsListeners)
369
+ this.$events.on('websocket-reconnected', this.resetCatalogServiceEventsListeners)
370
+ },
355
371
  beforeUnmount () {
356
372
  this.$engineEvents.off('map-ready', this.onEngineReady)
357
373
  this.$engineEvents.off('globe-ready', this.onEngineReady)
358
374
  this.$engineEvents.off('layer-added', this.configureLayerActions)
375
+ this.$events.off('navigator-disconnected', this.resetCatalogServiceEventsListeners)
376
+ this.$events.off('navigator-reconnected', this.resetCatalogServiceEventsListeners)
377
+ this.$events.off('websocket-disconnected', this.resetCatalogServiceEventsListeners)
378
+ this.$events.off('websocket-reconnected', this.resetCatalogServiceEventsListeners)
359
379
  this.finalize()
360
380
  }
361
381
  }
@@ -169,22 +169,27 @@ export const context = {
169
169
  // Restore from local storage/catalog if no route parameters
170
170
  if (_.isEmpty(targetParameters)) {
171
171
  const savedParameters = LocalStorage.get(this.getContextKey(context))
172
- if (this.shouldRestoreContext(context) && !_.isEmpty(savedParameters)) {
173
- targetParameters = savedParameters
174
- // Backward compatibility: we previously stored the bounds as an array
175
- if (Array.isArray(targetParameters)) {
176
- targetParameters = {
177
- south: targetParameters[0][0],
178
- west: targetParameters[0][1],
179
- north: targetParameters[1][0],
180
- east: targetParameters[1][1]
172
+ if (this.shouldRestoreContext(context)) {
173
+ if (!_.isEmpty(savedParameters)) {
174
+ targetParameters = savedParameters
175
+ // Backward compatibility: we previously stored the bounds as an array
176
+ if (Array.isArray(targetParameters)) {
177
+ targetParameters = {
178
+ south: targetParameters[0][0],
179
+ west: targetParameters[0][1],
180
+ north: targetParameters[1][0],
181
+ east: targetParameters[1][1]
182
+ }
181
183
  }
184
+ } else {
185
+ // Check for a home context if not already retrieved
186
+ // Use undefined here to check for a first try as if we find none we set it to null
187
+ if (_.isUndefined(this.homeContext)) {
188
+ const response = await this.$api.getService('catalog').find({ query: { type: 'Context', isDefault: true } })
189
+ this.homeContext = (response.data.length > 0 ? response.data[0] : null)
190
+ }
191
+ if (this.homeContext) targetParameters = this.homeContext
182
192
  }
183
- } else {
184
- // Check for a home context
185
- const response = await this.$api.getService('catalog').find({ query: { type: 'Context', isDefault: true } })
186
- const homeContext = (response.data.length > 0 ? response.data[0] : null)
187
- if (homeContext) targetParameters = homeContext
188
193
  }
189
194
  }
190
195
  // Restore context if possible
@@ -27,4 +27,3 @@ export const featureSelection = {
27
27
  }
28
28
  }
29
29
  }
30
-  
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash'
2
2
  import sift from 'sift'
3
- import { getType, getGeom } from '@turf/invariant'
4
3
  import logger from 'loglevel'
4
+ import { listenToServiceEvents, unlistenToServiceEvents } from '../../../core/client/utils/index.js'
5
5
  import * as features from '../utils/utils.features.js'
6
6
  import * as layers from '../utils/utils.layers.js'
7
7
 
@@ -69,12 +69,12 @@ export const featureService = {
69
69
  createFeatures: features.createFeatures,
70
70
  editFeaturesGeometry: features.editFeaturesGeometry,
71
71
  editFeaturesProperties: features.editFeaturesProperties,
72
+ editFeaturesStyle: features.editFeaturesStyle,
72
73
  removeFeatures: features.removeFeatures,
73
- onFeaturesUpdated (feature, layerId) {
74
- // We only support single feature edition
75
- if (!getType(feature) || !getGeom(feature)) return
76
- // Find related layer
77
- const layer = this.getLayerById(layerId || feature.layer)
74
+ onFeatureUpdated (feature, layer) {
75
+ // Find related layer, either directly given in feature if coming from user-defined features service
76
+ // otherwise bound to the listener for features services attached to a built-in layer
77
+ if (!layer && feature.layer) layer = this.getLayerById(feature.layer)
78
78
  if (!layer || !this.isLayerVisible(layer.name)) return
79
79
  // Only possible when not edited by default
80
80
  if ((typeof this.isLayerEdited === 'function') && this.isLayerEdited(layer)) return
@@ -89,11 +89,10 @@ export const featureService = {
89
89
  if (filteredFeature.length > 0) this.updateLayer(layer.name, feature, { removeMissing: false })
90
90
  }
91
91
  },
92
- onFeaturesRemoved (feature, layerId) {
93
- // We only support single feature edition
94
- if (!getType(feature) || !getGeom(feature)) return
95
- // Find related layer
96
- const layer = this.getLayerById(layerId || feature.layer)
92
+ onFeatureRemoved (feature, layer) {
93
+ // Find related layer, either directly given in feature if coming from user-defined features service
94
+ // otherwise bound to the listener for features services attached to a built-in layer
95
+ if (!layer && feature.layer) layer = this.getLayerById(feature.layer)
97
96
  if (!layer || !this.isLayerVisible(layer.name)) return
98
97
  // Only possible when not edited by default
99
98
  if ((typeof this.isLayerEdited === 'function') && this.isLayerEdited(layer)) return
@@ -108,31 +107,23 @@ export const featureService = {
108
107
  if (filteredFeature.length > 0) this.updateLayer(layer.name, feature, { remove: true })
109
108
  }
110
109
  },
111
- listenToServiceEvents (layer) {
112
- // User-defined layers are already managed
113
- if (!layer.service || !layer.serviceEvents || layers.isInMemoryLayer(layer) || layers.isFeatureLayer(layer)) return
114
- const service = this.$api.getService(layer.service)
115
- // Check if service available and not already registered
116
- if (!service || this.layerServiceEventListeners[layer._id]) return
117
- // Generate listeners targetting the right layer as in this case the features won't hold it contrary to user-defined layers
118
- const onFeaturesUpdated = (feature) => this.onFeaturesUpdated(feature, layer._id)
119
- const onFeaturesRemoved = (feature) => this.onFeaturesRemoved(feature, layer._id)
120
- this.layerServiceEventListeners[layer._id] = { layerService: layer.service, onFeaturesUpdated, onFeaturesRemoved }
121
- service.on('created', onFeaturesUpdated)
122
- service.on('patched', onFeaturesUpdated)
123
- service.on('removed', onFeaturesRemoved)
110
+ listenToFeaturesServiceEventsForLayer (layer) {
111
+ const listeners = features.listenToFeaturesServiceEventsForLayer(layer, {
112
+ created: this.onFeatureUpdated, updated: this.onFeatureUpdated, patched: this.onFeatureUpdated, removed: this.onFeatureRemoved
113
+ }, this.layerServiceEventListeners[layer._id])
114
+ if (listeners) this.layerServiceEventListeners[layer._id] = listeners
124
115
  },
125
- unlistenToServiceEvents (layer) {
126
- // Check if listeners are registered for layer
127
- if (!this.layerServiceEventListeners[layer._id]) return
128
- const { layerService, onFeaturesUpdated, onFeaturesRemoved } = this.layerServiceEventListeners[layer._id]
129
- const service = this.$api.getService(layerService)
130
- // Check if service still available
131
- if (!service) return
132
- service.off('created', onFeaturesUpdated)
133
- service.off('patched', onFeaturesUpdated)
134
- service.off('removed', onFeaturesRemoved)
116
+ unlistenToFeaturesServiceEventsForLayer (layer) {
117
+ features.unlistenToFeaturesServiceEventsForLayer(layer, this.layerServiceEventListeners[layer._id])
135
118
  delete this.layerServiceEventListeners[layer._id]
119
+ },
120
+ listenToFeaturesServiceEventsForLayers () {
121
+ this.layerServiceEventListeners = {}
122
+ _.forEach(this.getLayers(), this.listenToFeaturesServiceEventsForLayer)
123
+ },
124
+ unlistenToFeaturesServiceEventsForLayers () {
125
+ _.forOwn(this.layerServiceEventListeners, this.unlistenToFeaturesServiceEventsForLayer)
126
+ this.layerServiceEventListeners = {}
136
127
  }
137
128
  },
138
129
  created () {
@@ -140,34 +131,25 @@ export const featureService = {
140
131
  this.$api.getService('features').timeout = 60 * 60 * 1000 // 1h should be sufficient since we also have size limits
141
132
  },
142
133
  mounted () {
143
- // Here we need to listen to service events for all realtime layers triggered by it
144
- // 1) user-defined layers targetting the features service
145
- const featuresService = this.$api.getService('features')
146
- featuresService.on('created', this.onFeaturesUpdated)
147
- featuresService.on('patched', this.onFeaturesUpdated)
148
- featuresService.on('removed', this.onFeaturesRemoved)
149
- // 2) built-in layers targetting specific services
134
+ // Here we need to listen to service events for all realtime layers
135
+ this.listenToFeaturesServiceEventsForLayers()
150
136
  // As we don't know target services upfront we register listeners when layer are added, we track it in a map
151
- this.layerServiceEventListeners = {}
152
- this.$engineEvents.on('layer-added', this.listenToServiceEvents)
153
- this.$engineEvents.on('layer-removed', this.unlistenToServiceEvents)
137
+ this.$engineEvents.on('layer-added', this.listenToFeaturesServiceEventsForLayer)
138
+ this.$engineEvents.on('layer-removed', this.unlistenToFeaturesServiceEventsForLayer)
139
+ // Target online/offline service depending on status
140
+ this.$events.on('navigator-disconnected', this.listenToFeaturesServiceEventsForLayers)
141
+ this.$events.on('navigator-reconnected', this.listenToFeaturesServiceEventsForLayers)
142
+ this.$events.on('websocket-disconnected', this.listenToFeaturesServiceEventsForLayers)
143
+ this.$events.on('websocket-reconnected', this.listenToFeaturesServiceEventsForLayers)
154
144
  },
155
145
  beforeUnmount () {
156
146
  // Remove all listeners
157
- const featuresService = this.$api.getService('features')
158
- featuresService.off('created', this.onFeaturesUpdated)
159
- featuresService.off('patched', this.onFeaturesUpdated)
160
- featuresService.off('removed', this.onFeaturesRemoved)
161
- _.forOwn(this.layerServiceEventListeners, listeners => {
162
- const { layerService, onFeaturesUpdated, onFeaturesRemoved } = listeners
163
- const service = this.$api.getService(layerService)
164
- // Check if service still available
165
- if (!service) return
166
- service.off('created', onFeaturesUpdated)
167
- service.off('patched', onFeaturesUpdated)
168
- service.off('removed', onFeaturesRemoved)
169
- })
170
- this.$engineEvents.off('layer-added', this.listenToServiceEvents)
171
- this.$engineEvents.off('layer-removed', this.unlistenToServiceEvents)
147
+ this.unlistenToFeaturesServiceEventsForLayers()
148
+ this.$engineEvents.off('layer-added', this.listenToFeaturesServiceEventsForLayer)
149
+ this.$engineEvents.off('layer-removed', this.unlistenToFeaturesServiceEventsForLayer)
150
+ this.$events.off('navigator-disconnected', this.listenToFeaturesServiceEventsForLayers)
151
+ this.$events.off('navigator-reconnected', this.listenToFeaturesServiceEventsForLayers)
152
+ this.$events.off('websocket-disconnected', this.listenToFeaturesServiceEventsForLayers)
153
+ this.$events.off('websocket-reconnected', this.listenToFeaturesServiceEventsForLayers)
172
154
  }
173
155
  }
@@ -26,7 +26,7 @@ export const weacast = {
26
26
  }
27
27
  },
28
28
  async setupForecastModels () {
29
- if (!this.getWeacastApi()) return
29
+ if (!this.getWeacastApi() || this.getWeacastApi().isDisconnected || this.getWeacastApi().useLocalFirst) return
30
30
  const response = await this.getWeacastApi().getService('forecasts').find()
31
31
  // Required to use splice when modifying objects inside an array to make it reactive
32
32
  this.forecastModels.splice(0, this.forecastModels.length, ...response.data)
@@ -0,0 +1,38 @@
1
+ import _ from 'lodash'
2
+ import logger from 'loglevel'
3
+ import { Store, Platform, LocalStorage } from '../../core/client/index.js'
4
+
5
+ export const Navigator = {
6
+ initialize () {
7
+ this.availableApps = {
8
+ waze: 'https://waze.com/ul?q=<%= lat %>,<%= lon %>',
9
+ 'google-maps': 'https://www.google.com/maps/dir/?api=1&destination=<%= lat %>,<%= lon %>',
10
+ 'apple-plan': 'https://maps.apple.com/place?ll=<%= lat %>,<%= lon %>'
11
+ }
12
+ const settings = LocalStorage.get('settings')
13
+ if (_.isNil(settings)) {
14
+ let app = 'google-maps'
15
+ if (Platform.ios) app = 'apple-plan'
16
+ Store.set('navigator', app)
17
+ logger.debug('[KDK] Navigator initialized to:', this.get())
18
+ } else {
19
+ logger.debug('[KDK] Navigator initialized to:', settings.navigator)
20
+ }
21
+ },
22
+ get () {
23
+ return Store.get('navigator')
24
+ },
25
+ navigateTo (lat, lon) {
26
+ // Retrieve the default app
27
+ const app = this.get()
28
+ if (_.isEmpty(app)) {
29
+ logger.debug('[KDK] Default navigator is undefined')
30
+ return
31
+ }
32
+ // Template the url
33
+ const compiledUrl = _.template(this.availableApps[app])
34
+ const interpolatedUrl = compiledUrl({ lat, lon })
35
+ // Open the interpolated url
36
+ window.open(interpolatedUrl)
37
+ }
38
+ }
@@ -95,7 +95,7 @@ export const WEBGL_FUNCTIONS = {
95
95
  PIXI.TYPES.HALF_FLOAT_VERTEX = 0x140b
96
96
 
97
97
  export function buildShaderCode (features) {
98
- let vtxCode = '#version 300 es'
98
+ let vtxCode = '#version 300 es\nprecision highp float;'
99
99
  let frgCode = '#version 300 es\nprecision highp float;'
100
100
  // attributes, uniforms and varyings
101
101
  vtxCode += '\n\n/// attributes, uniforms and varyings\n'
@@ -22,7 +22,7 @@ export const Planets = {
22
22
  renewJwt: false
23
23
  })
24
24
 
25
- const client = createClient(options)
25
+ const client = await createClient(options)
26
26
  setupApi.bind(client)(options)
27
27
  client.on('authenticated', (data) => {
28
28
  // Store API gateway token if any
@@ -1,6 +1,8 @@
1
1
  import logger from 'loglevel'
2
+ import _ from 'lodash'
2
3
  import { kml } from '@tmcw/togeojson'
3
4
  import { i18n } from '../../../core/client/i18n.js'
5
+ import { convertSimpleStyleToPointStyle, convertSimpleStyleToLineStyle, convertSimpleStyleToPolygonStyle } from '../utils/utils.style.js'
4
6
 
5
7
  export const KMLReader = {
6
8
  read (files, options) {
@@ -15,7 +17,7 @@ export const KMLReader = {
15
17
  reader.onloadend = () => {
16
18
  let content = reader.result
17
19
  try {
18
- content = kml(new DOMParser().parseFromString(content, 'text/xml'))
20
+ content = convertToGeoJsonWithStyle(new DOMParser().parseFromString(content, 'text/xml'))
19
21
  } catch (error) {
20
22
  logger.debug(error)
21
23
  reject(new Error(i18n.t('errors.INVALID_KML_FILE', { file: file.name }), { errors: error }))
@@ -34,3 +36,57 @@ export const KMLReader = {
34
36
  return []
35
37
  }
36
38
  }
39
+
40
+ function getExtraPropertiesFromKMLByName (document) {
41
+ const properties = {}
42
+ const propertiesToAdd = ['extrude', 'altitudeMode']
43
+ const placemarks = document.getElementsByTagName('Placemark')
44
+ _.forEach(placemarks, placemark => {
45
+ const nameElements = placemark.getElementsByTagName('name')
46
+ if (!nameElements.length) return
47
+ const name = nameElements[0].textContent
48
+ _.forEach(propertiesToAdd, property => {
49
+ const propertyElements = placemark.getElementsByTagName(property)
50
+ if (!propertyElements.length) return
51
+
52
+ let value = propertyElements[0].textContent
53
+ if (['0', '1'].includes(value)) {
54
+ value = value === '1'
55
+ }
56
+ _.set(properties, [name, property].join('.'), value)
57
+ })
58
+ })
59
+ return properties
60
+ }
61
+
62
+ export function convertToGeoJsonWithStyle (document) {
63
+ const extraProperties = getExtraPropertiesFromKMLByName(document)
64
+
65
+ const geoJson = kml(document)
66
+
67
+ _.forEach(_.get(geoJson, 'features', []), feature => {
68
+ const name = _.get(feature, 'properties.name', false)
69
+ // Apply all styles to prevent them for being overridden by the default ones
70
+ const style = _.merge(convertSimpleStyleToPointStyle(feature.properties), convertSimpleStyleToLineStyle(feature.properties), convertSimpleStyleToPolygonStyle(feature.properties))
71
+ if (name && _.has(extraProperties, name)) {
72
+ _.merge(style, extraProperties[name])
73
+ }
74
+ _.set(feature, 'style', style)
75
+
76
+ // Trim all string properties
77
+ const trimmedProperties = _.mapValues(_.get(feature, 'properties', {}), value => {
78
+ return typeof value === 'string' ? value.trim() : value
79
+ })
80
+ _.set(feature, 'properties', trimmedProperties)
81
+
82
+ // Add label for points if they have a name
83
+ if (_.get(feature, 'geometry.type') === 'Point' && _.has(feature, 'properties.name')) {
84
+ _.set(feature, 'properties.icon-text', feature.properties.name)
85
+ _.set(feature, 'properties.entityStyle.label', {
86
+ heightReference: 'Cesium.HeightReference.RELATIVE_TO_GROUND'
87
+ })
88
+ }
89
+ })
90
+
91
+ return geoJson
92
+ }
@@ -4,6 +4,7 @@ export * from './utils.catalog.js'
4
4
  export * from './utils.features.js'
5
5
  export * from './utils.layers.js'
6
6
  export * from './utils.location.js'
7
+ export * from './utils.offline.js'
7
8
  export * from './utils.project.js'
8
9
  export * from './utils.schema.js'
9
10
  export * from './utils.style.js'
@@ -35,7 +35,7 @@ export async function capture (values) {
35
35
  dismiss = Notify.create({
36
36
  group: 'capture',
37
37
  icon: 'las la-hourglass-half',
38
- message: i18n.t('KCapture.CAPTURING_VIEW'),
38
+ message: i18n.t('KCapture.PRINTING_VIEW'),
39
39
  color: 'primary',
40
40
  timeout: 0,
41
41
  spinner: true
@@ -53,6 +53,7 @@ export async function capture (values) {
53
53
  size: { width: +values.resolution.width, height: +values.resolution.height },
54
54
  layout: getLayout(values),
55
55
  time: dateArray[index],
56
+ basePath: _.has(values, 'basePath') ? values.basePath : '/#/home/',
56
57
  lang: getAppLocale()
57
58
  })
58
59
  const response = await fetch(endpoint, options)
@@ -92,9 +93,10 @@ function getLayout (values) {
92
93
  },
93
94
  fab: { visible: false }
94
95
  }
95
- if (_.has(values, 'header')) _.set(layout, 'header', headerFooterComponent(values.header, 'header'))
96
- if (_.has(values, 'footer')) _.set(layout, 'footer', headerFooterComponent(values.footer, 'footer'))
97
- if (_.includes(placements, values.compass)) _.set(layout, 'page', compassComponent(values.compass))
96
+
97
+ if (_.has(values, 'header') && !_.isEmpty(values.header)) _.set(layout, 'header', headerFooterComponent(values.header, 'header'))
98
+ if (_.has(values, 'footer') && !_.isEmpty(values.footer)) _.set(layout, 'footer', headerFooterComponent(values.footer, 'footer'))
99
+ if (_.includes(placements, values.north)) _.set(layout, 'stickies', northComponent(values.north))
98
100
  if (_.includes(placements, values.legend)) _.set(layout, `windows.${values.legend}`, legendComponent())
99
101
 
100
102
  return layout
@@ -102,8 +104,9 @@ function getLayout (values) {
102
104
  function headerFooterComponent (text, position) {
103
105
  return { content: [{ component: _.get(config, `capture.${position}.component`, 'KCaptureTextArea'), text, position }], visible: true }
104
106
  }
105
- function compassComponent (position) {
106
- return { content: _.union(Layout.getStickies().content, [{ position, offset: [0, 5], content: [{ component: 'KNorth' }] }]) }
107
+ function northComponent (position) {
108
+ const northSticky = Layout.findSticky('north-sticky')
109
+ return { content: [{ ...northSticky, position, offset: [0, 5], visible: true }] }
107
110
  }
108
111
  function legendComponent () {
109
112
  return {
@@ -173,4 +176,4 @@ async function generatePdf (imageArray, width, height) {
173
176
  inputs.push({ capture: `data:image/png;base64,${base64Encode(value)}` })
174
177
  })
175
178
  return await generate({ template, plugins, inputs })
176
- }
179
+ }
@@ -90,8 +90,8 @@ export function getOrphanLayers (layers, layersByCategory) {
90
90
 
91
91
  function processTranslations (item) {
92
92
  if (item.i18n) i18n.registerTranslation(item.i18n)
93
- item.label = i18n.tie(item.name)
94
- item.description = i18n.tie(item.description)
93
+ if (!_.has(item, 'label')) item.label = i18n.tie(item.name)
94
+ if (_.has(item, 'description')) item.description = i18n.tie(item.description)
95
95
  }
96
96
 
97
97
  export async function getLayers (options = {}) {