@kalisio/kdk 2.4.1 → 2.5.2

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 (638) hide show
  1. package/core/api/application.js +12 -12
  2. package/core/api/authentication.js +51 -7
  3. package/core/api/hooks/hooks.authentication.js +1 -59
  4. package/core/api/hooks/hooks.authorisations.js +9 -104
  5. package/core/api/hooks/hooks.model.js +4 -0
  6. package/core/api/hooks/hooks.push.js +18 -14
  7. package/core/api/hooks/hooks.users.js +0 -91
  8. package/core/api/hooks/index.js +0 -2
  9. package/core/api/services/account/account.service.js +1 -1
  10. package/core/api/services/authorisations/authorisations.service.js +28 -31
  11. package/core/api/services/index.js +42 -50
  12. package/core/api/services/messages/messages.hooks.js +4 -3
  13. package/core/api/services/users/users.hooks.js +4 -3
  14. package/core/api/services/users/users.service.js +5 -0
  15. package/core/client/api.js +182 -71
  16. package/core/client/broadcaster.js +20 -0
  17. package/core/client/capabilities.js +17 -7
  18. package/core/client/components/KActivity.vue +29 -34
  19. package/core/client/components/KAvatar.vue +0 -6
  20. package/core/client/components/KChip.vue +142 -39
  21. package/core/client/components/KContent.vue +13 -32
  22. package/core/client/components/KDialog.vue +29 -8
  23. package/core/client/components/KEditor.vue +120 -0
  24. package/core/client/components/KFollower.vue +75 -0
  25. package/core/client/components/KLogo.vue +2 -3
  26. package/core/client/components/KModal.vue +30 -10
  27. package/core/client/components/KSponsor.vue +1 -1
  28. package/core/client/components/KTextArea.vue +2 -5
  29. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  30. package/core/client/components/account/KProfile.vue +52 -14
  31. package/core/client/components/account/KSubscription.vue +19 -9
  32. package/core/client/components/account/KSubscriptionsManager.vue +10 -11
  33. package/core/client/components/action/KAction.vue +44 -24
  34. package/core/client/components/action/KBugReportAction.vue +4 -5
  35. package/core/client/components/action/KToggleStickyVisibility.vue +41 -0
  36. package/core/client/components/action/KToggleWidgetVisibility.vue +41 -0
  37. package/core/client/components/app/KPlatform.vue +122 -35
  38. package/core/client/components/app/KRequestProgressBar.vue +59 -0
  39. package/core/client/components/app/KSettings.vue +13 -2
  40. package/core/client/components/app/KTour.vue +2 -2
  41. package/core/client/components/chart/KTimeSeriesChart.vue +11 -3
  42. package/core/client/components/collection/KCard.vue +27 -33
  43. package/core/client/components/collection/KCardSection.vue +3 -23
  44. package/core/client/components/collection/KColumn.vue +0 -5
  45. package/core/client/components/collection/KDescriptionCardSection.vue +10 -5
  46. package/core/client/components/collection/KFilterView.vue +15 -0
  47. package/core/client/components/collection/KGrid.vue +4 -9
  48. package/core/client/components/collection/KHistory.vue +0 -5
  49. package/core/client/components/collection/KHistoryEntry.vue +0 -2
  50. package/core/client/components/collection/KItem.vue +1 -2
  51. package/core/client/components/collection/KSearchFilterControl.vue +139 -0
  52. package/core/client/components/collection/KTable.vue +1 -4
  53. package/core/client/components/collection/KTagsFilterControl.vue +70 -0
  54. package/core/client/components/collection/KTagsFilterView.vue +61 -0
  55. package/core/client/components/collection/KTimeFilterControl.vue +40 -0
  56. package/core/client/components/collection/KTimeFilterView.vue +106 -0
  57. package/core/client/components/collection/KTimeLine.vue +18 -11
  58. package/core/client/components/document/KBrowser.vue +283 -0
  59. package/core/client/components/document/KCsv.vue +52 -0
  60. package/core/client/components/document/KDocument.vue +19 -5
  61. package/core/client/components/document/KImage.vue +50 -19
  62. package/core/client/components/document/KMarkdown.vue +10 -2
  63. package/core/client/components/document/KUploader.vue +126 -0
  64. package/core/client/components/document/KVideo.vue +39 -0
  65. package/core/client/components/form/KDateField.vue +70 -0
  66. package/core/client/components/form/KDateTimeRangeField.vue +6 -17
  67. package/core/client/components/form/KDatetimeField.vue +6 -13
  68. package/core/client/components/form/KForm.vue +8 -8
  69. package/core/client/components/form/KOptionsField.vue +2 -0
  70. package/core/client/components/form/KResolutionField.vue +54 -52
  71. package/core/client/components/form/KSelectField.vue +27 -13
  72. package/core/client/components/form/KTextareaField.vue +23 -5
  73. package/core/client/components/graphics/KIcon.vue +64 -0
  74. package/core/client/components/index.js +1 -3
  75. package/core/client/components/input/KColorPicker.vue +70 -0
  76. package/core/client/components/input/KIconPicker.vue +188 -0
  77. package/core/client/components/input/KShapePicker.vue +81 -0
  78. package/core/client/components/input/index.js +7 -1
  79. package/core/client/components/layout/KFab.vue +1 -1
  80. package/core/client/components/layout/KLayout.vue +14 -2
  81. package/core/client/components/layout/KOpener.vue +9 -11
  82. package/core/client/components/layout/KPage.vue +31 -17
  83. package/core/client/components/layout/KWindow.vue +34 -18
  84. package/core/client/components/menu/KMenu.vue +52 -36
  85. package/core/client/components/menu/KSubMenu.vue +105 -0
  86. package/core/client/components/messages/KMessageCard.vue +207 -0
  87. package/core/client/components/messages/KMessageComposer.vue +199 -0
  88. package/core/client/components/messages/KMessagesTimeLine.vue +137 -0
  89. package/core/client/components/messages/index.js +7 -0
  90. package/core/client/components/screen/KErrorScreen.vue +2 -3
  91. package/core/client/components/screen/KLogoutScreen.vue +3 -1
  92. package/core/client/components/screen/KOAuthLoginScreen.vue +15 -0
  93. package/core/client/components/screen/KOAuthLogoutScreen.vue +33 -0
  94. package/core/client/components/screen/KUnauthorizedScreen.vue +16 -0
  95. package/core/client/components/time/KAbsoluteTimeRange.vue +7 -14
  96. package/core/client/components/time/KDate.vue +55 -28
  97. package/core/client/components/time/KDateTime.vue +93 -37
  98. package/core/client/components/time/KDateTimeRange.vue +197 -52
  99. package/core/client/components/time/KTime.vue +55 -27
  100. package/core/client/composables/activity.js +40 -30
  101. package/core/client/composables/{counter.js → collection-counter.js} +2 -4
  102. package/core/client/composables/collection-filter.js +111 -0
  103. package/core/client/composables/collection-timerange.js +56 -0
  104. package/core/client/composables/collection.js +13 -11
  105. package/core/client/composables/context.js +92 -0
  106. package/core/client/composables/errors.js +83 -0
  107. package/core/client/composables/index.js +5 -1
  108. package/core/client/composables/layout.js +14 -11
  109. package/core/client/composables/messages.js +4 -4
  110. package/core/client/composables/pwa.js +20 -27
  111. package/core/client/composables/schema.js +1 -1
  112. package/core/client/composables/screen.js +21 -9
  113. package/core/client/composables/selection.js +16 -4
  114. package/core/client/composables/session.js +13 -7
  115. package/core/client/composables/store.js +2 -1
  116. package/core/client/context.js +38 -0
  117. package/core/client/directives/v-hover.js +7 -4
  118. package/core/client/document.js +43 -15
  119. package/core/client/events.js +2 -2
  120. package/core/client/exporter.js +5 -4
  121. package/core/client/filter.js +1 -8
  122. package/core/client/guards.js +3 -3
  123. package/core/client/hooks/hooks.logger.js +1 -1
  124. package/core/client/hooks/hooks.offline.js +32 -0
  125. package/core/client/hooks/index.js +2 -1
  126. package/core/client/i18n/core_en.json +95 -268
  127. package/core/client/i18n/core_fr.json +181 -353
  128. package/core/client/index.js +22 -8
  129. package/core/client/layout.js +64 -25
  130. package/core/client/local-cache.js +67 -0
  131. package/core/client/local-storage.js +6 -2
  132. package/core/client/mixins/index.js +0 -1
  133. package/core/client/mixins/mixin.base-activity.js +22 -10
  134. package/core/client/mixins/mixin.base-editor.js +1 -1
  135. package/core/client/mixins/mixin.base-field.js +10 -1
  136. package/core/client/mixins/mixin.base-item.js +14 -11
  137. package/core/client/mixins/mixin.service.js +1 -5
  138. package/core/client/platform.js +44 -0
  139. package/core/client/readers/reader.blob.js +3 -3
  140. package/core/client/readers/reader.csv.js +2 -2
  141. package/core/client/readers/reader.json.js +2 -2
  142. package/core/client/services/index.js +7 -11
  143. package/core/client/storage.js +43 -8
  144. package/core/client/template-context.js +14 -14
  145. package/core/client/time.js +2 -2
  146. package/core/client/units.js +7 -4
  147. package/core/client/utils/index.js +7 -5
  148. package/core/client/utils/utils.collection.js +71 -0
  149. package/core/client/utils/utils.colors.js +29 -8
  150. package/core/client/utils/utils.content.js +14 -14
  151. package/core/client/utils/utils.files.js +17 -0
  152. package/core/client/utils/utils.items.js +4 -0
  153. package/core/client/utils/utils.math.js +18 -1
  154. package/core/client/utils/utils.push.js +22 -13
  155. package/core/client/utils/utils.screen.js +6 -2
  156. package/core/client/utils/utils.services.js +42 -0
  157. package/core/client/utils/utils.session.js +48 -12
  158. package/core/client/utils/utils.shapes.js +15 -11
  159. package/core/common/permissions.js +3 -108
  160. package/core/common/schemas/messages.update.json +16 -0
  161. package/core/common/schemas/settings.update.json +27 -8
  162. package/core/common/utils.js +2 -0
  163. package/core/common/utils.offline.js +38 -0
  164. package/coverage/core/api/application.js.html +296 -296
  165. package/coverage/core/api/authentication.js.html +206 -74
  166. package/coverage/core/api/db.js.html +61 -61
  167. package/coverage/core/api/hooks/hooks.authentication.js.html +15 -189
  168. package/coverage/core/api/hooks/hooks.authorisations.js.html +172 -460
  169. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  170. package/coverage/core/api/hooks/hooks.logger.js.html +16 -16
  171. package/coverage/core/api/hooks/hooks.model.js.html +52 -52
  172. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  173. package/coverage/core/api/hooks/hooks.push.js.html +58 -46
  174. package/coverage/core/api/hooks/hooks.query.js.html +136 -136
  175. package/coverage/core/api/hooks/hooks.schemas.js.html +1 -1
  176. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  177. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  178. package/coverage/core/api/hooks/hooks.users.js.html +55 -328
  179. package/coverage/core/api/hooks/index.html +58 -88
  180. package/coverage/core/api/hooks/index.js.html +4 -10
  181. package/coverage/core/api/index.html +39 -54
  182. package/coverage/core/api/index.js.html +1 -1
  183. package/coverage/core/api/marshall.js.html +1 -1
  184. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  185. package/coverage/core/api/models/index.html +13 -58
  186. package/coverage/core/api/models/messages.model.mongodb.js.html +35 -35
  187. package/coverage/core/api/models/organisations.model.mongodb.js.html +3 -3
  188. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  189. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  190. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  191. package/coverage/core/api/services/account/account.service.js.html +67 -67
  192. package/coverage/core/api/services/account/index.html +16 -16
  193. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  194. package/coverage/core/api/services/authorisations/authorisations.service.js.html +120 -117
  195. package/coverage/core/api/services/authorisations/index.html +15 -15
  196. package/coverage/core/api/services/databases/databases.hooks.js.html +82 -82
  197. package/coverage/core/api/services/databases/databases.service.js.html +20 -20
  198. package/coverage/core/api/services/databases/index.html +32 -32
  199. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  200. package/coverage/core/api/services/groups/index.html +1 -1
  201. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  202. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  203. package/coverage/core/api/services/import-export/index.html +1 -1
  204. package/coverage/core/api/services/index.html +21 -21
  205. package/coverage/core/api/services/index.js.html +118 -154
  206. package/coverage/core/api/services/mailer/index.html +1 -1
  207. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  208. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  209. package/coverage/core/api/services/messages/index.html +21 -21
  210. package/coverage/core/api/services/messages/messages.hooks.js.html +86 -86
  211. package/coverage/core/api/services/organisations/index.html +1 -1
  212. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  213. package/coverage/core/api/services/organisations/organisations.service.js.html +23 -23
  214. package/coverage/core/api/services/push/index.html +1 -1
  215. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  216. package/coverage/core/api/services/push/push.service.js.html +1 -1
  217. package/coverage/core/api/services/storage/index.html +5 -5
  218. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  219. package/coverage/core/api/services/storage/storage.service.js.html +27 -27
  220. package/coverage/core/api/services/tags/index.html +1 -1
  221. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  222. package/coverage/core/api/services/users/index.html +23 -8
  223. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  224. package/coverage/core/api/services/users/users.service.js.html +100 -0
  225. package/coverage/core/api/utils.js.html +1 -1
  226. package/coverage/core/common/errors.js.html +1 -1
  227. package/coverage/core/common/index.html +42 -27
  228. package/coverage/core/common/index.js.html +1 -1
  229. package/coverage/core/common/permissions.js.html +195 -510
  230. package/coverage/core/common/schema.js.html +1 -1
  231. package/coverage/core/common/utils.js.html +12 -6
  232. package/coverage/core/common/utils.offline.js.html +199 -0
  233. package/coverage/index.html +121 -166
  234. package/coverage/lcov-report/core/api/application.js.html +296 -296
  235. package/coverage/lcov-report/core/api/authentication.js.html +206 -74
  236. package/coverage/lcov-report/core/api/db.js.html +61 -61
  237. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +15 -189
  238. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +172 -460
  239. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  240. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +16 -16
  241. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +52 -52
  242. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  243. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +58 -46
  244. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +136 -136
  245. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +1 -1
  246. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  247. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  248. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +55 -328
  249. package/coverage/lcov-report/core/api/hooks/index.html +58 -88
  250. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  251. package/coverage/lcov-report/core/api/index.html +39 -54
  252. package/coverage/lcov-report/core/api/index.js.html +1 -1
  253. package/coverage/lcov-report/core/api/marshall.js.html +1 -1
  254. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  255. package/coverage/lcov-report/core/api/models/index.html +13 -58
  256. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +35 -35
  257. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +3 -3
  258. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  259. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  260. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  261. package/coverage/lcov-report/core/api/services/account/account.service.js.html +67 -67
  262. package/coverage/lcov-report/core/api/services/account/index.html +16 -16
  263. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  264. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +120 -117
  265. package/coverage/lcov-report/core/api/services/authorisations/index.html +15 -15
  266. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +82 -82
  267. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +20 -20
  268. package/coverage/lcov-report/core/api/services/databases/index.html +32 -32
  269. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  270. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  271. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  272. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  273. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  274. package/coverage/lcov-report/core/api/services/index.html +21 -21
  275. package/coverage/lcov-report/core/api/services/index.js.html +118 -154
  276. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  277. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  278. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  279. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  280. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +86 -86
  281. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  282. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  283. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +23 -23
  284. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  285. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  286. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  287. package/coverage/lcov-report/core/api/services/storage/index.html +5 -5
  288. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  289. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +27 -27
  290. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  291. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  292. package/coverage/lcov-report/core/api/services/users/index.html +23 -8
  293. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  294. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  295. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  296. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  297. package/coverage/lcov-report/core/common/index.html +42 -27
  298. package/coverage/lcov-report/core/common/index.js.html +1 -1
  299. package/coverage/lcov-report/core/common/permissions.js.html +195 -510
  300. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  301. package/coverage/lcov-report/core/common/utils.js.html +12 -6
  302. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  303. package/coverage/lcov-report/index.html +121 -166
  304. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +33 -27
  305. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  306. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +4 -4
  307. package/coverage/lcov-report/map/api/hooks/index.html +5 -5
  308. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  309. package/coverage/lcov-report/map/api/index.html +1 -1
  310. package/coverage/lcov-report/map/api/index.js.html +1 -1
  311. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  312. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  313. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  314. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  315. package/coverage/lcov-report/map/api/models/index.html +1 -1
  316. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  317. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  318. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  319. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  320. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +10 -7
  321. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  322. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  323. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  324. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +78 -9
  325. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  326. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  327. package/coverage/lcov-report/map/api/services/index.html +5 -5
  328. package/coverage/lcov-report/map/api/services/index.js.html +171 -42
  329. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  330. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  331. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  332. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  333. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +8 -5
  334. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  335. package/coverage/lcov-report/map/common/index.html +5 -5
  336. package/coverage/lcov-report/map/common/index.js.html +1 -1
  337. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  338. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  339. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  340. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  341. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  342. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  343. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  344. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  345. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  346. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  347. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  348. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  349. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  350. package/coverage/lcov.info +2314 -3167
  351. package/coverage/map/api/hooks/hooks.catalog.js.html +33 -27
  352. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  353. package/coverage/map/api/hooks/hooks.query.js.html +4 -4
  354. package/coverage/map/api/hooks/index.html +5 -5
  355. package/coverage/map/api/hooks/index.js.html +1 -1
  356. package/coverage/map/api/index.html +1 -1
  357. package/coverage/map/api/index.js.html +1 -1
  358. package/coverage/map/api/marshall.js.html +1 -1
  359. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  360. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  361. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  362. package/coverage/map/api/models/index.html +1 -1
  363. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  364. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  365. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  366. package/coverage/map/api/services/alerts/index.html +1 -1
  367. package/coverage/map/api/services/catalog/catalog.hooks.js.html +10 -7
  368. package/coverage/map/api/services/catalog/index.html +5 -5
  369. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  370. package/coverage/map/api/services/daptiles/index.html +1 -1
  371. package/coverage/map/api/services/features/features.hooks.js.html +78 -9
  372. package/coverage/map/api/services/features/features.service.js.html +307 -4
  373. package/coverage/map/api/services/features/index.html +7 -7
  374. package/coverage/map/api/services/index.html +5 -5
  375. package/coverage/map/api/services/index.js.html +171 -42
  376. package/coverage/map/api/services/projects/index.html +1 -1
  377. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  378. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  379. package/coverage/map/common/errors.js.html +1 -1
  380. package/coverage/map/common/geotiff-grid-source.js.html +8 -5
  381. package/coverage/map/common/grid.js.html +1 -1
  382. package/coverage/map/common/index.html +5 -5
  383. package/coverage/map/common/index.js.html +1 -1
  384. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  385. package/coverage/map/common/moment-utils.js.html +1 -1
  386. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  387. package/coverage/map/common/opendap-utils.js.html +1 -1
  388. package/coverage/map/common/permissions.js.html +1 -1
  389. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  390. package/coverage/map/common/tms-utils.js.html +1 -1
  391. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  392. package/coverage/map/common/wcs-utils.js.html +1 -1
  393. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  394. package/coverage/map/common/wfs-utils.js.html +1 -1
  395. package/coverage/map/common/wms-utils.js.html +1 -1
  396. package/coverage/map/common/wmts-utils.js.html +1 -1
  397. package/coverage/tmp/{coverage-280506-1731704745613-0.json → coverage-122123-1739872365211-0.json} +1 -1
  398. package/coverage/tmp/{coverage-280518-1731704745599-0.json → coverage-122135-1739872365196-0.json} +1 -1
  399. package/coverage/tmp/{coverage-280529-1731704745588-0.json → coverage-122146-1739872365184-0.json} +1 -1
  400. package/coverage/tmp/{coverage-280541-1731704745574-0.json → coverage-122158-1739872365169-0.json} +1 -1
  401. package/coverage/tmp/{coverage-280548-1731704745545-0.json → coverage-122165-1739872365141-0.json} +1 -1
  402. package/extras/configs/helpers.js +78 -0
  403. package/extras/configs/panes.left.js +118 -0
  404. package/extras/configs/panes.top.js +222 -0
  405. package/extras/configs/stickies.js +57 -0
  406. package/extras/configs/widgets.left.js +23 -0
  407. package/extras/configs/widgets.top.js +73 -0
  408. package/extras/css/core.variables.scss +8 -0
  409. package/extras/images/north.svg +3 -0
  410. package/extras/tours/map/side-nav.js +3 -3
  411. package/map/api/hooks/hooks.catalog.js +56 -23
  412. package/map/api/hooks/hooks.query.js +19 -24
  413. package/map/api/models/catalog.model.mongodb.js +16 -2
  414. package/{core/api/models/groups.model.mongodb.js → map/api/models/styles.model.mongodb.js} +2 -1
  415. package/map/api/services/catalog/catalog.hooks.js +13 -7
  416. package/map/api/services/features/features.hooks.js +28 -5
  417. package/map/api/services/features/features.service.js +101 -0
  418. package/map/api/services/index.js +125 -46
  419. package/map/api/services/styles/styles.hooks.js +37 -0
  420. package/map/client/cesium/utils/index.js +1 -0
  421. package/map/client/cesium/utils/utils.cesium.js +397 -0
  422. package/map/client/cesium/utils/utils.features.js +8 -0
  423. package/map/client/cesium/utils/utils.geojson.js +59 -0
  424. package/map/client/cesium/utils/utils.style.js +134 -17
  425. package/map/client/components/KEditLayerData.vue +17 -79
  426. package/map/client/components/KFeatureEditor.vue +2 -7
  427. package/map/client/components/KFeaturesChart.vue +2 -6
  428. package/map/client/components/KFeaturesFilterEditor.vue +300 -0
  429. package/map/client/components/KFeaturesFilterManager.vue +196 -0
  430. package/map/client/components/KFeaturesTable.vue +0 -5
  431. package/map/client/components/KFilterCondition.vue +303 -0
  432. package/map/client/components/KLayerEditionToolbar.vue +4 -3
  433. package/map/client/components/KLayerEditor.vue +451 -36
  434. package/map/client/components/KMeasureTool.vue +36 -9
  435. package/map/client/components/KProjectMenu.vue +14 -8
  436. package/map/client/components/catalog/KAddLayer.vue +0 -4
  437. package/map/client/components/catalog/KBaseLayersSelector.vue +42 -46
  438. package/map/client/components/catalog/KConnectLayer.vue +295 -291
  439. package/map/client/components/catalog/KCreateLayer.vue +141 -146
  440. package/map/client/components/catalog/KCreateOfflineView.vue +100 -0
  441. package/map/client/components/catalog/KCreateView.vue +2 -8
  442. package/map/client/components/catalog/KFilteredLayerItem.vue +72 -25
  443. package/map/client/components/catalog/KImportLayer.vue +121 -129
  444. package/map/client/components/catalog/KLayerItem.vue +44 -32
  445. package/map/client/components/catalog/KLayersPanel.vue +45 -17
  446. package/map/client/components/catalog/KLayersSelector.vue +51 -50
  447. package/map/client/components/catalog/KProjectManager.vue +4 -8
  448. package/map/client/components/catalog/KProjectSelector.vue +33 -2
  449. package/map/client/components/catalog/KProjectsPanel.vue +84 -106
  450. package/map/client/components/catalog/KSelectLayers.vue +56 -69
  451. package/map/client/components/catalog/KSelectViews.vue +56 -69
  452. package/map/client/components/catalog/KViewSelector.vue +32 -2
  453. package/map/client/components/catalog/KViewsPanel.vue +178 -110
  454. package/map/client/components/catalog/KWeatherLayersSelector.vue +77 -85
  455. package/map/client/components/form/KLocationField.vue +21 -2
  456. package/map/client/components/form/KOwsLayerField.vue +1 -1
  457. package/map/client/components/form/KOwsServiceField.vue +102 -63
  458. package/map/client/components/form/KSelectLayersField.vue +1 -1
  459. package/map/client/components/form/KSelectViewsField.vue +1 -1
  460. package/map/client/components/form/KTimezoneField.vue +0 -1
  461. package/map/client/components/legend/KLegend.vue +4 -4
  462. package/map/client/components/location/KLocationCardSection.vue +16 -0
  463. package/map/client/components/location/KLocationMap.vue +3 -2
  464. package/map/client/components/location/KLocationSearch.vue +46 -8
  465. package/map/client/components/location/KLocationTimeLineCard.vue +25 -3
  466. package/map/client/components/location/KLocationTip.vue +57 -10
  467. package/map/client/components/selection/KFeaturesSelection.vue +71 -0
  468. package/map/client/components/selection/KSelectedLayerFeatures.vue +343 -0
  469. package/map/client/components/stickies/KAttribution.vue +115 -0
  470. package/map/client/components/stickies/KLevelSlider.vue +114 -0
  471. package/map/client/components/stickies/KNorthArrow.vue +26 -0
  472. package/map/client/components/stickies/KPosition.vue +103 -0
  473. package/map/client/components/stickies/KTarget.vue +34 -0
  474. package/map/client/components/styles/KLayerStyleAction.vue +58 -0
  475. package/map/client/components/styles/KStyleEditor.vue +273 -0
  476. package/map/client/components/styles/KStyleEditorSection.vue +79 -0
  477. package/map/client/components/styles/KStyleManager.vue +183 -0
  478. package/map/client/components/styles/KStylePreview.vue +64 -0
  479. package/map/client/components/styles/KStylePreviewItem.vue +68 -0
  480. package/map/client/components/styles/KStylePropertiesGroup.vue +76 -0
  481. package/map/client/components/styles/KStyleProperty.vue +136 -0
  482. package/map/client/components/styles/KStyleTip.vue +118 -0
  483. package/map/client/components/tools/KGeolocateTool.vue +3 -2
  484. package/map/client/components/tools/KSearchTool.vue +34 -6
  485. package/map/client/components/widget/KMapillaryViewer.vue +1 -1
  486. package/map/client/components/widget/KStackableTimeSeries.vue +8 -5
  487. package/map/client/composables/activity.js +29 -43
  488. package/map/client/composables/catalog.js +1 -1
  489. package/map/client/composables/highlight.js +117 -57
  490. package/map/client/composables/location.js +33 -14
  491. package/map/client/composables/project.js +9 -10
  492. package/map/client/composables/selection.js +136 -23
  493. package/map/client/geocoder.js +104 -0
  494. package/map/client/geolocation.js +1 -1
  495. package/map/client/globe.js +3 -0
  496. package/map/client/hooks/hooks.offline.js +95 -0
  497. package/map/client/hooks/index.js +1 -0
  498. package/map/client/i18n/map_en.json +159 -94
  499. package/map/client/i18n/map_fr.json +187 -128
  500. package/map/client/index.js +3 -0
  501. package/map/client/init.js +44 -8
  502. package/map/client/leaflet/BoxSelection.js +2 -2
  503. package/map/client/leaflet/GradientPath.js +84 -4
  504. package/map/client/leaflet/WindBarb.js +323 -0
  505. package/map/client/leaflet/utils/index.js +1 -0
  506. package/map/client/leaflet/utils/utils.events.js +8 -3
  507. package/map/client/leaflet/utils/utils.geojson.js +222 -0
  508. package/map/client/leaflet/utils/utils.style.js +10 -9
  509. package/map/client/map.js +3 -0
  510. package/map/client/mixins/globe/mixin.base-globe.js +151 -19
  511. package/map/client/mixins/globe/mixin.geojson-layers.js +208 -86
  512. package/map/client/mixins/globe/mixin.popup.js +3 -2
  513. package/map/client/mixins/globe/mixin.style.js +3 -1
  514. package/map/client/mixins/globe/mixin.tooltip.js +3 -2
  515. package/map/client/mixins/map/index.js +1 -3
  516. package/map/client/mixins/map/mixin.base-map.js +267 -79
  517. package/map/client/mixins/map/mixin.canvas-layers.js +44 -10
  518. package/map/client/mixins/map/mixin.edit-layers.js +142 -57
  519. package/map/client/mixins/map/mixin.geojson-layers.js +127 -204
  520. package/map/client/mixins/map/mixin.pmtiles-layers.js +24 -11
  521. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +1 -2
  522. package/map/client/mixins/map/mixin.tiled-wind-layers.js +2 -1
  523. package/map/client/mixins/mixin.activity.js +61 -41
  524. package/map/client/mixins/mixin.context.js +19 -14
  525. package/map/client/mixins/mixin.feature-selection.js +0 -1
  526. package/map/client/mixins/mixin.feature-service.js +41 -59
  527. package/map/client/mixins/mixin.weacast.js +1 -1
  528. package/map/client/navigator.js +38 -0
  529. package/map/client/pixi-utils.js +1 -1
  530. package/map/client/planets.js +1 -1
  531. package/map/client/readers/reader.kml.js +57 -1
  532. package/map/client/utils/index.js +1 -0
  533. package/map/client/utils/utils.capture.js +10 -7
  534. package/map/client/utils/utils.catalog.js +2 -2
  535. package/map/client/utils/utils.features.js +193 -39
  536. package/map/client/utils/utils.js +0 -21
  537. package/map/client/utils/utils.layers.js +381 -4
  538. package/map/client/utils/utils.location.js +39 -74
  539. package/map/client/utils/utils.offline.js +89 -0
  540. package/map/client/utils/utils.style.js +133 -80
  541. package/map/common/geotiff-grid-source.js +2 -1
  542. package/map/common/permissions.js +2 -0
  543. package/map/common/schemas/capture.create.json +4 -4
  544. package/map/common/schemas/catalog.update.json +18 -2
  545. package/map/common/schemas/projects.create.json +2 -2
  546. package/map/common/schemas/projects.update.json +2 -2
  547. package/map/common/tms-utils.js +5 -5
  548. package/map/common/wcs-grid-source.js +2 -2
  549. package/map/common/wcs-utils.js +8 -8
  550. package/map/common/wfs-utils.js +10 -10
  551. package/map/common/wms-utils.js +7 -7
  552. package/map/common/wmts-utils.js +6 -6
  553. package/package.json +7 -4
  554. package/test/api/core/account.test.js +0 -72
  555. package/test/api/core/authentication.test.js +184 -0
  556. package/test/api/core/config/default.cjs +1 -3
  557. package/test/api/core/index.test.js +77 -151
  558. package/test/api/core/offline.test.js +55 -0
  559. package/test/api/core/push.test.js +3 -3
  560. package/test/api/core/{test-log-2024-11-05.log → test-log-2025-05-26.log} +1 -9
  561. package/test/api/map/alerts.test.js +1 -1
  562. package/test/api/map/config/default.cjs +2 -1
  563. package/test/api/map/data/vigicrues.observations.Q.json +47042 -0
  564. package/test/api/map/index.test.js +113 -9
  565. package/test/api/map/style.test.js +62 -0
  566. package/test/api/map/{test-log-2024-10-28.log → test-log-2025-05-26.log} +4 -3
  567. package/test/client/core/layout.js +2 -2
  568. package/test/client/core/runner.js +1 -1
  569. package/test/client/core/utils.js +52 -0
  570. package/test/client/map/catalog.js +1 -0
  571. package/core/api/hooks/hooks.groups.js +0 -48
  572. package/core/api/hooks/hooks.organisations.js +0 -152
  573. package/core/api/models/organisations.model.mongodb.js +0 -3
  574. package/core/api/models/tags.model.mongodb.js +0 -10
  575. package/core/api/services/groups/groups.hooks.js +0 -31
  576. package/core/api/services/organisations/organisations.hooks.js +0 -31
  577. package/core/api/services/organisations/organisations.service.js +0 -86
  578. package/core/api/services/tags/tags.hooks.js +0 -31
  579. package/core/api/utils.js +0 -11
  580. package/core/client/components/KChipsPane.vue +0 -103
  581. package/core/client/components/document/index.js +0 -9
  582. package/core/client/components/team/KAddMember.vue +0 -378
  583. package/core/client/components/team/KAddTag.vue +0 -121
  584. package/core/client/components/team/KChangeRole.vue +0 -118
  585. package/core/client/components/team/KGroupCard.vue +0 -110
  586. package/core/client/components/team/KGroupsActivity.vue +0 -78
  587. package/core/client/components/team/KJoinGroup.vue +0 -132
  588. package/core/client/components/team/KMemberCard.vue +0 -328
  589. package/core/client/components/team/KMemberFilter.vue +0 -49
  590. package/core/client/components/team/KMembersActivity.vue +0 -136
  591. package/core/client/components/team/KOrganisationsActivity.vue +0 -51
  592. package/core/client/components/team/KTagCard.vue +0 -72
  593. package/core/client/components/team/KTagsActivity.vue +0 -73
  594. package/core/client/components/team/index.js +0 -9
  595. package/core/client/mixins/mixin.base-context.js +0 -54
  596. package/core/client/utils/utils.platform.js +0 -12
  597. package/core/common/schemas/groups.create.json +0 -28
  598. package/core/common/schemas/groups.update.json +0 -28
  599. package/core/common/schemas/organisations.create.json +0 -28
  600. package/core/common/schemas/organisations.update.json +0 -49
  601. package/core/common/schemas/tags.create.json +0 -35
  602. package/core/common/schemas/tags.update.json +0 -35
  603. package/map/client/components/KAttribution.vue +0 -108
  604. package/map/client/components/KFeaturesFilter.vue +0 -259
  605. package/map/client/components/KLayerStyleEditor.vue +0 -118
  606. package/map/client/components/KLayerStyleForm.vue +0 -740
  607. package/map/client/components/KLevelSlider.vue +0 -100
  608. package/map/client/components/KNorth.vue +0 -31
  609. package/map/client/components/KPositionIndicator.vue +0 -83
  610. package/map/client/components/catalog/KCreateProject.vue +0 -100
  611. package/map/client/mixins/map/mixin.forecast-layers.js +0 -81
  612. package/map/client/mixins/map/mixin.georaster-layers.js +0 -107
  613. package/test/api/core/team.test.js +0 -670
  614. package/test/api/core/test-log-2023-12-19.log +0 -7
  615. package/test/api/core/test-log-2024-01-04.log +0 -14
  616. package/test/api/core/test-log-2024-05-14.log +0 -6
  617. package/test/api/core/test-log-2024-06-06.log +0 -23
  618. package/test/api/core/test-log-2024-06-26.log +0 -25
  619. package/test/api/core/test-log-2024-06-28.log +0 -2
  620. package/test/api/core/test-log-2024-07-09.log +0 -0
  621. package/test/api/core/test-log-2024-08-13.log +0 -69
  622. package/test/api/core/test-log-2024-10-28.log +0 -53
  623. package/test/api/core/test-log-2024-11-15.log +0 -23
  624. package/test/api/core/test-log-2024-11-18.log +0 -0
  625. package/test/api/core/test-log-2024-12-03.log +0 -30
  626. package/test/api/map/test-log-2023-11-24.log +0 -121
  627. package/test/api/map/test-log-2023-12-12.log +0 -29
  628. package/test/api/map/test-log-2023-12-13.log +0 -5
  629. package/test/api/map/test-log-2024-01-04.log +0 -2
  630. package/test/api/map/test-log-2024-01-11.log +0 -1
  631. package/test/api/map/test-log-2024-01-25.log +0 -19
  632. package/test/api/map/test-log-2024-06-06.log +0 -39
  633. package/test/api/map/test-log-2024-08-13.log +0 -13
  634. package/test/api/map/test-log-2024-08-20.log +0 -55
  635. package/test/api/map/test-log-2024-09-09.log +0 -92
  636. /package/extras/{logos → images}/kalisio.png +0 -0
  637. /package/extras/{icons → images}/target.svg +0 -0
  638. /package/test/api/map/data/{vigicrues.observations.json → vigicrues.observations.H.json} +0 -0
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/124</span>
28
+ <span class='fraction'>0/126</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/124</span>
49
+ <span class='fraction'>0/126</span>
50
50
  </div>
