@kalisio/kdk 2.5.3 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. package/.github/workflows/main.yaml +35 -6
  2. package/client.globe.js +8 -0
  3. package/client.js +8 -0
  4. package/client.map.js +8 -0
  5. package/core/api/hooks/hooks.push.js +3 -2
  6. package/core/api/hooks/hooks.tags.js +56 -0
  7. package/core/api/models/tags.model.mongodb.js +8 -0
  8. package/core/api/services/index.js +33 -2
  9. package/core/api/services/tags/tags.hooks.js +47 -0
  10. package/core/client/api.js +5 -5
  11. package/core/client/components/KActivity.vue +3 -2
  12. package/core/client/components/KChip.vue +2 -2
  13. package/core/client/components/KEditor.vue +3 -1
  14. package/core/client/components/KFollower.vue +4 -4
  15. package/core/client/components/KStore.vue +1 -1
  16. package/core/client/components/KTab.vue +20 -7
  17. package/core/client/components/account/KProfile.vue +9 -25
  18. package/core/client/components/action/KAction.vue +10 -10
  19. package/core/client/components/action/KToggleFullscreenAction.vue +2 -11
  20. package/core/client/components/app/KHome.vue +3 -2
  21. package/core/client/components/collection/KFilter.vue +5 -4
  22. package/core/client/components/collection/KGrid.vue +5 -1
  23. package/core/client/components/collection/KItemsFilter.vue +47 -0
  24. package/core/client/components/collection/KItemsSorter.vue +42 -0
  25. package/core/client/components/collection/KScrollDown.vue +2 -2
  26. package/core/client/components/collection/KSearchFilterControl.vue +3 -2
  27. package/core/client/components/collection/KSorter.vue +33 -37
  28. package/core/client/components/collection/KTagsFilterControl.vue +14 -40
  29. package/core/client/components/collection/KTagsFilterView.vue +10 -45
  30. package/core/client/components/collection/KTimeFilterControl.vue +6 -7
  31. package/core/client/components/collection/KTimeFilterView.vue +13 -22
  32. package/core/client/components/collection/KTimeLine.vue +18 -9
  33. package/core/client/components/form/KColorField.vue +13 -6
  34. package/core/client/components/form/KColorScaleField.vue +7 -12
  35. package/core/client/components/form/KFileField.vue +118 -89
  36. package/core/client/components/form/KForm.vue +30 -18
  37. package/core/client/components/form/KIconField.vue +4 -1
  38. package/core/client/components/form/KNumberField.vue +9 -2
  39. package/core/client/components/form/KSelectField.vue +1 -4
  40. package/core/client/components/form/KTagField.vue +229 -0
  41. package/core/client/components/form/KTextField.vue +4 -0
  42. package/core/client/components/form/KTextareaField.vue +3 -1
  43. package/core/client/components/input/KShapePicker.vue +3 -3
  44. package/core/client/components/layout/KFab.vue +32 -20
  45. package/core/client/components/layout/KPage.vue +11 -6
  46. package/core/client/components/layout/KWindow.vue +5 -0
  47. package/core/client/components/media/index.js +2 -6
  48. package/core/client/components/menu/KMenu.vue +12 -10
  49. package/core/client/components/menu/KSubMenu.vue +12 -12
  50. package/core/client/components/messages/KMessageCard.vue +13 -12
  51. package/core/client/components/messages/KMessageComposer.vue +13 -9
  52. package/core/client/components/messages/KMessagesTimeLine.vue +16 -8
  53. package/core/client/components/tags/KTagFilter.vue +99 -0
  54. package/core/client/components/tags/KTagItem.vue +65 -0
  55. package/core/client/components/tags/KTagManager.vue +198 -0
  56. package/core/client/components/tags/KTagSelection.vue +82 -0
  57. package/core/client/components/time/KDate.vue +3 -17
  58. package/core/client/components/time/KDateTime.vue +1 -1
  59. package/core/client/components/time/KTime.vue +0 -4
  60. package/core/client/composables/collection-filter.js +41 -2
  61. package/core/client/composables/collection.js +3 -3
  62. package/core/client/composables/index.js +1 -0
  63. package/core/client/composables/pwa.js +13 -0
  64. package/core/client/composables/session.js +7 -8
  65. package/core/client/composables/user.js +36 -0
  66. package/core/client/directives/index.js +1 -0
  67. package/core/client/directives/v-drop-file.js +174 -0
  68. package/core/client/document.js +2 -1
  69. package/core/client/exporter.js +17 -3
  70. package/core/client/i18n/core_en.json +34 -7
  71. package/core/client/i18n/core_fr.json +36 -9
  72. package/core/client/i18n.js +26 -11
  73. package/core/client/layout.js +5 -5
  74. package/core/client/mixins/mixin.base-activity.js +8 -5
  75. package/core/client/mixins/mixin.base-editor.js +2 -1
  76. package/core/client/mixins/mixin.base-field.js +3 -2
  77. package/core/client/mixins/mixin.base-item.js +12 -10
  78. package/core/client/mixins/mixin.service.js +3 -1
  79. package/core/client/platform.js +0 -3
  80. package/core/client/readers/reader.json.js +2 -2
  81. package/core/client/utils/index.js +2 -0
  82. package/core/client/utils/utils.collection.js +6 -6
  83. package/core/client/utils/utils.colors.js +46 -19
  84. package/core/client/utils/utils.files.js +19 -0
  85. package/core/client/utils/utils.locale.js +13 -17
  86. package/core/client/utils/utils.services.js +27 -0
  87. package/core/client/utils/utils.shapes.js +2 -2
  88. package/core/client/utils/utils.tags.js +17 -0
  89. package/core/client/utils/utils.tours.js +31 -0
  90. package/core/common/permissions.js +3 -0
  91. package/core/common/schemas/tags.update.json +35 -0
  92. package/core/common/schemas/users.update-profile.json +1 -1
  93. package/core/common/utils.js +5 -5
  94. package/extras/configs/panes.top.js +11 -0
  95. package/extras/configs/stickies.js +1 -1
  96. package/extras/configs/widgets.left.js +13 -1
  97. package/extras/libs/jsts.min.js +8 -0
  98. package/{test/client/core/account.js → extras/tests/core/account.mjs} +4 -4
  99. package/extras/tests/core/api.mjs +114 -0
  100. package/{test/client/core/collection.js → extras/tests/core/collection.mjs} +8 -8
  101. package/{test/client/core/dialogs.js → extras/tests/core/dialogs.mjs} +1 -1
  102. package/extras/tests/core/index.mjs +9 -0
  103. package/{test/client/core/layout.js → extras/tests/core/layout.mjs} +7 -3
  104. package/{test/client/core/runner.js → extras/tests/core/runner.mjs} +3 -3
  105. package/{test/client/core/screens.js → extras/tests/core/screens.mjs} +1 -1
  106. package/{test/client/core/utils.js → extras/tests/core/utils.mjs} +79 -26
  107. package/extras/tests/index.mjs +4 -0
  108. package/{test/client/map/api.js → extras/tests/map/api.mjs} +1 -1
  109. package/{test/client/map/catalog.js → extras/tests/map/catalog.mjs} +18 -18
  110. package/{test/client/map/controls.js → extras/tests/map/controls.mjs} +3 -3
  111. package/extras/tests/map/index.mjs +5 -0
  112. package/{test/client/map/time.js → extras/tests/map/time.mjs} +3 -3
  113. package/{test/client/map/utils.js → extras/tests/map/utils.mjs} +6 -5
  114. package/extras/tours/fab.js +36 -0
  115. package/extras/tours/layout.js +49 -0
  116. package/extras/tours/pane.left.js +78 -0
  117. package/extras/tours/pane.right.js +145 -0
  118. package/extras/tours/pane.top.js +239 -0
  119. package/map/api/config/layers.cjs +28 -13
  120. package/map/api/hooks/hooks.query.js +12 -7
  121. package/map/api/models/catalog.model.mongodb.js +17 -6
  122. package/map/api/services/catalog/catalog.hooks.js +1 -1
  123. package/map/api/services/index.js +18 -1
  124. package/map/client/cesium/utils/utils.cesium.js +25 -65
  125. package/map/client/cesium/utils/utils.features.js +1 -0
  126. package/map/client/cesium/utils/utils.geojson.js +1 -0
  127. package/map/client/cesium/utils/utils.style.js +7 -6
  128. package/map/client/components/KFeatureEditor.vue +3 -3
  129. package/map/client/components/KFeaturesChart.vue +4 -4
  130. package/map/client/components/KFeaturesFilterEditor.vue +19 -13
  131. package/map/client/components/KFeaturesFilterManager.vue +7 -4
  132. package/map/client/components/KFeaturesTable.vue +2 -2
  133. package/map/client/components/KLayerEditor.vue +6 -6
  134. package/map/client/components/KMeasureTool.vue +2 -1
  135. package/map/client/components/catalog/KBaseLayersSelector.vue +1 -1
  136. package/map/client/components/catalog/KCategoryItem.vue +15 -1
  137. package/map/client/components/catalog/KConnectLayer.vue +2 -2
  138. package/map/client/components/catalog/KCreateView.vue +3 -2
  139. package/map/client/components/catalog/KFilteredLayerItem.vue +26 -6
  140. package/map/client/components/catalog/KImportLayer.vue +6 -3
  141. package/map/client/components/catalog/KLayerCategories.vue +6 -6
  142. package/map/client/components/catalog/KLayerItem.vue +12 -2
  143. package/map/client/components/catalog/KLayersList.vue +180 -0
  144. package/map/client/components/catalog/KLayersPanel.vue +146 -36
  145. package/map/client/components/catalog/KLayersSelector.vue +96 -48
  146. package/map/client/components/catalog/KProjectEditor.vue +0 -9
  147. package/map/client/components/catalog/KProjectSelector.vue +3 -2
  148. package/map/client/components/catalog/KProjectsPanel.vue +23 -8
  149. package/map/client/components/catalog/KViewsPanel.vue +18 -8
  150. package/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
  151. package/map/client/components/form/KDirectionField.vue +3 -6
  152. package/map/client/components/form/KLayerCategoryField.vue +2 -2
  153. package/map/client/components/form/KOwsServiceField.vue +25 -24
  154. package/map/client/components/form/KSelectLayersField.vue +4 -4
  155. package/map/client/components/form/KSelectViewsField.vue +4 -4
  156. package/map/client/components/legend/KLayerLegend.vue +11 -2
  157. package/map/client/components/legend/KLegend.vue +44 -51
  158. package/map/client/components/location/KLocationCardSection.vue +6 -7
  159. package/map/client/components/location/KLocationMap.vue +23 -13
  160. package/map/client/components/stickies/KPosition.vue +5 -0
  161. package/map/client/components/styles/KLayerStyleAction.vue +59 -12
  162. package/map/client/components/styles/KStyleEditor.vue +71 -8
  163. package/map/client/components/styles/KStyleEditorSection.vue +82 -33
  164. package/map/client/components/styles/KStyleManager.vue +119 -59
  165. package/map/client/components/styles/KStylePreview.vue +9 -25
  166. package/map/client/components/styles/KStylePreviewItem.vue +22 -1
  167. package/map/client/components/tools/KSearchTool.vue +1 -1
  168. package/map/client/components/widget/KElevationProfile.vue +20 -17
  169. package/map/client/components/widget/KInformationBox.vue +5 -5
  170. package/map/client/components/widget/KMapillaryViewer.vue +2 -1
  171. package/map/client/components/widget/KTimeSeries.vue +11 -9
  172. package/map/client/globe.js +2 -0
  173. package/map/client/i18n/map_en.json +29 -7
  174. package/map/client/i18n/map_fr.json +29 -7
  175. package/map/client/leaflet/GradientPath.js +61 -24
  176. package/map/client/leaflet/ShapeMarker.js +12 -5
  177. package/map/client/leaflet/TiledMeshLayer.js +3 -3
  178. package/map/client/leaflet/utils/utils.geojson.js +66 -8
  179. package/map/client/leaflet/utils/utils.style.js +14 -15
  180. package/map/client/mixins/globe/mixin.base-globe.js +181 -34
  181. package/map/client/mixins/globe/mixin.file-layers.js +3 -0
  182. package/map/client/mixins/globe/mixin.geojson-layers.js +179 -31
  183. package/map/client/mixins/globe/mixin.opendap-layers.js +2 -1
  184. package/map/client/mixins/globe/mixin.style.js +23 -1
  185. package/map/client/mixins/globe/mixin.tooltip.js +14 -2
  186. package/map/client/mixins/map/mixin.base-map.js +146 -58
  187. package/map/client/mixins/map/mixin.edit-layers.js +18 -15
  188. package/map/client/mixins/map/mixin.geojson-layers.js +181 -106
  189. package/map/client/mixins/map/mixin.heatmap-layers.js +3 -2
  190. package/map/client/mixins/map/mixin.map-activity.js +6 -1
  191. package/map/client/mixins/map/mixin.mapillary-layers.js +2 -1
  192. package/map/client/mixins/map/mixin.pmtiles-layers.js +3 -3
  193. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +3 -2
  194. package/map/client/mixins/map/mixin.tiled-wind-layers.js +3 -2
  195. package/map/client/mixins/mixin.activity.js +197 -51
  196. package/map/client/mixins/mixin.context.js +11 -11
  197. package/map/client/mixins/mixin.feature-service.js +11 -9
  198. package/map/client/mixins/mixin.weacast.js +5 -3
  199. package/map/client/readers/reader.geojson.js +3 -1
  200. package/map/client/utils/utils.capture.js +3 -3
  201. package/map/client/utils/utils.catalog.js +9 -5
  202. package/map/client/utils/utils.features.js +120 -54
  203. package/map/client/utils/utils.js +25 -10
  204. package/map/client/utils/utils.layers.js +148 -24
  205. package/map/client/utils/utils.location.js +26 -9
  206. package/map/client/utils/utils.schema.js +2 -1
  207. package/map/client/utils/utils.style.js +53 -9
  208. package/map/common/geotiff-grid-source.js +1 -3
  209. package/map/common/opendap-utils.js +0 -1
  210. package/map/common/tms-utils.js +0 -1
  211. package/map/common/wcs-utils.js +0 -1
  212. package/map/common/wfs-utils.js +0 -1
  213. package/map/common/wms-utils.js +7 -1
  214. package/map/common/wmts-utils.js +0 -1
  215. package/package.json +12 -12
  216. package/scripts/init_runner.sh +3 -3
  217. package/scripts/kash/CHANGELOG.md +27 -0
  218. package/scripts/kash/kash.sh +556 -237
  219. package/scripts/kash/scripts/run_tests.sh +44 -5
  220. package/scripts/setup_workspace.sh +23 -13
  221. package/test/api/core/config/default.cjs +2 -1
  222. package/test/api/core/tags.test.js +62 -0
  223. package/test/api/map/config/default.cjs +2 -1
  224. package/test/api/map/config/layers.json +9 -0
  225. package/test/api/map/data/openradiation.json +13811 -0
  226. package/test/api/map/grid-sources.test.js +1 -3
  227. package/test/api/map/index.test.js +60 -1
  228. package/test/api/map/style.test.js +30 -1
  229. package/test.api.js +1 -1
  230. package/vite/App.vue +18 -0
  231. package/vite/AppWithGlobe.vue +84 -0
  232. package/vite/GlobeActivity.vue +58 -0
  233. package/vite/MapActivity.vue +63 -0
  234. package/vite/MapActivityWithGlobe.vue +63 -0
  235. package/vite/README.md +169 -0
  236. package/vite/config.js +221 -0
  237. package/vite/index_with_globe.html +50 -0
  238. package/vite/index_with_map.html +50 -0
  239. package/vite/package.json +173 -0
  240. package/vite/quasar.variables.scss +17 -0
  241. package/vite/vite.config.js +166 -0
  242. package/vite/yarn.lock +11641 -0
  243. package/core/client/components/media/KImageViewer.vue +0 -68
  244. package/core/client/components/media/KMarkdownViewer.vue +0 -55
  245. package/core/client/components/media/KMediaBrowser.vue +0 -301
  246. package/coverage/base.css +0 -224
  247. package/coverage/block-navigation.js +0 -87
  248. package/coverage/core/api/application.js.html +0 -1870
  249. package/coverage/core/api/authentication.js.html +0 -874
  250. package/coverage/core/api/db.js.html +0 -793
  251. package/coverage/core/api/hooks/hooks.authentication.js.html +0 -139
  252. package/coverage/core/api/hooks/hooks.authorisations.js.html +0 -958
  253. package/coverage/core/api/hooks/hooks.groups.js.html +0 -229
  254. package/coverage/core/api/hooks/hooks.logger.js.html +0 -163
  255. package/coverage/core/api/hooks/hooks.model.js.html +0 -967
  256. package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
  257. package/coverage/core/api/hooks/hooks.push.js.html +0 -265
  258. package/coverage/core/api/hooks/hooks.query.js.html +0 -862
  259. package/coverage/core/api/hooks/hooks.schemas.js.html +0 -298
  260. package/coverage/core/api/hooks/hooks.service.js.html +0 -319
  261. package/coverage/core/api/hooks/hooks.storage.js.html +0 -193
  262. package/coverage/core/api/hooks/hooks.users.js.html +0 -595
  263. package/coverage/core/api/hooks/index.html +0 -266
  264. package/coverage/core/api/hooks/index.js.html +0 -115
  265. package/coverage/core/api/index.html +0 -176
  266. package/coverage/core/api/index.js.html +0 -148
  267. package/coverage/core/api/marshall.js.html +0 -448
  268. package/coverage/core/api/models/groups.model.mongodb.js.html +0 -109
  269. package/coverage/core/api/models/index.html +0 -131
  270. package/coverage/core/api/models/messages.model.mongodb.js.html +0 -121
  271. package/coverage/core/api/models/organisations.model.mongodb.js.html +0 -94
  272. package/coverage/core/api/models/tags.model.mongodb.js.html +0 -115
  273. package/coverage/core/api/models/users.model.mongodb.js.html +0 -115
  274. package/coverage/core/api/services/account/account.hooks.js.html +0 -208
  275. package/coverage/core/api/services/account/account.service.js.html +0 -436
  276. package/coverage/core/api/services/account/index.html +0 -131
  277. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +0 -184
  278. package/coverage/core/api/services/authorisations/authorisations.service.js.html +0 -520
  279. package/coverage/core/api/services/authorisations/index.html +0 -131
  280. package/coverage/core/api/services/databases/databases.hooks.js.html +0 -193
  281. package/coverage/core/api/services/databases/databases.service.js.html +0 -100
  282. package/coverage/core/api/services/databases/index.html +0 -131
  283. package/coverage/core/api/services/groups/groups.hooks.js.html +0 -178
  284. package/coverage/core/api/services/groups/index.html +0 -116
  285. package/coverage/core/api/services/import-export/import-export.hooks.js.html +0 -184
  286. package/coverage/core/api/services/import-export/import-export.service.js.html +0 -118
  287. package/coverage/core/api/services/import-export/index.html +0 -131
  288. package/coverage/core/api/services/index.html +0 -116
  289. package/coverage/core/api/services/index.js.html +0 -532
  290. package/coverage/core/api/services/mailer/index.html +0 -131
  291. package/coverage/core/api/services/mailer/mailer.hooks.js.html +0 -190
  292. package/coverage/core/api/services/mailer/mailer.service.js.html +0 -118
  293. package/coverage/core/api/services/messages/index.html +0 -116
  294. package/coverage/core/api/services/messages/messages.hooks.js.html +0 -202
  295. package/coverage/core/api/services/organisations/index.html +0 -131
  296. package/coverage/core/api/services/organisations/organisations.hooks.js.html +0 -178
  297. package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
  298. package/coverage/core/api/services/push/index.html +0 -131
  299. package/coverage/core/api/services/push/push.hooks.js.html +0 -190
  300. package/coverage/core/api/services/push/push.service.js.html +0 -121
  301. package/coverage/core/api/services/storage/index.html +0 -131
  302. package/coverage/core/api/services/storage/storage.hooks.js.html +0 -190
  303. package/coverage/core/api/services/storage/storage.service.js.html +0 -172
  304. package/coverage/core/api/services/tags/index.html +0 -116
  305. package/coverage/core/api/services/tags/tags.hooks.js.html +0 -178
  306. package/coverage/core/api/services/users/index.html +0 -131
  307. package/coverage/core/api/services/users/users.hooks.js.html +0 -310
  308. package/coverage/core/api/services/users/users.service.js.html +0 -100
  309. package/coverage/core/api/utils.js.html +0 -118
  310. package/coverage/core/common/errors.js.html +0 -88
  311. package/coverage/core/common/index.html +0 -191
  312. package/coverage/core/common/index.js.html +0 -115
  313. package/coverage/core/common/permissions.js.html +0 -733
  314. package/coverage/core/common/schema.js.html +0 -190
  315. package/coverage/core/common/utils.js.html +0 -226
  316. package/coverage/core/common/utils.offline.js.html +0 -199
  317. package/coverage/favicon.png +0 -0
  318. package/coverage/index.html +0 -476
  319. package/coverage/lcov-report/base.css +0 -224
  320. package/coverage/lcov-report/block-navigation.js +0 -87
  321. package/coverage/lcov-report/core/api/application.js.html +0 -1870
  322. package/coverage/lcov-report/core/api/authentication.js.html +0 -874
  323. package/coverage/lcov-report/core/api/db.js.html +0 -793
  324. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +0 -139
  325. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +0 -958
  326. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +0 -229
  327. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +0 -163
  328. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +0 -967
  329. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
  330. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +0 -265
  331. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +0 -862
  332. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +0 -298
  333. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +0 -319
  334. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +0 -193
  335. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +0 -595
  336. package/coverage/lcov-report/core/api/hooks/index.html +0 -266
  337. package/coverage/lcov-report/core/api/hooks/index.js.html +0 -115
  338. package/coverage/lcov-report/core/api/index.html +0 -176
  339. package/coverage/lcov-report/core/api/index.js.html +0 -148
  340. package/coverage/lcov-report/core/api/marshall.js.html +0 -448
  341. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +0 -109
  342. package/coverage/lcov-report/core/api/models/index.html +0 -131
  343. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +0 -121
  344. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +0 -94
  345. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +0 -115
  346. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +0 -115
  347. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +0 -208
  348. package/coverage/lcov-report/core/api/services/account/account.service.js.html +0 -436
  349. package/coverage/lcov-report/core/api/services/account/index.html +0 -131
  350. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +0 -184
  351. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +0 -520
  352. package/coverage/lcov-report/core/api/services/authorisations/index.html +0 -131
  353. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +0 -193
  354. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +0 -100
  355. package/coverage/lcov-report/core/api/services/databases/index.html +0 -131
  356. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +0 -178
  357. package/coverage/lcov-report/core/api/services/groups/index.html +0 -116
  358. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +0 -184
  359. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +0 -118
  360. package/coverage/lcov-report/core/api/services/import-export/index.html +0 -131
  361. package/coverage/lcov-report/core/api/services/index.html +0 -116
  362. package/coverage/lcov-report/core/api/services/index.js.html +0 -532
  363. package/coverage/lcov-report/core/api/services/mailer/index.html +0 -131
  364. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +0 -190
  365. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +0 -118
  366. package/coverage/lcov-report/core/api/services/messages/index.html +0 -116
  367. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +0 -202
  368. package/coverage/lcov-report/core/api/services/organisations/index.html +0 -131
  369. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +0 -178
  370. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
  371. package/coverage/lcov-report/core/api/services/push/index.html +0 -131
  372. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +0 -190
  373. package/coverage/lcov-report/core/api/services/push/push.service.js.html +0 -121
  374. package/coverage/lcov-report/core/api/services/storage/index.html +0 -131
  375. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +0 -190
  376. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +0 -172
  377. package/coverage/lcov-report/core/api/services/tags/index.html +0 -116
  378. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +0 -178
  379. package/coverage/lcov-report/core/api/services/users/index.html +0 -131
  380. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +0 -310
  381. package/coverage/lcov-report/core/api/services/users/users.service.js.html +0 -100
  382. package/coverage/lcov-report/core/api/utils.js.html +0 -118
  383. package/coverage/lcov-report/core/common/errors.js.html +0 -88
  384. package/coverage/lcov-report/core/common/index.html +0 -191
  385. package/coverage/lcov-report/core/common/index.js.html +0 -115
  386. package/coverage/lcov-report/core/common/permissions.js.html +0 -733
  387. package/coverage/lcov-report/core/common/schema.js.html +0 -190
  388. package/coverage/lcov-report/core/common/utils.js.html +0 -226
  389. package/coverage/lcov-report/core/common/utils.offline.js.html +0 -199
  390. package/coverage/lcov-report/favicon.png +0 -0
  391. package/coverage/lcov-report/index.html +0 -476
  392. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +0 -553
  393. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +0 -397
  394. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +0 -1294
  395. package/coverage/lcov-report/map/api/hooks/index.html +0 -161
  396. package/coverage/lcov-report/map/api/hooks/index.js.html +0 -94
  397. package/coverage/lcov-report/map/api/index.html +0 -131
  398. package/coverage/lcov-report/map/api/index.js.html +0 -139
  399. package/coverage/lcov-report/map/api/marshall.js.html +0 -178
  400. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +0 -106
  401. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +0 -169
  402. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +0 -196
  403. package/coverage/lcov-report/map/api/models/index.html +0 -176
  404. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +0 -109
  405. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +0 -112
  406. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +0 -274
  407. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +0 -610
  408. package/coverage/lcov-report/map/api/services/alerts/index.html +0 -131
  409. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +0 -328
  410. package/coverage/lcov-report/map/api/services/catalog/index.html +0 -116
  411. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +0 -1510
  412. package/coverage/lcov-report/map/api/services/daptiles/index.html +0 -116
  413. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +0 -310
  414. package/coverage/lcov-report/map/api/services/features/features.service.js.html +0 -544
  415. package/coverage/lcov-report/map/api/services/features/index.html +0 -131
  416. package/coverage/lcov-report/map/api/services/index.html +0 -116
  417. package/coverage/lcov-report/map/api/services/index.js.html +0 -1054
  418. package/coverage/lcov-report/map/api/services/projects/index.html +0 -116
  419. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +0 -439
  420. package/coverage/lcov-report/map/api/services/styles/index.html +0 -116
  421. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +0 -196
  422. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +0 -466
  423. package/coverage/lcov-report/map/common/errors.js.html +0 -94
  424. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +0 -544
  425. package/coverage/lcov-report/map/common/grid.js.html +0 -1612
  426. package/coverage/lcov-report/map/common/index.html +0 -371
  427. package/coverage/lcov-report/map/common/index.js.html +0 -172
  428. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +0 -556
  429. package/coverage/lcov-report/map/common/moment-utils.js.html +0 -157
  430. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +0 -868
  431. package/coverage/lcov-report/map/common/opendap-utils.js.html +0 -826
  432. package/coverage/lcov-report/map/common/permissions.js.html +0 -130
  433. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +0 -418
  434. package/coverage/lcov-report/map/common/tms-utils.js.html +0 -274
  435. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +0 -364
  436. package/coverage/lcov-report/map/common/wcs-utils.js.html +0 -586
  437. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +0 -1033
  438. package/coverage/lcov-report/map/common/wfs-utils.js.html +0 -574
  439. package/coverage/lcov-report/map/common/wms-utils.js.html +0 -451
  440. package/coverage/lcov-report/map/common/wmts-utils.js.html +0 -547
  441. package/coverage/lcov-report/prettify.css +0 -1
  442. package/coverage/lcov-report/prettify.js +0 -2
  443. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  444. package/coverage/lcov-report/sorter.js +0 -196
  445. package/coverage/lcov.info +0 -11520
  446. package/coverage/map/api/hooks/hooks.catalog.js.html +0 -553
  447. package/coverage/map/api/hooks/hooks.features.js.html +0 -397
  448. package/coverage/map/api/hooks/hooks.query.js.html +0 -1294
  449. package/coverage/map/api/hooks/index.html +0 -161
  450. package/coverage/map/api/hooks/index.js.html +0 -94
  451. package/coverage/map/api/index.html +0 -131
  452. package/coverage/map/api/index.js.html +0 -139
  453. package/coverage/map/api/marshall.js.html +0 -178
  454. package/coverage/map/api/models/alerts.model.mongodb.js.html +0 -106
  455. package/coverage/map/api/models/catalog.model.mongodb.js.html +0 -169
  456. package/coverage/map/api/models/features.model.mongodb.js.html +0 -196
  457. package/coverage/map/api/models/index.html +0 -176
  458. package/coverage/map/api/models/projects.model.mongodb.js.html +0 -109
  459. package/coverage/map/api/models/styles.model.mongodb.js.html +0 -112
  460. package/coverage/map/api/services/alerts/alerts.hooks.js.html +0 -274
  461. package/coverage/map/api/services/alerts/alerts.service.js.html +0 -610
  462. package/coverage/map/api/services/alerts/index.html +0 -131
  463. package/coverage/map/api/services/catalog/catalog.hooks.js.html +0 -328
  464. package/coverage/map/api/services/catalog/index.html +0 -116
  465. package/coverage/map/api/services/daptiles/daptiles.service.js.html +0 -1510
  466. package/coverage/map/api/services/daptiles/index.html +0 -116
  467. package/coverage/map/api/services/features/features.hooks.js.html +0 -310
  468. package/coverage/map/api/services/features/features.service.js.html +0 -544
  469. package/coverage/map/api/services/features/index.html +0 -131
  470. package/coverage/map/api/services/index.html +0 -116
  471. package/coverage/map/api/services/index.js.html +0 -1054
  472. package/coverage/map/api/services/projects/index.html +0 -116
  473. package/coverage/map/api/services/projects/projects.hooks.js.html +0 -439
  474. package/coverage/map/api/services/styles/index.html +0 -116
  475. package/coverage/map/api/services/styles/styles.hooks.js.html +0 -196
  476. package/coverage/map/common/dynamic-grid-source.js.html +0 -466
  477. package/coverage/map/common/errors.js.html +0 -94
  478. package/coverage/map/common/geotiff-grid-source.js.html +0 -544
  479. package/coverage/map/common/grid.js.html +0 -1612
  480. package/coverage/map/common/index.html +0 -371
  481. package/coverage/map/common/index.js.html +0 -172
  482. package/coverage/map/common/meteo-model-grid-source.js.html +0 -556
  483. package/coverage/map/common/moment-utils.js.html +0 -157
  484. package/coverage/map/common/opendap-grid-source.js.html +0 -868
  485. package/coverage/map/common/opendap-utils.js.html +0 -826
  486. package/coverage/map/common/permissions.js.html +0 -130
  487. package/coverage/map/common/time-based-grid-source.js.html +0 -418
  488. package/coverage/map/common/tms-utils.js.html +0 -274
  489. package/coverage/map/common/wcs-grid-source.js.html +0 -364
  490. package/coverage/map/common/wcs-utils.js.html +0 -586
  491. package/coverage/map/common/weacast-grid-source.js.html +0 -1033
  492. package/coverage/map/common/wfs-utils.js.html +0 -574
  493. package/coverage/map/common/wms-utils.js.html +0 -451
  494. package/coverage/map/common/wmts-utils.js.html +0 -547
  495. package/coverage/prettify.css +0 -1
  496. package/coverage/prettify.js +0 -2
  497. package/coverage/sort-arrow-sprite.png +0 -0
  498. package/coverage/sorter.js +0 -196
  499. package/coverage/tmp/coverage-151198-1753351220086-0.json +0 -1
  500. package/coverage/tmp/coverage-151210-1753351220070-0.json +0 -1
  501. package/coverage/tmp/coverage-151221-1753351129816-0.json +0 -1
  502. package/coverage/tmp/coverage-151233-1753351129803-0.json +0 -1
  503. package/coverage/tmp/coverage-151240-1753351129770-0.json +0 -1
  504. package/coverage/tmp/coverage-151307-1753351220058-0.json +0 -1
  505. package/coverage/tmp/coverage-151319-1753351220044-0.json +0 -1
  506. package/coverage/tmp/coverage-151326-1753351220010-0.json +0 -1
  507. package/extras/tours/core/account-profile.js +0 -32
  508. package/extras/tours/core/account.js +0 -143
  509. package/extras/tours/core/add-member.js +0 -75
  510. package/extras/tours/core/add-tag.js +0 -13
  511. package/extras/tours/core/create-group.js +0 -19
  512. package/extras/tours/core/create-organisation.js +0 -19
  513. package/extras/tours/core/create-tag.js +0 -26
  514. package/extras/tours/core/edit-member-role.js +0 -13
  515. package/extras/tours/core/groups.js +0 -65
  516. package/extras/tours/core/join-group.js +0 -13
  517. package/extras/tours/core/login.js +0 -41
  518. package/extras/tours/core/members.js +0 -108
  519. package/extras/tours/core/register.js +0 -61
  520. package/extras/tours/core/send-reset-password.js +0 -14
  521. package/extras/tours/core/tags.js +0 -65
  522. package/extras/tours/map/catalog-panel.js +0 -112
  523. package/extras/tours/map/fab.js +0 -26
  524. package/extras/tours/map/navigation-bar.js +0 -187
  525. package/extras/tours/map/side-nav.js +0 -36
  526. package/test/api/core/test-log-2025-02-05.log +0 -23
  527. package/test/api/core/test-log-2025-05-21.log +0 -15
  528. package/test/api/core/test-log-2025-06-25.log +0 -9
  529. package/test/api/core/test-log-2025-07-24.log +0 -44
  530. package/test/api/map/test-log-2025-05-27.log +0 -13
  531. package/test/api/map/test-log-2025-06-23.log +0 -7
  532. package/test/api/map/test-log-2025-07-24.log +0 -11
  533. package/test/client/core/api.js +0 -361
  534. package/test/client/core/index.js +0 -9
  535. package/test/client/index.js +0 -4
  536. package/test/client/map/index.js +0 -5
  537. package/test.client.js +0 -1
  538. /package/{test/client/core/time.js → extras/tests/core/time.mjs} +0 -0
  539. /package/extras/tours/{map/add-layer.js → add-layer.js} +0 -0
  540. /package/extras/tours/{map/catalog-categories.js → catalog-categories.js} +0 -0
  541. /package/extras/tours/{map/connect-layer.js → connect-layer.js} +0 -0
  542. /package/extras/tours/{map/create-layer.js → create-layer.js} +0 -0
  543. /package/extras/tours/{map/create-view.js → create-view.js} +0 -0
  544. /package/extras/tours/{map/import-layer.js → import-layer.js} +0 -0
  545. /package/extras/tours/{map/timeline.js → pane.bottom.js} +0 -0
