@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
@@ -1,34 +1,70 @@
1
1
  <template>
2
- <div>
3
- <slot name="header" />
4
- <div v-if="layers.length > 0">
5
- <template v-for="layer in layers">
6
- <component
7
- :is="layerRenderer.component"
8
- v-bind="layerRenderer.options"
9
- :layer="layer"
10
- @toggled="onLayerToggled"
11
- @filter-toggled="onLayerFilterToggled"
12
- />
2
+ <div v-if="props.layers.length > 0">
3
+ <k-layers-list :layers="filteredLayers" :options="options">
4
+ <template v-slot:header>
5
+ <div class="q-ma-sm">
6
+ <q-select
7
+ for="layer-model"
8
+ id="layer-model"
9
+ :placeholder="$t('KLayersSelector.SELECT_LAYERS')"
10
+ autocomplete="off"
11
+ v-model="model"
12
+ :options="selectOptions"
13
+ filled
14
+ use-input
15
+ use-chips
16
+ map-options
17
+ emit-value
18
+ multiple
19
+ clearable
20
+ @filter="filter"
21
+ @add="toggleLayer"
22
+ @remove="toggleLayer"
23
+ @clear="clear"
24
+ >
25
+ <template v-slot:prepend>
26
+ <q-icon name="las la-map-marker" />
27
+ </template>
28
+ <template v-slot:option="scope">
29
+ <q-item v-bind="scope.itemProps" :id="scope.opt.name">
30
+ <q-item-section avatar>
31
+ <q-icon
32
+ v-if="!scope.opt.iconUrl"
33
+ :name="scope.opt.icon || 'las la-map-marker'"
34
+ />
35
+ </q-item-section>
36
+ <q-item-section>
37
+ <q-item-label lines="1">
38
+ {{ scope.opt.label }}
39
+ </q-item-label>
40
+ <q-item-label caption lines="2">
41
+ {{ scope.opt.description }}
42
+ </q-item-label>
43
+ </q-item-section>
44
+ </q-item>
45
+ </template>
46
+ </q-select>
47
+ </div>
13
48
  </template>
14
- </div>
15
- <div v-else-if="!options.hideIfEmpty" class="row justify-center q-pa-sm">
16
- <KStamp
17
- icon="las la-exclamation-circle"
18
- icon-size="sm"
19
- :text="$t('KLayersSelector.NO_LAYER_AVAILABLE')"
20
- direction="horizontal"
21
- />
22
- </div>
23
- <slot name="footer" />
49
+ </k-layers-list>
50
+ </div>
51
+ <div v-else class="row justify-center q-pa-sm">
52
+ <KStamp
53
+ icon="las la-exclamation-circle"
54
+ icon-size="sm"
55
+ :text="$t('KWeatherLayersSelector.NO_MODEL_AVAILABLE')"
56
+ text-size="0.9rem"
57
+ direction="horizontal"
58
+ />
24
59
  </div>
25
60
  </template>
26
61
 
27
62
  <script setup>
28
63
  import _ from 'lodash'
29
- import { computed } from 'vue'
30
- import { utils } from '../../../../core/client'
31
- import KStamp from '../../../../core/client/components/KStamp.vue'
64
+ import { computed, ref } from 'vue'
65
+ import { KStamp } from '../../../../core/client/components'
66
+ import KLayersList from './KLayersList.vue'
67
+ import { useCurrentActivity } from '../../composables'
32
68
 
33
69
  // Props