51
51
 
52
52
 
@@ -187,7 +187,11 @@
187
187
  <a name='L122'></a><a href='#L122'>122</a>
188
188
  <a name='L123'></a><a href='#L123'>123</a>
189
189
  <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
193
+ <span class="cline-any cline-no">&nbsp;</span>
194
+ <span class="cline-any cline-no">&nbsp;</span>
191
195
  <span class="cline-any cline-no">&nbsp;</span>
192
196
  <span class="cline-any cline-no">&nbsp;</span>
193
197
  <span class="cline-any cline-no">&nbsp;</span>
@@ -320,46 +324,48 @@
320
324
  <span class="cstat-no" title="statement not covered" >const sift = siftModule.default</span>
321
325
  <span class="cstat-no" title="statement not covered" >const debug = makeDebug('kdk:map:catalog:hooks')</span>
322
326
  <span class="cstat-no" title="statement not covered" ></span>
327
+ <span class="cstat-no" title="statement not covered" >function isQueryForType(query, type) {</span>
328
+ <span class="cstat-no" title="statement not covered" > // Use sift to support MongoDB operators like $in, $nin, etc.</span>
329
+ <span class="cstat-no" title="statement not covered" > const filter = [{ type }].filter(sift(_.pick(query, ['type'])))</span>
330
+ <span class="cstat-no" title="statement not covered" > return !_.isEmpty(filter)</span>
331
+ <span class="cstat-no" title="statement not covered" >}</span>
332
+ <span class="cstat-no" title="statement not covered" ></span>
333
+ <span class="cstat-no" title="statement not covered" >function addDefaultItems(query, type, items, defaultItems) {</span>
334
+ <span class="cstat-no" title="statement not covered" > // Add implicit type as not provided in default items config</span>
335
+ <span class="cstat-no" title="statement not covered" > defaultItems = _.map(defaultItems, item =&gt; Object.assign(item, { type }))</span>
336
+ <span class="cstat-no" title="statement not covered" > // Then filter according to query</span>
337
+ <span class="cstat-no" title="statement not covered" > defaultItems = defaultItems.filter(sift(_.omit(query, ['$sort', '$limit', '$skip'])))</span>
338
+ <span class="cstat-no" title="statement not covered" > return items.concat(defaultItems.map(item =&gt; Object.assign(item, { type })))</span>
339
+ <span class="cstat-no" title="statement not covered" >}</span>
340
+ <span class="cstat-no" title="statement not covered" ></span>
323
341
  <span class="cstat-no" title="statement not covered" >// By default we only return default categories</span>