@@ -50,9 +50,9 @@
50
50
  import _ from 'lodash'
51
51
  import logger from 'loglevel'
52
52
  import { ref, computed, watch } from 'vue'
53
- import { api, i18n, Store } from '../../../../core/client'
53
+ import { i18n } from '../../../../core/client'
54
54
  import { getLayersBySublegend } from '../../utils'
55
- import { useCurrentActivity, useCatalog } from '../../composables'
55
+ import { useCurrentActivity } from '../../composables'
56
56
  import KLayerLegend from './KLayerLegend.vue'
57
57
 
58
58
  // Props
@@ -86,24 +86,13 @@ const props = defineProps({
86
86
  }
87
87
  })
88
88
 
89
- // Get current project for activity if any
90
- const { getActivityProject } = useCurrentActivity({ selection: false, probe: false })
91
- const project = getActivityProject()
92
- // We expect the project object to expose the underlying API
93
- const planetApi = project && typeof project.getPlanetApi === 'function' ? project.getPlanetApi() : api
94
- // Use target catalog according to project
95
- const { getSublegends: getProjectSublegends } = useCatalog({ project, planetApi })
96
- // Use global catalog
97
- const { getSublegends } = useCatalog({ context: 'global' })
98
- // Use local catalog if any
99
- const { getSublegends: getContextSublegends } = useCatalog({ context: Store.get('context') })
100
-
101
89
  // Data