34
70
  const props = defineProps({
@@ -42,38 +78,50 @@ const props = defineProps({
42
78
  }
43
79
  })
44
80
 
81
+ // Data
82
+ const model = ref([])
83
+ const selectOptions = ref(
84
+ props.layers.map((layer) => ({ label: layer.label, value: layer._id }))
85
+ )
86
+ const { CurrentActivity } = useCurrentActivity()
87
+ const { layers } = CurrentActivity.value
88
+
45
89
  // Computed
46
- const layerRenderer = computed(() => {
47
- return {
48
- component: utils.loadComponent(_.get(props.options, 'renderer', 'catalog/KFilteredLayerItem')),
49
- options: _.get(props.options, 'renderer.options', {})
50
- }
51
- })
90
+ const filteredLayers = computed(() =>
91
+ model.value
92
+ ? props.layers.filter((layer) => model.value.includes(layer._id))
93
+ : []
94
+ )
52
95
 
53
96
  // Functions
54
- function toggleLayer (layer) {
97
+ function toggleLayer (layerId) {
98
+ const layer = props.layers.find((l) => l._id === layerId.value)
55
99
  const toggleAction = _.find(layer.actions, { id: 'toggle' })
56
100
  if (toggleAction) toggleAction.handler()
57
101
  }
58
- async function onLayerToggled (layer) {
59
- if (layer.isDisabled) return
60
- if (props.options.exclusive) {
61
- // Due to v-model the visible flag has already been changed on the layer
62
- // Simply reset others layers before activating the new one to avoid any problem
63
- const visibleLayers = _.filter(props.layers, { isVisible: true })
64
- for (let i = 0; i < visibleLayers.length; i++) {
65
- const visibleLayer = visibleLayers[i]
66
- if (visibleLayer !== layer) await toggleLayer(visibleLayers[i])
67
- }
102
+ function clear () {
103
+ for (const layer of props.layers) {
104
+ if (layer?.isVisible) toggleLayer({ value: layer._id })
68
105
  }
69
- await toggleLayer(layer)
106
+ model.value = []
70
107
  }
71
- function toggleLayerFilter (layer, filter) {
72
- const toggleFilterAction = _.find(layer.actions, { id: 'toggle-filter' })
73
- if (toggleFilterAction) toggleFilterAction.handler(filter)
108
+ function filter (val, update, abort) {
109
+ update(() => {
110
+ const needle = val.toLowerCase()
111
+ selectOptions.value = props.layers
112
+ .filter((layer) => layer.label.toLowerCase().indexOf(needle) > -1)
113
+ .map((layer) => ({ label: layer.label, value: layer._id }))
114
+ })
74
115
  }
75
- function onLayerFilterToggled (layer, filter) {
76
- if (layer.isDisabled) return
77
- toggleLayerFilter(layer, filter)
116
+
117
+ // set default layers from layer.leaflet.isVisible property
118
+ if (props.layers.length > 0) {
119
+ for (const layer of props.layers) {
120
+ const layerObject = layers[layer.name]
121
+ if (layerObject) {
122
+ const isLayerVisible = _.get(layerObject, 'isVisible')
123
+ if (isLayerVisible && !model.value.includes(layer._id)) model.value.push(layer._id)
124
+ }
125
+ }
78
126
  }
79
127
  </script>
@@ -66,15 +66,6 @@ export default {
66
66
  },
67
67
  methods: {
68
68
  async apply () {
69
- // We at least needs a background layer
70
- // FIXME: how to do this as we only have IDs here
71
- /*
72
- const layers = this.form.values().layers
73
- if (!_.find(layers, { type: 'BaseLayer'})) {
74
- this.$notify({ type: 'negative', message: this.$t('KProjectEditor.BACKGROUND_LAYER_REQUIRED') })
75
- return
76
- }
77
- */
78
69
  this.processing = true
79
70
  if (await baseEditor.methods.apply.call(this)) {
80
71
  this.processing = false
@@ -28,6 +28,7 @@
28
28
  <script>
29
29
  import { KPanel, KAction } from '../../../../core/client/components'
30
30
  import { baseItem } from '../../../../core/client/mixins'
31
+ import { api } from '../../../../core/client/api.js'
31
32
 
32
33
  export default {
33
34
  name: 'k-project-selector',
@@ -39,14 +40,14 @@ export default {
39
40
  computed: {
40
41
  projectActions () {
41
42
  const projectActions = []
42
- if (this.$can('update', 'projects', this.item)) {
43
+ if (api.can('update', 'projects', this.item)) {
43
44
  const content = [{
44
45
  id: 'edit-project',
45
46
  icon: 'las la-file-alt',
46
47
  label: 'KProjectSelector.EDIT_PROJECT',
47
48
  handler: (item) => this.$emit('item-selected', item, 'edit-project')
48
49
  }]
49
- if (this.$can('remove', 'projects', this.item)) {
50
+ if (api.can('remove', 'projects', this.item)) {
50
51
  content.push({
51
52
  id: 'remove-project',
52
53
  icon: 'las la-trash',
@@ -6,7 +6,7 @@
6
6
  :nb-items-per-page="20"
7
7
  :append-items="true"
8
8
  :base-query="baseQuery"
9
- :filter-query="filter.query"
9
+ :filter-query="filterQuery"
10
10
  :dense="true"
11
11
  :scrollToTop="false"
12
12
  :header="toolbar"
@@ -17,11 +17,12 @@
17
17
  </template>
18
18
 
19
19
  <script setup>
20
+ import _ from 'lodash'
20
21
  import logger from 'loglevel'
21
22
  import { ref, computed } from 'vue'
22
23
  import { useRouter, useRoute } from 'vue-router'
23
24
  import { useCurrentActivity } from '../../composables'
24
- import { Filter, Sorter, utils, i18n, api } from '../../../../core/client'
25
+ import { utils, i18n, api } from '../../../../core/client'
25
26
  import { KGrid } from '../../../../core/client/components'
26
27
  import { uncacheView } from '../../utils'
27
28
 
@@ -29,23 +30,34 @@ import { uncacheView } from '../../utils'
29
30
  const router = useRouter()
30
31
  const route = useRoute()
31
32
  const { CurrentActivity } = useCurrentActivity()
32
- const filter = ref(Filter.get())
33
- const sorter = Sorter.get()
34
33
  const projectRenderer = ref({
35
34
  component: 'catalog/KProjectSelector',
36
35
  class: 'col-12'
37
36
  })
37
+ const baseQuery = ref({ $sort: { name: 1 } })
38
+ const searchString = ref('')
38
39
 
39
40
  // Computed
40
- const baseQuery = computed(() => Object.assign({}, sorter.query))
41
+ const filterQuery = computed(() => {
42
+ const query = {}
43
+ if (!_.isEmpty(searchString.value)) {
44
+ query.name = { $regex: searchString.value }
45
+ }
46
+ return query
47
+ })
41
48
  const toolbar = computed(() => {
42
49
  return [
43
50
  {
44
51
  id: 'projects-filter',
45
- component: 'collection/KFilter'
52
+ component: 'collection/KItemsFilter',
53
+ class: 'col',
54
+ value: searchString.value,
55
+ onSearch: (value) => {
56
+ searchString.value = value
57
+ }
46
58
  },
47
59
  {
48
- component: 'collection/KSorter',
60
+ component: 'collection/KItemsSorter',
49
61
  id: 'projects-sorter',
50
62
  tooltip: 'KProjectsPanel.SORT_PROJECTS',
51
63
  options: [
@@ -53,7 +65,10 @@ const toolbar = computed(() => {
53
65
  { icon: 'las la-sort-alpha-up', value: { field: 'name', order: -1 } },
54
66
  { icon: 'kdk:clockwise.png', value: { field: 'updatedAt', order: 1 } },
55
67
  { icon: 'kdk:anticlockwise.png', value: { field: 'updatedAt', order: -1 } }
56
- ]
68
+ ],
69
+ onOptionChanged: (option) => {
70
+ baseQuery.value = { $sort: { [option.field]: option.order } }
71
+ }
57
72
  }
58
73
  ]
59
74
  })
@@ -21,38 +21,45 @@
21
21
  import _ from 'lodash'
22
22
  import logger from 'loglevel'
23
23
  import { ref, computed } from 'vue'
24
- import { Filter, Sorter, utils, i18n, api, LocalCache, Store } from '../../../../core/client'
24
+ import { utils, i18n, api, LocalCache, Store } from '../../../../core/client'
25
25
  import { KGrid } from '../../../../core/client/components'
26
26
  import { useCurrentActivity, useProject } from '../../composables'
27
27
  import { cacheView, uncacheView } from '../../utils/utils.offline.js'
28
28
  import { Dialog, Notify } from 'quasar'
29
29
 
30
30
  // Data
31
- const filter = Filter.get()
32
- const sorter = Sorter.get()
33
31
  const { CurrentActivity } = useCurrentActivity()
34
32
  const { project: loadedProject } = await getProject()
35
33
  const project = ref(loadedProject)
36
34
  const viewRenderer = ref(getViewRenderer())
35
+ const searchString = ref('')
36
+ const sortQuery = ref({ $sort: { name: 1 } })
37
37
 
38
38
  // Computed
39
39
  const baseQuery = computed(() => {
40
- return Object.assign({ type: 'Context' }, sorter.query)
40
+ return Object.assign({ type: 'Context' }, sortQuery.value)
41
41
  })
42
42
  const filterQuery = computed(() => {
43
43
  const query = {}
44
44
  if (project.value) Object.assign(query, { _id: { $in: _.map(project.value.views, '_id') } })
45
- Object.assign(query, filter.query)
45
+ if (!_.isEmpty(searchString.value)) {
46
+ Object.assign(query, { name: { $regex: searchString.value } })
47
+ }
46
48
  return query
47
49
  })
48
50
  const toolbar = computed(() => {
49
51
  return [
50
52
  {
51
53
  id: 'views-filter',
52
- component: 'collection/KFilter'
54
+ component: 'collection/KItemsFilter',
55
+ class: 'col',
56
+ value: searchString.value,
57
+ onSearch: (value) => {
58
+ searchString.value = value
59
+ }
53
60
  },
54
61
  {
55
- component: 'collection/KSorter',
62
+ component: 'collection/KItemsSorter',
56
63
  id: 'views-sorter',
57
64
  tooltip: 'KViewsPanel.SORT_VIEWS',
58
65
  options: [
@@ -60,7 +67,10 @@ const toolbar = computed(() => {
60
67
  { icon: 'las la-sort-alpha-up', value: { field: 'name', order: -1 } },
61
68
  { icon: 'kdk:clockwise.png', value: { field: 'updatedAt', order: 1 } },
62
69
  { icon: 'kdk:anticlockwise.png', value: { field: 'updatedAt', order: -1 } }
63
- ]
70
+ ],
71
+ onOptionChanged: (option) => {
72
+ sortQuery.value = { $sort: { [option.field]: option.order } }
73
+ }
64
74
  }
65
75
  ]
66
76
  })
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div v-if="forecastModels.length > 0">
3
- <k-layers-selector :layers="filteredLayers" :options="options">
3
+ <k-layers-list :layers="filteredLayers" :options="options">
4
4
  <template v-slot:header>
5
5
  <div class="q-ma-sm">
6
6
  <q-select for="forecast-model" id="forecast-model" v-model="model" :options="models" filled map-options emit-value @update:model-value="onModelChanged">
@@ -25,7 +25,7 @@
25
25
  </q-select>
26
26
  </div>
27
27
  </template>
28
- </k-layers-selector>
28
+ </k-layers-list>
29
29
  </div>
30
30
  <div v-else class="row justify-center q-pa-sm">
31
31
  <KStamp icon="las la-exclamation-circle" icon-size="sm" :text="$t('KWeatherLayersSelector.NO_MODEL_AVAILABLE')" text-size="0.9rem" direction="horizontal" />
@@ -36,7 +36,7 @@
36
36
  import _ from 'lodash'
37
37
  import { computed, ref } from 'vue'
38
38
  import { KStamp } from '../../../../core/client/components'
39
- import KLayersSelector from './KLayersSelector.vue'
39
+ import KLayersList from './KLayersList.vue'
40
40
 
41
41
  // Props
42
42
  const props = defineProps({
@@ -64,7 +64,7 @@
64
64
  :error-message="errorLabel"
65
65
  :error="hasError"
66
66
  :disable="disabled"
67
- :clearable="clearable"
67
+ :clearable="isClearable()"
68
68
  bottom-slots
69
69
  borderless
70
70
  @clear="onCleared">
@@ -111,14 +111,11 @@ export default {
111
111
  },
112
112
  labelMode () {
113
113
  return _.get(this.properties.field, 'labelMode', 'from')
114
- },
115
- clearable () {
116
- return _.get(this.properties.field, 'clearable', false)
117
114
  }
118
115
  },
119
116
  methods: {
120
- emptyModel () {
121
- return null
117
+ isClearable () {
118
+ return _.get(this.properties.field, 'clearable', false)
122
119
  },
123
120
  onCleared () {
124
121
  this.model = null
@@ -32,7 +32,7 @@
32
32
  </template>
33
33
 
34
34
  <script>
35
- import { mixins as kCoreMixins } from '../../../../core/client'
35
+ import { api, mixins as kCoreMixins } from '../../../../core/client'
36
36
 
37
37
  export default {
38
38
  name: 'k-category-field',
@@ -49,7 +49,7 @@ export default {
49
49
  },
50
50
  async created () {
51
51
  // Build the list of available categories
52
- const response = await this.$api.getService('catalog').find({ query: { type: 'Category' } })
52
+ const response = await api.getService('catalog').find({ query: { type: 'Category' } })
53
53
  this.availableCategories = response.data
54
54
  }
55
55
  }
@@ -55,7 +55,7 @@
55
55
  </template>
56
56
  </q-select>
57
57
  <!-- Header -->
58
- <div class="row" v-if="showHeader">
58
+ <div class="row" v-if="unhautorized">
59
59
  <q-input class="col"
60
60
  :for="properties.name + '-header-key-field'"
61
61
  :id="properties.name + '-header-key-field'"
@@ -80,9 +80,8 @@
80
80
 
81
81
  <script>
82
82
  import _ from 'lodash'
83
- import fetch from 'node-fetch'
84
83
  import xml2js from 'xml2js'
85
- import { mixins as kCoreMixins } from '../../../../core/client'
84
+ import { api, mixins as kCoreMixins } from '../../../../core/client'
86
85
  import { KAction } from '../../../../core/client/components'
87
86
  import * as wms from '../../../common/wms-utils'
88
87
  import * as wfs from '../../../common/wfs-utils'
@@ -99,7 +98,7 @@ export default {
99
98
  return {
100
99
  request: '',
101
100
  availableServices: [],
102
- showHeader: false,
101
+ unhautorized: false,
103
102
  headerKey: '',
104
103
  headerValue: '',
105
104
  loading: false
@@ -127,38 +126,37 @@ export default {
127
126
  let response = null
128
127
  this.loading = true
129
128
  if (request) {
130
- try {
131
- // Check if related to registered service in cas we need headers
132
- const service = _.find(this.availableServices, { request })
133
- const url = new URL(request)
134
- response = await this.probeEndpoint(url, _.get(service, 'headers', {}))
135
- if (response) {
136
- // make sure WFS server supports GeoJSON output
137
- if (response.protocol === 'WFS' && !response.geoJsonOutputFormat) {
138
- this.error = 'KOwsServiceField.WFS_MISSING_GEOJSON_SUPPORT'
139
- } else {
140
- this.model = response
141
- this.error = ''
142
- }
129
+ // Check if related to registered service in case we need headers
130
+ const service = _.find(this.availableServices, { request })
131
+ const url = new URL(request)
132
+ response = await this.probeEndpoint(url, _.get(service, 'headers', {}))
133
+ if (response) {
134
+ // make sure WFS server supports GeoJSON output
135
+ if (response.protocol === 'WFS' && !response.geoJsonOutputFormat) {
136
+ this.error = 'KOwsServiceField.WFS_MISSING_GEOJSON_SUPPORT'
137
+ } else {
138
+ this.model = response
139
+ this.error = ''
143
140
  }
144
- } catch (error) {
145
- this.error = 'KOwsServiceField.INVALID_URL'
141
+ } else if (this.unhautorized) {
142
+ // Remove any previous headers as token might have expired or so
143
+ _.unset(service, 'headers')
146
144
  }
147
145
  }
148
146
  this.loading = false
149
- if (this.model) this.onChanged()
147
+ if (this.model && !this.error) this.onChanged()
150
148
  },
151
149
  async onAddService () {
152
150
  // Delete the available layers before saving the service
153
151
  const service = _.cloneDeep(this.model)
154
152
  delete service.availableLayers
155
153
  // Save the service
156
- await this.$api.getService('catalog').create(service)
154
+ await api.getService('catalog').create(service)
157
155
  // Refresh the list of available services
158
156
  this.refreshAvailableServices()
159
157
  },
160
158
  async onDeleteService (service) {
161
- await this.$api.getService('catalog').remove(service._id)
159
+ await api.getService('catalog').remove(service._id)
162
160
  // Refresh the list of available services
163
161
  this.refreshAvailableServices()
164
162
  // Clear
@@ -197,9 +195,11 @@ export default {
197
195
  }
198
196
  const resp = await fetch(query, { redirect: 'follow', headers: result.headers })
199
197
  if ((resp.status === 401) || (resp.status === 403)) {
200
- this.showHeader = true
198
+ this.unhautorized = true
201
199
  this.error = 'KOwsServiceField.UNAUTHORIZED_MESSAGE'
202
200
  return null
201
+ } else {
202
+ this.unhautorized = false
203
203
  }
204
204
  const txt = await resp.text()
205
205
  caps = await xml2js.parseStringPromise(txt, { tagNameProcessors: [xml2js.processors.stripPrefix] })
@@ -241,6 +241,7 @@ export default {
241
241
  result.availableLayers = decoded.availableLayers
242
242
  result.version = this.findQueryParameter(url.searchParams, 'VERSION')
243
243
  if (!result.version) result.version = decoded.version
244
+ if (decoded.getMapUrl) result.getMapUrl = decoded.getMapUrl
244
245
  } else if (result.protocol === 'WFS') {
245
246
  const decoded = await wfs.discover(result.baseUrl, result.searchParams, result.headers, caps)
246
247
  result.availableLayers = decoded.availableLayers
@@ -275,7 +276,7 @@ export default {
275
276
  },
276
277
  async refreshAvailableServices () {
277
278
  // Retrieve the list of the available services
278
- const response = await this.$api.getService('catalog').find({ query: { type: 'Service' } })
279
+ const response = await api.getService('catalog').find({ query: { type: 'Service' } })
279
280
  this.availableServices = response.data
280
281
  }
281
282
  },
@@ -7,7 +7,7 @@
7
7
  :error-message="errorLabel"
8
8
  :error="hasError"
9
9
  :disable="disabled"
10
- :clearable="clearable"
10
+ :clearable="isClearable()"
11
11
  hide-bottom-space
12
12
  bottom-slots
13
13
  borderless
@@ -54,9 +54,6 @@ export default {
54
54
  },
55
55
  inheritAttrs: false,
56
56
  computed: {
57
- clearable () {
58
- return _.get(this.properties.field, 'clearable', false)
59
- },
60
57
  layerTree () {
61
58
  const tree = []
62
59
  const userLayers = { id: 'userLayers', label: this.$t('LAYERS_LABEL'), layers: [] }
@@ -102,6 +99,9 @@ export default {
102
99
  emptyModel () {
103
100
  return []
104
101
  },
102
+ isClearable () {
103
+ return _.get(this.properties.field, 'clearable', false)
104
+ },
105
105
  fill (value) {
106
106
  kCoreMixins.baseField.methods.fill.call(this, value)
107
107
  // As we keep track of ID/name depending on if a layer comes from local/global catalog we need to process both
@@ -7,7 +7,7 @@
7
7
  :error-message="errorLabel"
8
8
  :error="hasError"
9
9
  :disable="disabled"
10
- :clearable="clearable"
10
+ :clearable="isClearable()"
11
11
  hide-bottom-space
12
12
  bottom-slots
13
13
  borderless
@@ -63,9 +63,6 @@ export default {
63
63
  },
64
64
  inheritAttrs: false,
65
65
  computed: {
66
- clearable () {
67
- return _.get(this.properties.field, 'clearable', false)
68
- },
69
66
  viewTree () {
70
67
  const tree = []
71
68
  if (this.views.length > 0) {
@@ -86,6 +83,9 @@ export default {
86
83
  emptyModel () {
87
84
  return []
88
85
  },
86
+ isClearable () {
87
+ return _.get(this.properties.field, 'clearable', false)
88
+ },
89
89
  fill (value) {
90
90
  kCoreMixins.baseField.methods.fill.call(this, value)
91
91
  this.selectedViews = _.map(this.model, '_id')
@@ -42,6 +42,15 @@ const legends = computed(() => {
42
42
  const result = []
43
43
  let layerLegends = props.layer.legend || []
44
44
  if (!Array.isArray(layerLegends)) layerLegends = [layerLegends]
45
+ // Check if layer has filters with own legend
46
+ if (Array.isArray(props.layer.filters)) {
47
+ props.layer.filters.forEach((filter) => {
48
+ // Include when filter is active and has a legend
49
+ if (!filter.isActive || !filter.legend) { return }
50
+ const filterLegends = Array.isArray(filter.legend) ? filter.legend : [filter.legend]
51
+ layerLegends.push(...filterLegends)
52
+ })
53
+ }
45
54
  layerLegends.forEach(legend => {
46
55
  const minZoom = _.get(legend, 'minZoom', _.get(props.layer, `${props.engine}.minZoom`, 0))
47
56
  const maxZoom = _.get(legend, 'maxZoom', _.get(props.layer, `${props.engine}.maxZoom`, 99))
@@ -50,9 +59,9 @@ const legends = computed(() => {
50
59
  const hasMinZoom = _.isNumber(minZoom)
51
60
  const hasMaxZoom = _.isNumber(maxZoom)
52
61
  const inMinZoomRange = (hasMinZoom ? props.zoom >= minZoom : true)
53
- const inMaxZoomRange = (hasMaxZoom ? props.zoom <= maxZoom : true)
62
+ const inMaxZoomRange = (hasMaxZoom ? props.zoom < maxZoom : true)
54
63
  if (inMinZoomRange && inMaxZoomRange) {
55
- logger.debug(`[KDK] Register '${props.layer.name}'`)
64
+ logger.debug(`[KDK] Rendering '${props.layer.name}' legend`)
56
65
  const renderer = props.renderers[legend.type]
57
66
  if (!renderer) {
58
67
  logger.warn(`[KDK] Cannot find any renderer for the layer's legend of type of ${legend.type}`)