324
342
  <span class="cstat-no" title="statement not covered" >export function getDefaultCategories (hook) {</span>
325
343
  <span class="cstat-no" title="statement not covered" > const query = _.get(hook, 'params.query', {})</span>
326
- <span class="cstat-no" title="statement not covered" > if ((query.type === 'Category') &amp;&amp; (query.$limit !== 0)) {</span>
344
+ <span class="cstat-no" title="statement not covered" > const type = 'Category'</span>
345
+ <span class="cstat-no" title="statement not covered" > if ((query.$limit !== 0) &amp;&amp; isQueryForType(query, type)) {</span>
327
346
  <span class="cstat-no" title="statement not covered" > const service = hook.service</span>
328
- <span class="cstat-no" title="statement not covered" > // Read default category config</span>
329
- <span class="cstat-no" title="statement not covered" > const catalogConfig = hook.app.get('catalog') || { categories: [] }</span>
330
- <span class="cstat-no" title="statement not covered" > // Check for specific service override (e.g. contextual catalog different from global catalog)</span>
331
- <span class="cstat-no" title="statement not covered" > let defaultCategories = _.get(service, 'options.categories', catalogConfig.categories)</span>
332
- <span class="cstat-no" title="statement not covered" > // Add implicit type</span>
333
- <span class="cstat-no" title="statement not covered" > defaultCategories = _.map(defaultCategories, category =&gt; Object.assign(category, { type: 'Category' }))</span>
334
- <span class="cstat-no" title="statement not covered" > // Then filter according to query</span>
335
- <span class="cstat-no" title="statement not covered" > defaultCategories = defaultCategories.filter(sift(_.omit(query, ['$sort', '$limit', '$skip'])))</span>
336
- <span class="cstat-no" title="statement not covered" > const item = getItems(hook)</span>
337
- <span class="cstat-no" title="statement not covered" > replaceItems(hook, item.concat(defaultCategories.map(category =&gt; Object.assign(category, { type: 'Category' }))))</span>
347
+ <span class="cstat-no" title="statement not covered" > // Check for default categories config</span>
348
+ <span class="cstat-no" title="statement not covered" > const defaultCategories = _.get(service, 'options.categories', [])</span>
349
+ <span class="cstat-no" title="statement not covered" > replaceItems(hook, addDefaultItems(query, type, getItems(hook), defaultCategories))</span>
338
350
  <span class="cstat-no" title="statement not covered" > }</span>
339
351
  <span class="cstat-no" title="statement not covered" >}</span>
340
352
  <span class="cstat-no" title="statement not covered" ></span>
341
353
  <span class="cstat-no" title="statement not covered" >// By default we only return default sublegends</span>
342
354
  <span class="cstat-no" title="statement not covered" >export function getDefaultSublegends (hook) {</span>
343
355
  <span class="cstat-no" title="statement not covered" > const query = _.get(hook, 'params.query', {})</span>
344
- <span class="cstat-no" title="statement not covered" > if ((query.type === 'Sublegend') &amp;&amp; (query.$limit !== 0)) {</span>
356
+ <span class="cstat-no" title="statement not covered" > const type = 'Sublegend'</span>
357
+ <span class="cstat-no" title="statement not covered" > if ((query.$limit !== 0) &amp;&amp; isQueryForType(query, type)) {</span>
345
358
  <span class="cstat-no" title="statement not covered" > const service = hook.service</span>
346
- <span class="cstat-no" title="statement not covered" > // Read default sublegends config</span>
347
- <span class="cstat-no" title="statement not covered" > const catalogConfig = hook.app.get('catalog') || { sublegends: [] }</span>
348
- <span class="cstat-no" title="statement not covered" > // Check for specific service override (e.g. contextual catalog different from global catalog)</span>
349
- <span class="cstat-no" title="statement not covered" > let defaultSublegends = _.get(service, 'options.sublegends', catalogConfig.sublegends)</span>
350
- <span class="cstat-no" title="statement not covered" > // Add implicit type</span>
351
- <span class="cstat-no" title="statement not covered" > defaultSublegends = _.map(defaultSublegends, sublegend =&gt; Object.assign(sublegend, { type: 'Sublegend' }))</span>
352
- <span class="cstat-no" title="statement not covered" > // Then filter according to query</span>
353
- <span class="cstat-no" title="statement not covered" > defaultSublegends = defaultSublegends.filter(sift(_.omit(query, ['$sort', '$limit', '$skip'])))</span>
354
- <span class="cstat-no" title="statement not covered" > const item = getItems(hook)</span>
355
- <span class="cstat-no" title="statement not covered" > replaceItems(hook, item.concat(defaultSublegends.map(sublegend =&gt; Object.assign(sublegend, { type: 'Sublegend' }))))</span>
359
+ <span class="cstat-no" title="statement not covered" > // Check for default sublegends config</span>
360
+ <span class="cstat-no" title="statement not covered" > const defaultSublegends = _.get(service, 'options.sublegends', [])</span>
361
+ <span class="cstat-no" title="statement not covered" > replaceItems(hook, addDefaultItems(query, type, getItems(hook), defaultSublegends))</span>
356
362
  <span class="cstat-no" title="statement not covered" > }</span>
357
363
  <span class="cstat-no" title="statement not covered" >}</span>
358
364
  <span class="cstat-no" title="statement not covered" ></span>
359
365
  <span class="cstat-no" title="statement not covered" >// By default we only return layers and not other objects in catalog</span>
360
366
  <span class="cstat-no" title="statement not covered" >export function filterLayers (hook) {</span>
361
367
  <span class="cstat-no" title="statement not covered" > const query = _.get(hook, 'params.query', {})</span>
362
- <span class="cstat-no" title="statement not covered" > if (!query.type) query.type = { $nin: ['Context', 'Service', 'Category'] }</span>
368
+ <span class="cstat-no" title="statement not covered" > if (!query.type) query.type = { $nin: ['Context', 'Service', 'Category', 'Sublegend'] }</span>
363
369
  <span class="cstat-no" title="statement not covered" > _.set(hook, 'params.query', query)</span>
364
370
  <span class="cstat-no" title="statement not covered" >}</span>
365
371
  <span class="cstat-no" title="statement not covered" ></span>
@@ -442,7 +448,7 @@
442
448
  <div class='footer quiet pad2 space-top1 center small'>
443
449
  Code coverage generated by
444
450
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
445
- at 2024-11-15T21:05:45.905Z
451
+ at 2025-02-18T09:52:45.605Z
446
452
  </div>
447
453
  <script src="../../../prettify.js"></script>
448
454
  <script>
@@ -382,7 +382,7 @@
382
382
  <div class='footer quiet pad2 space-top1 center small'>
383
383
  Code coverage generated by
384
384
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
385
- at 2024-11-15T21:05:45.905Z
385
+ at 2025-02-18T09:52:45.605Z
386
386
  </div>
387
387
  <script src="../../../prettify.js"></script>
388
388
  <script>
@@ -1018,7 +1018,7 @@
1018
1018
  <span class="cstat-no" title="statement not covered" > const params = hook.params</span>
1019
1019
  <span class="cstat-no" title="statement not covered" > const query = params.query</span>
1020
1020
  <span class="cstat-no" title="statement not covered" > if (!options.force &amp;&amp; !params.asGeoJson) return</span>
1021
- <span class="cstat-no" title="statement not covered" > if (query.$distinct || query.$aggregation) return // Not applicable in this case</span>
1021
+ <span class="cstat-no" title="statement not covered" > if (_.has(query, '$distinct') || _.has(query, '$aggregation')) return // Not applicable in this case</span>
1022
1022
  <span class="cstat-no" title="statement not covered" > const longitudeProperty = (options.longitudeProperty || 'longitude')</span>
1023
1023
  <span class="cstat-no" title="statement not covered" > const latitudeProperty = (options.latitudeProperty || 'latitude')</span>
1024
1024
  <span class="cstat-no" title="statement not covered" > const altitudeProperty = (options.altitudeProperty || 'altitude')</span>
@@ -1259,9 +1259,9 @@
1259
1259
  <span class="cstat-no" title="statement not covered" > aggregatedResults = elementResults</span>
1260
1260
  <span class="cstat-no" title="statement not covered" > } else {</span>
1261
1261
  <span class="cstat-no" title="statement not covered" > elementResults.forEach(result =&gt; {</span>
1262
- <span class="cstat-no" title="statement not covered" > const resultKeys = _.pick(result, keys)</span>
1262
+ <span class="cstat-no" title="statement not covered" > const resultKeys = _.pick(result._id, keys)</span>
1263
1263
  <span class="cstat-no" title="statement not covered" > const previousResult = aggregatedResults.find(aggregatedResult =&gt; {</span>
1264
- <span class="cstat-no" title="statement not covered" > const aggregatedResultKeys = _.pick(aggregatedResult, keys)</span>
1264
+ <span class="cstat-no" title="statement not covered" > const aggregatedResultKeys = _.pick(aggregatedResult._id, keys)</span>
1265
1265
  <span class="cstat-no" title="statement not covered" > return _.isEqual(aggregatedResultKeys, resultKeys)</span>
1266
1266
  <span class="cstat-no" title="statement not covered" > })</span>
1267
1267
  <span class="cstat-no" title="statement not covered" > // Merge with previous matching feature if any</span>
@@ -1294,7 +1294,7 @@
1294
1294
  <div class='footer quiet pad2 space-top1 center small'>
1295
1295
  Code coverage generated by
1296
1296
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1297
- at 2024-11-15T21:05:45.905Z
1297
+ at 2025-02-18T09:52:45.605Z
1298
1298
  </div>
1299
1299
  <script src="../../../prettify.js"></script>
1300
1300
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/639</span>
28
+ <span class='fraction'>0/641</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/639</span>
49
+ <span class='fraction'>0/641</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
85
  </td>
86
86
  <td data-value="0" class="pct low">0%</td>
87
- <td data-value="124" class="abs low">0/124</td>
87
+ <td data-value="126" class="abs low">0/126</td>
88
88
  <td data-value="0" class="pct low">0%</td>
89
89
  <td data-value="1" class="abs low">0/1</td>
90
90
  <td data-value="0" class="pct low">0%</td>
91
91
  <td data-value="1" class="abs low">0/1</td>
92
92
  <td data-value="0" class="pct low">0%</td>
93
- <td data-value="124" class="abs low">0/124</td>
93
+ <td data-value="126" class="abs low">0/126</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2024-11-15T21:05:45.905Z
149
+ at 2025-02-18T09:52:45.605Z
150
150
  </div>
151
151
  <script src="../../../prettify.js"></script>
152
152
  <script>
@@ -79,7 +79,7 @@
79
79
  <div class='footer quiet pad2 space-top1 center small'>
80
80
  Code coverage generated by
81
81
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
82
- at 2024-11-15T21:05:45.905Z
82
+ at 2025-02-18T09:52:45.605Z
83
83
  </div>
84
84
  <script src="../../../prettify.js"></script>
85
85
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2024-11-15T21:05:45.905Z
119
+ at 2025-02-18T09:52:45.605Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -124,7 +124,7 @@
124
124
  <div class='footer quiet pad2 space-top1 center small'>
125
125
  Code coverage generated by
126
126
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
127
- at 2024-11-15T21:05:45.905Z
127
+ at 2025-02-18T09:52:45.605Z
128
128
  </div>
129
129
  <script src="../../prettify.js"></script>
130
130
  <script>
@@ -163,7 +163,7 @@
163
163
  <div class='footer quiet pad2 space-top1 center small'>
164
164
  Code coverage generated by
165
165
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
166
- at 2024-11-15T21:05:45.905Z
166
+ at 2025-02-18T09:52:45.605Z
167
167
  </div>
168
168
  <script src="../../prettify.js"></script>
169
169
  <script>
@@ -91,7 +91,7 @@
91
91
  <div class='footer quiet pad2 space-top1 center small'>
92
92
  Code coverage generated by
93
93
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
94
- at 2024-11-15T21:05:45.905Z
94
+ at 2025-02-18T09:52:45.605Z
95
95
  </div>
96
96
  <script src="../../../prettify.js"></script>
97
97
  <script>
@@ -112,7 +112,7 @@
112
112
  <div class='footer quiet pad2 space-top1 center small'>
113
113
  Code coverage generated by
114
114
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
115
- at 2024-11-15T21:05:45.905Z
115
+ at 2025-02-18T09:52:45.605Z
116
116
  </div>
117
117
  <script src="../../../prettify.js"></script>
118
118
  <script>
@@ -181,7 +181,7 @@
181
181
  <div class='footer quiet pad2 space-top1 center small'>
182
182
  Code coverage generated by
183
183
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
184
- at 2024-11-15T21:05:45.905Z
184
+ at 2025-02-18T09:52:45.605Z
185
185
  </div>
186
186
  <script src="../../../prettify.js"></script>
187
187
  <script>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2024-11-15T21:05:45.905Z
149
+ at 2025-02-18T09:52:45.605Z
150
150
  </div>
151
151
  <script src="../../../prettify.js"></script>
152
152
  <script>
@@ -94,7 +94,7 @@
94
94
  <div class='footer quiet pad2 space-top1 center small'>
95
95
  Code coverage generated by
96
96
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
97
- at 2024-11-15T21:05:45.905Z
97
+ at 2025-02-18T09:52:45.605Z
98
98
  </div>
99
99
  <script src="../../../prettify.js"></script>
100
100
  <script>
@@ -259,7 +259,7 @@
259
259
  <div class='footer quiet pad2 space-top1 center small'>
260
260
  Code coverage generated by
261
261
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
262
- at 2024-11-15T21:05:45.905Z
262
+ at 2025-02-18T09:52:45.605Z
263
263
  </div>
264
264
  <script src="../../../../prettify.js"></script>
265
265
  <script>
@@ -595,7 +595,7 @@
595
595
  <div class='footer quiet pad2 space-top1 center small'>
596
596
  Code coverage generated by
597
597
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
598
- at 2024-11-15T21:05:45.905Z
598
+ at 2025-02-18T09:52:45.605Z
599
599
  </div>
600
600
  <script src="../../../../prettify.js"></script>
601
601
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2024-11-15T21:05:45.905Z
119
+ at 2025-02-18T09:52:45.605Z
120
120
  </div>
121
121
  <script src="../../../../prettify.js"></script>
122
122
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/75</span>
28
+ <span class='fraction'>0/76</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/75</span>
49
+ <span class='fraction'>0/76</span>
50
50
  </div>
51
51
 
52
52
 
@@ -138,7 +138,9 @@
138
138
  <a name='L73'></a><a href='#L73'>73</a>
139
139
  <a name='L74'></a><a href='#L74'>74</a>
140
140
  <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
143
+ <span class="cline-any cline-no">&nbsp;</span>
142
144
  <span class="cline-any cline-no">&nbsp;</span>
143
145
  <span class="cline-any cline-no">&nbsp;</span>
144
146
  <span class="cline-any cline-no">&nbsp;</span>
@@ -217,7 +219,8 @@
217
219
  <span class="cstat-no" title="statement not covered" >import common from 'feathers-hooks-common'</span>
218
220
  <span class="cstat-no" title="statement not covered" >import fuzzySearch from 'feathers-mongodb-fuzzy-search'</span>
219
221
  <span class="cstat-no" title="statement not covered" >import { hooks as coreHooks } from '../../../../core/api/index.js'</span>
220
- <span class="cstat-no" title="statement not covered" >import { filterLayers, updateLayerReferences, updateProjects, getDefaultCategories, getDefaultSublegends } from '../../hooks/index.js'</span>
222
+ <span class="cstat-no" title="statement not covered" >import { filterLayers, updateLayerReferences, updateProjects,</span>
223
+ <span class="cstat-no" title="statement not covered" > getDefaultCategories, getDefaultSublegends } from '../../hooks/index.js'</span>
221
224
  <span class="cstat-no" title="statement not covered" ></span>
222
225
  <span class="cstat-no" title="statement not covered" >const { setNow, discard, when } = common</span>
223
226
  <span class="cstat-no" title="statement not covered" ></span>
@@ -260,8 +263,8 @@
260
263
  <span class="cstat-no" title="statement not covered" > coreHooks.convertObjectIDs(['baseQuery.layer'])</span>
261
264
  <span class="cstat-no" title="statement not covered" > ],</span>
262
265
  <span class="cstat-no" title="statement not covered" > find: [</span>
263
- <span class="cstat-no" title="statement not covered" > // Merge built-in categoriessublegends with user-defined ones for global catalog only</span>
264
- <span class="cstat-no" title="statement not covered" > when(hook =&gt; !hook.service.getContextId(), getDefaultCategories, getDefaultSublegends)</span>
266
+ <span class="cstat-no" title="statement not covered" > // Merge built-in categories/sublegends (if provided) with user-defined ones</span>
267
+ <span class="cstat-no" title="statement not covered" > getDefaultCategories, getDefaultSublegends</span>
265
268
  <span class="cstat-no" title="statement not covered" > ],</span>
266
269
  <span class="cstat-no" title="statement not covered" > get: [],</span>
267
270
  <span class="cstat-no" title="statement not covered" > create: [],</span>
@@ -295,7 +298,7 @@
295
298
  <div class='footer quiet pad2 space-top1 center small'>
296
299
  Code coverage generated by
297
300
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
298
- at 2024-11-15T21:05:45.905Z
301
+ at 2025-02-18T09:52:45.605Z
299
302
  </div>
300
303
  <script src="../../../../prettify.js"></script>
301
304
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/75</span>
28
+ <span class='fraction'>0/76</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/75</span>
49
+ <span class='fraction'>0/76</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
85
  </td>
86
86
  <td data-value="0" class="pct low">0%</td>
87
- <td data-value="75" class="abs low">0/75</td>
87
+ <td data-value="76" class="abs low">0/76</td>
88
88
  <td data-value="0" class="pct low">0%</td>
89
89
  <td data-value="1" class="abs low">0/1</td>
90
90
  <td data-value="0" class="pct low">0%</td>
91
91
  <td data-value="1" class="abs low">0/1</td>
92
92
  <td data-value="0" class="pct low">0%</td>
93
- <td data-value="75" class="abs low">0/75</td>
93
+ <td data-value="76" class="abs low">0/76</td>
94
94
  </tr>
95
95
 
96
96
  </tbody>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2024-11-15T21:05:45.905Z
104
+ at 2025-02-18T09:52:45.605Z
105
105
  </div>
106
106
  <script src="../../../../prettify.js"></script>
107
107
  <script>
@@ -1495,7 +1495,7 @@
1495
1495
  <div class='footer quiet pad2 space-top1 center small'>
1496
1496
  Code coverage generated by
1497
1497
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1498
- at 2024-11-15T21:05:45.905Z
1498
+ at 2025-02-18T09:52:45.605Z
1499
1499
  </div>
1500
1500
  <script src="../../../../prettify.js"></script>
1501
1501
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2024-11-15T21:05:45.905Z
104
+ at 2025-02-18T09:52:45.605Z
105
105
  </div>
106
106
  <script src="../../../../prettify.js"></script>
107
107
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/52</span>
28
+ <span class='fraction'>0/75</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/52</span>
49
+ <span class='fraction'>0/75</span>
50
50
  </div>
51
51
 
52
52
 
@@ -115,7 +115,53 @@
115
115
  <a name='L50'></a><a href='#L50'>50</a>
116
116
  <a name='L51'></a><a href='#L51'>51</a>
117
117
  <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
142
+ <span class="cline-any cline-no">&nbsp;</span>
143
+ <span class="cline-any cline-no">&nbsp;</span>
144
+ <span class="cline-any cline-no">&nbsp;</span>
145
+ <span class="cline-any cline-no">&nbsp;</span>
146
+ <span class="cline-any cline-no">&nbsp;</span>
147
+ <span class="cline-any cline-no">&nbsp;</span>
148
+ <span class="cline-any cline-no">&nbsp;</span>
149
+ <span class="cline-any cline-no">&nbsp;</span>
150
+ <span class="cline-any cline-no">&nbsp;</span>
151
+ <span class="cline-any cline-no">&nbsp;</span>
152
+ <span class="cline-any cline-no">&nbsp;</span>
153
+ <span class="cline-any cline-no">&nbsp;</span>
154
+ <span class="cline-any cline-no">&nbsp;</span>
155
+ <span class="cline-any cline-no">&nbsp;</span>
156
+ <span class="cline-any cline-no">&nbsp;</span>
157
+ <span class="cline-any cline-no">&nbsp;</span>
158
+ <span class="cline-any cline-no">&nbsp;</span>
159
+ <span class="cline-any cline-no">&nbsp;</span>
160
+ <span class="cline-any cline-no">&nbsp;</span>
161
+ <span class="cline-any cline-no">&nbsp;</span>
162
+ <span class="cline-any cline-no">&nbsp;</span>
163
+ <span class="cline-any cline-no">&nbsp;</span>
164
+ <span class="cline-any cline-no">&nbsp;</span>
119
165
  <span class="cline-any cline-no">&nbsp;</span>
120
166
  <span class="cline-any cline-no">&nbsp;</span>
121
167
  <span class="cline-any cline-no">&nbsp;</span>
@@ -168,12 +214,15 @@
168
214
  <span class="cline-any cline-no">&nbsp;</span>
169
215
  <span class="cline-any cline-no">&nbsp;</span>
170
216
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import _ from 'lodash'</span></span></span>
217
+ <span class="cstat-no" title="statement not covered" >import common from 'feathers-hooks-common'</span>
171
218
  <span class="cstat-no" title="statement not covered" >import { hooks as coreHooks } from '../../../../core/api/index.js'</span>
172
219
  <span class="cstat-no" title="statement not covered" >import {</span>
173
220
  <span class="cstat-no" title="statement not covered" > marshallSpatialQuery, aggregateFeaturesQuery, asGeoJson,</span>
174
221
  <span class="cstat-no" title="statement not covered" > simplifyResult, simplifyEvents, skipEvents, fuzzySearch</span>
175
222
  <span class="cstat-no" title="statement not covered" >} from '../../hooks/index.js'</span>
176
223
  <span class="cstat-no" title="statement not covered" ></span>
224
+ <span class="cstat-no" title="statement not covered" >const { getItems, replaceItems } = common</span>
225
+ <span class="cstat-no" title="statement not covered" ></span>
177
226
  <span class="cstat-no" title="statement not covered" >// Allow to control real-time events emission if required</span>
178
227
  <span class="cstat-no" title="statement not covered" >const emitEvents = (hook) =&gt; {</span>
179
228
  <span class="cstat-no" title="statement not covered" > _.set(hook, 'params.emitEvents', _.get(hook, 'params.query.emitEvents'))</span>
@@ -184,6 +233,25 @@
184
233
  <span class="cstat-no" title="statement not covered" > _.set(hook, 'params.fullResult', _.get(hook, 'params.query.fullResult'))</span>
185
234
  <span class="cstat-no" title="statement not covered" > _.unset(hook, 'params.query.fullResult')</span>
186
235
  <span class="cstat-no" title="statement not covered" >}</span>
236
+ <span class="cstat-no" title="statement not covered" >// Allow upsert if required</span>
237
+ <span class="cstat-no" title="statement not covered" >const upsert = (hook) =&gt; {</span>
238
+ <span class="cstat-no" title="statement not covered" > _.set(hook, 'params.mongodb', { upsert: _.get(hook, 'params.query.upsert', false) })</span>
239
+ <span class="cstat-no" title="statement not covered" > _.unset(hook, 'params.query.upsert')</span>
240
+ <span class="cstat-no" title="statement not covered" >}</span>
241
+ <span class="cstat-no" title="statement not covered" >// Feathers does not return anything in this case</span>
242
+ <span class="cstat-no" title="statement not covered" >const upsertResult = async (hook) =&gt; {</span>
243
+ <span class="cstat-no" title="statement not covered" > if (_.get(hook, 'params.mongodb.upsert', false)) {</span>
244
+ <span class="cstat-no" title="statement not covered" > let items = getItems(hook)</span>
245
+ <span class="cstat-no" title="statement not covered" > const isArray = Array.isArray(items)</span>
246
+ <span class="cstat-no" title="statement not covered" > items = (isArray ? items : [items])</span>
247
+ <span class="cstat-no" title="statement not covered" > const collection = await hook.service.find({</span>
248
+ <span class="cstat-no" title="statement not covered" > query: _.get(hook, 'params.query', {}),</span>
249
+ <span class="cstat-no" title="statement not covered" > paginate: false</span>
250
+ <span class="cstat-no" title="statement not covered" > })</span>
251
+ <span class="cstat-no" title="statement not covered" > replaceItems(hook, isArray ? collection.features : collection.features[0])</span>
252
+ <span class="cstat-no" title="statement not covered" > }</span>
253
+ <span class="cstat-no" title="statement not covered" > return hook</span>
254
+ <span class="cstat-no" title="statement not covered" >}</span>
187
255
  <span class="cstat-no" title="statement not covered" ></span>
188
256
  <span class="cstat-no" title="statement not covered" >export default {</span>
189
257
  <span class="cstat-no" title="statement not covered" > before: {</span>
@@ -192,9 +260,10 @@
192
260
  <span class="cstat-no" title="statement not covered" > coreHooks.distinct, aggregateFeaturesQuery, coreHooks.aggregationQuery, fuzzySearch, coreHooks.diacriticSearch()],</span>
193
261
  <span class="cstat-no" title="statement not covered" > get: [],</span>
194
262
  <span class="cstat-no" title="statement not covered" > create: [coreHooks.processTimes(['time']), fullResult, emitEvents],</span>
195
- <span class="cstat-no" title="statement not covered" > update: [coreHooks.processTimes(['time']), fullResult, emitEvents],</span>
196
- <span class="cstat-no" title="statement not covered" > patch: [coreHooks.processTimes(['time']), fullResult, emitEvents],</span>
197
- <span class="cstat-no" title="statement not covered" > remove: [coreHooks.marshallComparisonQuery, marshallSpatialQuery, fullResult, emitEvents]</span>
263
+ <span class="cstat-no" title="statement not covered" > update: [upsert, coreHooks.processTimes(['time']), fullResult, emitEvents],</span>
264
+ <span class="cstat-no" title="statement not covered" > patch: [upsert, coreHooks.processTimes(['time']), fullResult, emitEvents],</span>
265
+ <span class="cstat-no" title="statement not covered" > remove: [coreHooks.marshallComparisonQuery, marshallSpatialQuery, fullResult, emitEvents],</span>
266
+ <span class="cstat-no" title="statement not covered" > formatGeoJSON: []</span>
198
267
  <span class="cstat-no" title="statement not covered" > },</span>
199
268
  <span class="cstat-no" title="statement not covered" ></span>
200
269
  <span class="cstat-no" title="statement not covered" > after: {</span>
@@ -204,8 +273,8 @@
204
273
  <span class="cstat-no" title="statement not covered" > // By default avoid emitting events and full result on feature edition because we usually proceed with big batches</span>
205
274
  <span class="cstat-no" title="statement not covered" > // On a per-case basis each application can activate all events/results if required or define a more evolved strategy</span>
206
275
  <span class="cstat-no" title="statement not covered" > create: [coreHooks.unprocessTimes(['time']), simplifyEvents, simplifyResult, skipEvents],</span>
207
- <span class="cstat-no" title="statement not covered" > update: [coreHooks.unprocessTimes(['time']), simplifyEvents, simplifyResult, skipEvents],</span>
208
- <span class="cstat-no" title="statement not covered" > patch: [coreHooks.unprocessTimes(['time']), simplifyEvents, simplifyResult, skipEvents],</span>
276
+ <span class="cstat-no" title="statement not covered" > update: [coreHooks.unprocessTimes(['time']), upsertResult, simplifyEvents, simplifyResult, skipEvents],</span>
277
+ <span class="cstat-no" title="statement not covered" > patch: [coreHooks.unprocessTimes(['time']), upsertResult, simplifyEvents, simplifyResult, skipEvents],</span>
209
278
  <span class="cstat-no" title="statement not covered" > remove: [simplifyEvents, simplifyResult, skipEvents]</span>
210
279
  <span class="cstat-no" title="statement not covered" > },</span>
211
280
  <span class="cstat-no" title="statement not covered" ></span>
@@ -226,7 +295,7 @@
226
295
  <div class='footer quiet pad2 space-top1 center small'>
227
296
  Code coverage generated by
228
297
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
229
- at 2024-11-15T21:05:45.905Z
298
+ at 2025-02-18T09:52:45.605Z
230
299
  </div>
231
300
  <script src="../../../../prettify.js"></script>
232
301
  <script>