102
90
  const { CurrentActivity } = useCurrentActivity({ selection: false, probe: false })
103
91
  const sublegends = ref([])
104
92
  const layers = ref([])
105
93
  const engine = ref()
106
94
  const zoom = ref()
95
+ const requestRefresh = _.debounce(refresh, 300)
107
96
 
108
97
  // Computed
109
98
  const layersBySublegend = computed(() => getLayersBySublegend(layers.value, sublegends.value))
@@ -112,17 +101,13 @@ const layersBySublegend = computed(() => getLayersBySublegend(layers.value, subl
112
101
  watch([() => props.sublegends, () => props.sublegendsFromCatalog], async () => {
113
102
  // Retrieve the legends from catalog if required
114
103
  if (props.sublegendsFromCatalog) {
115
- sublegends.value = await getSublegends()
116
- if (project) {
117
- sublegends.value = _.uniqBy(_.concat(sublegends.value, await getProjectSublegends()), 'name')
118
- }
119
- if (Store.get('context')) {
120
- sublegends.value = _.uniqBy(_.concat(sublegends.value, await getContextSublegends()), 'name')
121
- }
104
+ sublegends.value = await CurrentActivity.value.getCatalogSublegends()
122
105
  } else {
123
106
  sublegends.value = []
124
107
  }
125
- sublegends.value = _.uniqBy(_.concat(sublegends.value, props.sublegends), 'name')
108
+ sublegends.value = _.orderBy(_.uniqBy(_.concat(sublegends.value, props.sublegends), 'name'), sublegend => {
109
+ return _.get(sublegend, 'order', 50)
110
+ })
126
111
  // register legend translations
127
112
  _.forEach(sublegends.value, legend => {
128
113
  if (legend.i18n) i18n.registerTranslation(legend.i18n)
@@ -131,9 +116,10 @@ watch([() => props.sublegends, () => props.sublegendsFromCatalog], async () => {
131
116
  watch(CurrentActivity, (newActivity, oldActivity) => {
132
117
  if (oldActivity) {
133
118
  // remove listeners
134
- oldActivity.value.$engineEvents.off('zoomend', onZoomChanged)
135
- oldActivity.value.$engineEvents.off('layer-shown', onShowLayer)
136
- oldActivity.value.$engineEvents.off('layer-hidden', onHideLayer)
119
+ oldActivity.value.$engineEvents.off('zoomend', requestRefresh)
120
+ oldActivity.value.$engineEvents.off('layer-shown', requestRefresh)
121
+ oldActivity.value.$engineEvents.off('layer-hidden', requestRefresh)
122
+ oldActivity.value.$engineEvents.off('layer-filter-toggled', requestRefresh)
137
123
  // clear legend
138
124
  sublegends.value = []
139
125
  layers.value = []
@@ -144,38 +130,45 @@ watch(CurrentActivity, (newActivity, oldActivity) => {
144
130
  // setup legend
145
131
  engine.value = newActivity.engine
146
132
  zoom.value = newActivity.getCenter().zoomLevel
147
- newActivity.getLayers().forEach((layer) => {
148
- if (newActivity.isLayerVisible(layer.name)) {
149
- onShowLayer(layer)
150
- }
151
- })
133
+ refresh()
152
134
  // install listeners
153
- newActivity.$engineEvents.on('layer-shown', onShowLayer)
154
- newActivity.$engineEvents.on('layer-hidden', onHideLayer)
155
- newActivity.$engineEvents.on('zoomend', onZoomChanged)
135
+ newActivity.$engineEvents.on('layer-filter-toggled', requestRefresh)
136
+ newActivity.$engineEvents.on('layer-shown', requestRefresh)
137
+ newActivity.$engineEvents.on('layer-hidden', requestRefresh)
138
+ newActivity.$engineEvents.on('zoomend', requestRefresh)
156
139
  }
157
140
  }, { immediate: true })
158
141
 
159
142
  // Functions
160
- function onShowLayer (layer, engine) {
161
- const layerLegend = layer.legend
162
- // Check whether the layer has a legend
163
- if (!layerLegend) return
164
- // Check wehther the legend is already registered for that layer
165
- if (_.find(layers.value, { name: layer.name })) {
166
- logger.warn(`[KDK] Legend for ${layer.name} already resgistered`)
167
- return
168
- }
169
- logger.debug(`[KDK] Register '${layer.name}' legend`)
170
- layers.value.push(layer)
171
- }
172
- function onHideLayer (layer) {
173
- if (!layer.legend) return
174
- logger.debug(`[KDK] Unregister '${layer.name}' legend`)
175
- _.remove(layers.value, { name: layer.name })
176
- }
177
- function onZoomChanged () {
143
+ function refresh () {
144
+ if (!CurrentActivity.value) return
145
+ logger.debug('[KDK] Refreshing legend')
146
+ // set the current zoom
178
147
  zoom.value = CurrentActivity.value.getCenter().zoomLevel
148
+ // set the layers for which it is required to display a legend
149
+ const iterator = {
150
+ layers: [],
151
+ groups: []
152
+ }
153
+ _.reduce(CurrentActivity.value.getLayers(), (iterator, layer) => {
154
+ const isVisible = layer.isVisible
155
+ const hasLegend = layer.legend
156
+ const hasFilterLegend = _.some(layer.filters, filter => filter.legend)
157
+ if (isVisible && (hasLegend || hasFilterLegend)) {
158
+ if (!hasLegend) iterator.layers.push(layer)
159
+ else if (!layer.legend.group) iterator.layers.push(layer)
160
+ else {
161
+ const group = layer.legend.group
162
+ if (!_.includes(iterator.groups, group)) {
163
+ iterator.layers.push(layer)
164
+ iterator.groups.push(group)
165
+ }
166
+ }
167
+ }
168
+ return iterator
169
+ }, iterator)
170
+ // order the layers according the name
171
+ layers.value = _.orderBy(iterator.layers, layer => layer.label || layer.name)
179
172
  }
180
173
  function getHelperIcon (helper) {
181
174
  return _.get(helper, 'icon', undefined)
@@ -28,13 +28,12 @@
28
28
  self="top left"
29
29
  />
30
30
  </div>
31
- <div v-else style="height: 142px">
32
- <div class="absolute-center">
33
- <KStamp
34
- icon="las la-map-marker"
35
- text="KLocationCardSection.NO_LOCATION"
36
- />
37
- </div>
31
+ <div v-else style="height: 142px; position: relative;">
32
+ <KStamp
33
+ icon="las la-map-marker"
34
+ text="KLocationCardSection.NO_LOCATION"
35
+ class="absolute-center"
36
+ />
38
37
  </div>
39
38
  </KCardSection>
40
39
  </template>
@@ -20,6 +20,7 @@ import config from 'config'
20
20
  import centroid from '@turf/centroid'
21
21
  import { KPanel } from '../../../../core/client/components'
22
22
  import { api } from '../../../../core/client/api.js'
23
+ import { Store } from '../../../../core/client/store.js'
23
24
  import * as mapMixins from '../../mixins/map'
24
25
  import { Geolocation } from '../../geolocation.js'
25
26
  import { useCatalog, useCurrentActivity } from '../../composables'
@@ -162,16 +163,19 @@ export default {
162
163
  }
163
164
  // update the location
164
165
  this.location = this.modelValue
166
+ // check wether it holds some features
165
167
  if (!this.location) return
168
+ const featureType = this.location.type
169
+ if (featureType === 'FeatureCollection' && _.isEmpty(this.location.features)) return
166
170
  // backward compatibility with old format with only lat/lon or a geometry, not a feature
167
- if (this.location.type !== 'Feature') {
171
+ if (featureType !== 'Feature' && featureType !== 'FeatureCollection') {
168
172
  const feature = { type: 'Feature', geometry: this.location, properties: { name: this.location.name } }
169
173
  if (!_.has(feature, 'geometry.type')) feature.geometry = { type: 'Point', coordinates: [this.location.longitude, this.location.latitude] }
170
174
  this.location = feature
171
175
  }
172
176
  // create a new layer
173
- const type = _.get(this.location, 'geometry.type')
174
- if (type === 'Point') {
177
+ const geometryType = _.get(this.location, 'geometry.type')
178
+ if (geometryType === 'Point') {
175
179
  const coordinates = _.get(this.location, 'geometry.coordinates')
176
180
  const style = _.get(this.location, 'style', _.get(this.engineOptions, 'style.location.point'))
177
181
  this.locationLayer = createMarkerFromPointStyle([coordinates[1], coordinates[0]],
@@ -186,11 +190,11 @@ export default {
186
190
  logger.warn(`[KDK] cannot get a style type from the feature of geometry type ${feature.geometry.type}`)
187
191
  return
188
192
  }
189
- if (styleType === 'line') return getDefaultLineStyle(feature, null, this.engineOptions, 'style.location.line')
190
- return getDefaultPolygonStyle(feature, null, this.engineOptions, 'style.location.polygon')
193
+ if (styleType === 'line') return getDefaultLineStyle(feature, null, _.get(this.engineOptions, 'style.location.line'))
194
+ return getDefaultPolygonStyle(feature, null, _.get(this.engineOptions, 'style.location.polygon'))
191
195
  },
192
196
  pointToLayer: (feature, latlng) => {
193
- const style = getDefaultPointStyle(feature, null, this.engineOptions, 'style.location.point')
197
+ const style = getDefaultPointStyle(feature, null, _.get(this.engineOptions, 'style.location.point'))
194
198
  if (!style) {
195
199
  logger.warn('[KDK] cannot generate point style from a feature')
196
200
  return
@@ -204,7 +208,7 @@ export default {
204
208
  },
205
209
  onLocationDragged () {
206
210
  const latLng = this.locationLayer.getLatLng()
207
- const newLocation = coordinatesToGeoJSON(latLng.lat, latLng.lng, this.$store.get('locationFormat', 'FFf'))
211
+ const newLocation = coordinatesToGeoJSON(latLng.lat, latLng.lng, Store.get('locationFormat', 'FFf'))
208
212
  this.$emit('update:modelValue', newLocation)
209
213
  },
210
214
  startDraw (shape) {
@@ -232,11 +236,11 @@ export default {
232
236
  const geometry = feature.geometry.type
233
237
  if (geometry === 'Point') {
234
238
  const coords = feature.geometry.coordinates
235
- feature.properties.name = formatUserCoordinates(coords[1], coords[0], this.$store.get('locationFormat', 'FFf'))
239
+ feature.properties.name = formatUserCoordinates(coords[1], coords[0], Store.get('locationFormat', 'FFf'))
236
240
  } else {
237
241
  const prefix = this.$t(geometry === 'Polygon' ? 'KLocationMap.ZONE' : 'KLocationMap.PATH')
238
242
  const coords = _.get(centroid(feature), 'geometry.coordinates')
239
- feature.properties.name = `${prefix} (${formatUserCoordinates(coords[1], coords[0], this.$store.get('locationFormat', 'FFf'))})`
243
+ feature.properties.name = `${prefix} (${formatUserCoordinates(coords[1], coords[0], Store.get('locationFormat', 'FFf'))})`
240
244
  }
241
245
  this.$emit('update:modelValue', feature)
242
246
  // clear draw layer
@@ -249,23 +253,29 @@ export default {
249
253
  async mapRefCreated (container) {
250
254
  if (container) {
251
255
  if (!this.mapReady) {
252
- // setup map
256
+ // setup the map
253
257
  logger.debug('[KDK] Create location map with viewer options', this.engineOptions.viewer)
254
258
  this.setupMap(container, this.engineOptions.viewer)
255
259
  this.mapReady = true
256
260
  // setup base layer
257
261
  const baseLayers = await this.getLayers({ type: 'BaseLayer' })
258
- if (baseLayers.length > 0) await this.addLayer(baseLayers[0])
262
+ // [!] remember Vue won’t wait for async: use mapReady as a guard to
263
+ // prevent executing the process after the component is destroyed
264
+ // https://github.com/kalisio/kdk/issues/1291
265
+ if (this.mapReady && baseLayers.length > 0) await this.addLayer(baseLayers[0])
259
266
  // setup location
260
- this.refresh()
267
+ if (this.mapReady) this.refresh()
261
268
  }
269
+ } else {
270
+ // keep trace when the component is being unmounted
271
+ this.mapReady = false
262
272
  }
263
273
  },
264
274
  getLocation () {
265
275
  return this.modelValue
266
276
  }
267
277
  },
268
- async mounted () {
278
+ mounted () {
269
279
  this.$engineEvents.on('pm:create', this.stopDraw)
270
280
  },
271
281
  beforeUnmount () {
@@ -13,6 +13,11 @@
13
13
  size="0.75rem"
14
14
  :handler="onCopy"
15
15
  />
16
+ <q-separator
17
+ vertical
18
+ color="grey-6"
19
+ style="margin: 6px;"
20
+ />
16
21
  <KAction
17
22
  id="close-position"
18
23
  icon="cancel"
@@ -15,16 +15,20 @@
15
15
  </template>
16
16
 
17
17
  <script setup>
18
+ import _ from 'lodash'
18
19
  import { computed, onMounted, ref } from 'vue'
19
20
  import { api } from '../../../../core/client'
20
21
  import { useCurrentActivity } from '../../composables'
21
- import { editLayerStyle } from '../../utils.map'
22
+ import { editLayerStyle, editFilterStyle } from '../../utils.map'
23
+ import { getStyleType } from '../../utils/utils.style.js'
24
+ import KSubMenu from '../../../../core/client/components/menu/KSubMenu.vue'
22
25
 
23
- const { CurrentActivity } = useCurrentActivity()
24
-
25
- const styles = ref([])
26
-
27
- defineProps({
26
+ // Props
27
+ const props = defineProps({
28
+ context: {
29
+ type: Object,
30
+ required: true
31
+ },
28
32
  label: {
29
33
  type: String,
30
34
  required: true
@@ -32,27 +36,70 @@ defineProps({
32
36
  icon: {
33
37
  type: String,
34
38
  required: false
39
+ },
40
+ ignoreFeatureStyle: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ maxItems: {
45
+ type: Number,
46
+ default: 250
47
+ },
48
+ filteringPolicy: {
49
+ type: String,
50
+ default: 'none',
51
+ validator: (value) => {
52
+ return ['none', 'permissive', 'strict'].includes(value)
53
+ }
35
54
  }
36
55
  })
37
56
 
57
+ // Data
58
+ const { CurrentActivity } = useCurrentActivity()
59
+ const styles = ref([])
60
+
61
+ // Computed
38
62
  const menuContent = computed(() => {
39
63
  if (styles.value.length <= 0) return []
40
64
  return styles.value.map((style, i) => ({
41
65
  id: 'apply-style-to-layer-' + i,
42
66
  label: style.name,
43
- handler: (layer) => applyToLayer(layer, style)
67
+ handler: () => applyToLayer(style)
44
68
  }))
45
69
  })
46
70
 
47
- async function applyToLayer (layer, styleToApply) {
48
- await editLayerStyle(layer, styleToApply)
49
- if (CurrentActivity.value.isInMemoryLayer(layer)) {
50
- await CurrentActivity.value.resetLayer(layer)
71
+ // Functions
72
+ async function applyToLayer (styleToApply) {
73
+ const layer = props.context
74
+ if (_.get(layer, 'filter')) {
75
+ const engineStyle = _.pick(_.get(CurrentActivity.value, 'activityOptions.engine.style', {}), ['point', 'line', 'polygon'])
76
+ await editFilterStyle(layer.layer, layer.filter, engineStyle, styleToApply, props.ignoreFeatureStyle)
77
+ } else {
78
+ await editLayerStyle(layer, styleToApply, props.ignoreFeatureStyle)
79
+ if (CurrentActivity.value.isInMemoryLayer(layer)) {
80
+ await CurrentActivity.value.resetLayer(layer)
81
+ }
51
82
  }
52
83
  }
84
+ async function getFilterQuery () {
85
+ const layer = _.has(props.context, 'layer') ? props.context.layer : props.context
86
+ let filterQuery = {}
87
+ if (!['permissive', 'strict'].includes(props.filteringPolicy) || !_.has(layer, 'geometryTypes')) return filterQuery
88
+
89
+ const styleTypes = _.uniq(_.map(layer.geometryTypes, type => getStyleType(type)))
90
+ if (props.filteringPolicy === 'strict') {
91
+ filterQuery = { $and: ['point', 'line', 'polygon'].map(type => ({ [type]: { $exists: styleTypes.includes(type) } })) }
92
+ } else {
93
+ filterQuery = { $or: styleTypes.map(type => ({ [type]: { $exists: true } })) }
94
+ }
95
+
96
+ return filterQuery
97
+ }
53
98
 
54
99
  onMounted(async () => {
55
- const res = await api.getService('styles').find()
100
+ const baseQuery = { $limit: props.maxItems, $sort: { name: 1 } }
101
+ const filterQuery = await getFilterQuery()
102
+ const res = await api.getService('styles').find({ query: Object.assign({}, baseQuery, filterQuery) })
56
103
  styles.value = res.data
57
104
  })
58
105
  </script>
@@ -26,6 +26,7 @@
26
26
  -->
27
27
  <KStyleEditorSection
28
28
  v-if="canEditPoint"
29
+ v-model="enabledSections.point"
29
30
  label="KStyleEditor.POINT_SECTION"
30
31
  :style="model"
31
32
  type="point"
@@ -55,6 +56,7 @@
55
56
  -->
56
57
  <KStyleEditorSection
57
58
  v-if="canEditLine"
59
+ v-model="enabledSections.line"
58
60
  label="KStyleEditor.LINE_SECTION"
59
61
  :style="model"
60
62
  type="line"
@@ -70,6 +72,7 @@
70
72
  -->
71
73
  <KStyleEditorSection
72
74
  v-if="canEditPolygon"
75
+ v-model="enabledSections.polygon"
73
76
  label="KStyleEditor.POLYGON_SECTION"
74
77
  :style="model"
75
78
  type="polygon"
@@ -105,7 +108,10 @@ import _ from 'lodash'
105
108
  import config from 'config'
106
109
  import logger from 'loglevel'
107
110
  import { ref, computed, watch } from 'vue'
108
- import { api, i18n, utils as kdkCoreUtils } from '@kalisio/kdk/core.client'
111
+ import { Notify } from 'quasar'
112
+ import { i18n } from '../../../../core/client/i18n.js'
113
+ import { api } from '../../../../core/client/api.js'
114
+ import { containsText } from '../../../../core/client/utils/index.js'
109
115
  import { useCurrentActivity } from '../../composables'
110
116
  import KPanel from '../../../../core/client/components/KPanel.vue'
111
117
  import KStyleEditorSection from './KStyleEditorSection.vue'
@@ -149,6 +155,11 @@ const { CurrentActivityContext } = useCurrentActivity()
149
155
  const formRef = ref(null)
150
156
  const model = ref(null)
151
157
  const mode = props.style ? 'edition' : 'creation'
158
+ const enabledSections = ref({ point: true, line: true, polygon: true })
159
+ const formValues = {
160
+ name: _.get(props.style, 'name', ''),
161
+ tags: _.get(props.style, 'tags', [])
162
+ }
152
163
  const formSchema = {
153
164
  $schema: 'http://json-schema.org/draft-07/schema#',
154
165
  $id: 'http://kalisio.xyz/schemas/style-editor#',
@@ -162,16 +173,35 @@ const formSchema = {
162
173
  component: 'form/KTextField',
163
174
  label: 'KStyleEditor.NAME_LABEL'
164
175
  }
176
+ },
177
+ tags: {
178
+ type: 'array',
179
+ minLength: 3,
180
+ maxLength: 256,
181
+ services: [
182
+ {
183
+ service: 'tags',
184
+ field: 'name',
185
+ description: 'label',
186
+ baseQuery: {
187
+ service: 'styles'
188
+ }
189
+ }
190
+ ],
191
+ field: {
192
+ component: 'form/KTagField',
193
+ label: 'KTagManager.TITLE',
194
+ service: 'styles',
195
+ property: 'tags'
196
+ },
197
+ multiselect: true,
198
+ minCharsToSearch: 0
165
199
  }
166
200
  },
167
201
  required: ['name']
168
202
  }
169
203
 
170
204
  // Computed
171
- const formValues = computed(() => {
172
- if (_.isEmpty(props.style)) return null
173
- return { name: _.get(props.style, 'name') }
174
- })
175
205
  const engine = computed(() => {
176
206
  return _.cloneDeep(_.get(CurrentActivityContext.config, 'engine', _.get(config, 'engines.leaflet')))
177
207
  })
@@ -212,7 +242,7 @@ const buttons = computed(() => {
212
242
  },
213
243
  {
214
244
  id: 'apply-style',
215
- label: 'APPLY',
245
+ label: mode === 'creation' ? 'CREATE' : 'UPDATE',
216
246
  renderer: 'form-button',
217
247
  handler: apply
218
248
  }
@@ -224,8 +254,17 @@ const canEditPolygon = computed(() => props.allowedTypes.includes('polygon'))
224
254
 
225
255
  // Watch
226
256
  watch(() => props.style, (value) => {
257
+ const onFirstLoad = model.value === null
258
+
227
259
  if (!value) model.value = _.clone(_.pick(engine.value.style, ['point', 'line', 'polygon']))
228
260
  else model.value = value
261
+
262
+ _.forEach(['point', 'line', 'polygon'], section => {
263
+ if (!_.get(model.value, section)) {
264
+ if (onFirstLoad) enabledSections.value[section] = false
265
+ _.set(model.value, section, getDefaultValue(section))
266
+ }
267
+ })
229
268
  }, { immediate: true })
230
269
 
231
270
  // Functions
@@ -233,12 +272,13 @@ function getDefaultValue (path) {
233
272
  return _.get(engine.value.style, path, _.cloneDeep(_.get(DefaultStyle, path)))
234
273
  }
235
274
  const onNameChanged = _.debounce(async (field, value) => {
275
+ if (field !== 'name' || !value) return
236
276
  if (_.size(value) > 2) await checkName(value)
237
277
  }, 200)
238
278
  async function checkName (name) {
239
279
  if (mode === 'edition' && name === props.style.name) return true
240
280
  const service = api.getService('styles')
241
- const hasName = await kdkCoreUtils.containsText(service, 'name', name)
281
+ const hasName = await containsText(service, 'name', name)
242
282
  if (!hasName || !formRef.value) return true
243
283
  formRef.value.getField('name').reference.invalidate(i18n.t('KStyleEditor.STYLE_ALREADY_EXISTS', { style: name }))
244
284
  return false
@@ -251,7 +291,30 @@ async function apply () {
251
291
  const isUnique = await checkName(values.name)
252
292
  if (!isUnique) return false
253
293
  // create to patch the style
254
- let data = _.merge(model.value, values)
294
+ let data = Object.assign({}, model.value, values)
295
+ // omit disabled feature types
296
+ const omitKeys = []
297
+ let atLeastOneSectionEnabled = false
298
+ _.forIn(enabledSections.value, (value, key) => {
299
+ if (!value) {
300
+ omitKeys.push(key)
301
+ if (mode !== 'creation') {
302
+ _.set(data, `$unset.${key}`, true)
303
+ }
304
+ } else {
305
+ atLeastOneSectionEnabled = true
306
+ }
307
+ })
308
+ if (!atLeastOneSectionEnabled) {
309
+ Notify.create({
310
+ type: 'negative',
311
+ message: i18n.t('KStyleEditor.ALL_SECTIONS_DISABLED')
312
+ })
313
+ return false
314
+ }
315
+ data = _.omit(data, omitKeys)
316
+ // keep only usefull data from tags
317
+ data.tags = _.map(values.tags, tag => _.pick(tag, ['name', 'description', 'color']))
255
318
  if (mode === 'creation') {
256
319
  data = _.merge(data, { type: 'style', scope: 'user' })
257
320
  logger.debug('[KDK] Create style with values:', data)