@kalisio/kdk 2.4.1 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/core/api/application.js +12 -12
  2. package/core/api/authentication.js +51 -7
  3. package/core/api/hooks/hooks.authentication.js +1 -59
  4. package/core/api/hooks/hooks.authorisations.js +8 -102
  5. package/core/api/hooks/hooks.model.js +4 -0
  6. package/core/api/hooks/hooks.push.js +18 -14
  7. package/core/api/hooks/hooks.users.js +0 -91
  8. package/core/api/hooks/index.js +0 -2
  9. package/core/api/services/account/account.service.js +1 -1
  10. package/core/api/services/authorisations/authorisations.service.js +28 -29
  11. package/core/api/services/index.js +38 -50
  12. package/core/api/services/messages/messages.hooks.js +4 -3
  13. package/core/api/services/users/users.service.js +5 -0
  14. package/core/client/api.js +182 -71
  15. package/core/client/broadcaster.js +20 -0
  16. package/core/client/capabilities.js +17 -7
  17. package/core/client/components/KActivity.vue +29 -34
  18. package/core/client/components/KAvatar.vue +0 -6
  19. package/core/client/components/KChip.vue +142 -39
  20. package/core/client/components/KContent.vue +13 -32
  21. package/core/client/components/KDialog.vue +29 -8
  22. package/core/client/components/KEditor.vue +120 -0
  23. package/core/client/components/KFollower.vue +75 -0
  24. package/core/client/components/KLogo.vue +2 -3
  25. package/core/client/components/KModal.vue +30 -10
  26. package/core/client/components/KSponsor.vue +1 -1
  27. package/core/client/components/KTextArea.vue +2 -5
  28. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  29. package/core/client/components/account/KProfile.vue +52 -14
  30. package/core/client/components/account/KSubscription.vue +19 -9
  31. package/core/client/components/account/KSubscriptionsManager.vue +10 -11
  32. package/core/client/components/action/KAction.vue +44 -24
  33. package/core/client/components/action/KBugReportAction.vue +4 -5
  34. package/core/client/components/action/KToggleStickyVisibility.vue +41 -0
  35. package/core/client/components/action/KToggleWidgetVisibility.vue +41 -0
  36. package/core/client/components/app/KPlatform.vue +122 -35
  37. package/core/client/components/app/KRequestProgressBar.vue +59 -0
  38. package/core/client/components/app/KSettings.vue +13 -2
  39. package/core/client/components/app/KTour.vue +2 -2
  40. package/core/client/components/chart/KTimeSeriesChart.vue +11 -3
  41. package/core/client/components/collection/KCard.vue +27 -33
  42. package/core/client/components/collection/KCardSection.vue +3 -23
  43. package/core/client/components/collection/KColumn.vue +0 -5
  44. package/core/client/components/collection/KDescriptionCardSection.vue +10 -5
  45. package/core/client/components/collection/KFilterView.vue +15 -0
  46. package/core/client/components/collection/KGrid.vue +4 -9
  47. package/core/client/components/collection/KHistory.vue +0 -5
  48. package/core/client/components/collection/KHistoryEntry.vue +0 -2
  49. package/core/client/components/collection/KItem.vue +1 -2
  50. package/core/client/components/collection/KSearchFilterControl.vue +139 -0
  51. package/core/client/components/collection/KTable.vue +1 -4
  52. package/core/client/components/collection/KTagsFilterControl.vue +70 -0
  53. package/core/client/components/collection/KTagsFilterView.vue +61 -0
  54. package/core/client/components/collection/KTimeFilterControl.vue +40 -0
  55. package/core/client/components/collection/KTimeFilterView.vue +106 -0
  56. package/core/client/components/collection/KTimeLine.vue +18 -11
  57. package/core/client/components/document/KBrowser.vue +283 -0
  58. package/core/client/components/document/KCsv.vue +52 -0
  59. package/core/client/components/document/KDocument.vue +19 -5
  60. package/core/client/components/document/KImage.vue +50 -19
  61. package/core/client/components/document/KMarkdown.vue +10 -2
  62. package/core/client/components/document/KUploader.vue +126 -0
  63. package/core/client/components/document/KVideo.vue +39 -0
  64. package/core/client/components/form/KDateField.vue +70 -0
  65. package/core/client/components/form/KDateTimeRangeField.vue +6 -17
  66. package/core/client/components/form/KDatetimeField.vue +6 -13
  67. package/core/client/components/form/KForm.vue +8 -8
  68. package/core/client/components/form/KOptionsField.vue +2 -0
  69. package/core/client/components/form/KResolutionField.vue +54 -52
  70. package/core/client/components/form/KSelectField.vue +27 -13
  71. package/core/client/components/form/KTextareaField.vue +23 -5
  72. package/core/client/components/graphics/KIcon.vue +64 -0
  73. package/core/client/components/index.js +1 -3
  74. package/core/client/components/input/KColorPicker.vue +70 -0
  75. package/core/client/components/input/KIconPicker.vue +188 -0
  76. package/core/client/components/input/KShapePicker.vue +81 -0
  77. package/core/client/components/input/index.js +7 -1
  78. package/core/client/components/layout/KFab.vue +1 -1
  79. package/core/client/components/layout/KLayout.vue +14 -2
  80. package/core/client/components/layout/KOpener.vue +9 -11
  81. package/core/client/components/layout/KPage.vue +31 -17
  82. package/core/client/components/layout/KWindow.vue +34 -18
  83. package/core/client/components/menu/KMenu.vue +52 -36
  84. package/core/client/components/menu/KSubMenu.vue +105 -0
  85. package/core/client/components/messages/KMessageCard.vue +207 -0
  86. package/core/client/components/messages/KMessageComposer.vue +199 -0
  87. package/core/client/components/messages/KMessagesTimeLine.vue +137 -0
  88. package/core/client/components/messages/index.js +7 -0
  89. package/core/client/components/screen/KErrorScreen.vue +2 -3
  90. package/core/client/components/screen/KLogoutScreen.vue +3 -1
  91. package/core/client/components/screen/KOAuthLoginScreen.vue +15 -0
  92. package/core/client/components/screen/KOAuthLogoutScreen.vue +33 -0
  93. package/core/client/components/screen/KUnauthorizedScreen.vue +16 -0
  94. package/core/client/components/time/KAbsoluteTimeRange.vue +7 -14
  95. package/core/client/components/time/KDate.vue +55 -28
  96. package/core/client/components/time/KDateTime.vue +93 -37
  97. package/core/client/components/time/KDateTimeRange.vue +197 -52
  98. package/core/client/components/time/KTime.vue +55 -27
  99. package/core/client/composables/activity.js +40 -30
  100. package/core/client/composables/{counter.js → collection-counter.js} +2 -4
  101. package/core/client/composables/collection-filter.js +111 -0
  102. package/core/client/composables/collection-timerange.js +56 -0
  103. package/core/client/composables/collection.js +13 -11
  104. package/core/client/composables/context.js +92 -0
  105. package/core/client/composables/errors.js +83 -0
  106. package/core/client/composables/index.js +5 -1
  107. package/core/client/composables/layout.js +14 -11
  108. package/core/client/composables/messages.js +4 -4
  109. package/core/client/composables/pwa.js +20 -27
  110. package/core/client/composables/schema.js +1 -1
  111. package/core/client/composables/screen.js +21 -9
  112. package/core/client/composables/selection.js +16 -4
  113. package/core/client/composables/session.js +13 -7
  114. package/core/client/composables/store.js +2 -1
  115. package/core/client/context.js +38 -0
  116. package/core/client/directives/v-hover.js +7 -4
  117. package/core/client/document.js +43 -15
  118. package/core/client/events.js +2 -2
  119. package/core/client/exporter.js +5 -4
  120. package/core/client/filter.js +1 -8
  121. package/core/client/guards.js +3 -3
  122. package/core/client/hooks/hooks.logger.js +1 -1
  123. package/core/client/hooks/hooks.offline.js +32 -0
  124. package/core/client/hooks/index.js +2 -1
  125. package/core/client/i18n/core_en.json +95 -268
  126. package/core/client/i18n/core_fr.json +181 -353
  127. package/core/client/index.js +22 -8
  128. package/core/client/layout.js +64 -25
  129. package/core/client/local-cache.js +67 -0
  130. package/core/client/local-storage.js +6 -2
  131. package/core/client/mixins/index.js +0 -1
  132. package/core/client/mixins/mixin.base-activity.js +22 -10
  133. package/core/client/mixins/mixin.base-editor.js +1 -1
  134. package/core/client/mixins/mixin.base-field.js +10 -1
  135. package/core/client/mixins/mixin.base-item.js +14 -11
  136. package/core/client/mixins/mixin.service.js +1 -5
  137. package/core/client/platform.js +44 -0
  138. package/core/client/readers/reader.blob.js +3 -3
  139. package/core/client/readers/reader.csv.js +2 -2
  140. package/core/client/readers/reader.json.js +2 -2
  141. package/core/client/services/index.js +7 -11
  142. package/core/client/storage.js +43 -8
  143. package/core/client/template-context.js +14 -14
  144. package/core/client/time.js +2 -2
  145. package/core/client/units.js +7 -4
  146. package/core/client/utils/index.js +6 -5
  147. package/core/client/utils/utils.collection.js +71 -0
  148. package/core/client/utils/utils.colors.js +29 -8
  149. package/core/client/utils/utils.content.js +14 -14
  150. package/core/client/utils/utils.files.js +17 -0
  151. package/core/client/utils/utils.items.js +4 -0
  152. package/core/client/utils/utils.math.js +18 -1
  153. package/core/client/utils/utils.push.js +22 -13
  154. package/core/client/utils/utils.screen.js +6 -2
  155. package/core/client/utils/utils.services.js +42 -0
  156. package/core/client/utils/utils.session.js +48 -12
  157. package/core/client/utils/utils.shapes.js +15 -11
  158. package/core/common/permissions.js +3 -108
  159. package/core/common/schemas/messages.update.json +16 -0
  160. package/core/common/schemas/settings.update.json +27 -8
  161. package/core/common/utils.js +2 -0
  162. package/core/common/utils.offline.js +38 -0
  163. package/coverage/core/api/application.js.html +296 -296
  164. package/coverage/core/api/authentication.js.html +206 -74
  165. package/coverage/core/api/db.js.html +61 -61
  166. package/coverage/core/api/hooks/hooks.authentication.js.html +15 -189
  167. package/coverage/core/api/hooks/hooks.authorisations.js.html +180 -462
  168. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  169. package/coverage/core/api/hooks/hooks.logger.js.html +16 -16
  170. package/coverage/core/api/hooks/hooks.model.js.html +69 -57
  171. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  172. package/coverage/core/api/hooks/hooks.push.js.html +58 -46
  173. package/coverage/core/api/hooks/hooks.query.js.html +142 -142
  174. package/coverage/core/api/hooks/hooks.schemas.js.html +1 -1
  175. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  176. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  177. package/coverage/core/api/hooks/hooks.users.js.html +54 -327
  178. package/coverage/core/api/hooks/index.html +64 -94
  179. package/coverage/core/api/hooks/index.js.html +4 -10
  180. package/coverage/core/api/index.html +41 -56
  181. package/coverage/core/api/index.js.html +1 -1
  182. package/coverage/core/api/marshall.js.html +9 -9
  183. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  184. package/coverage/core/api/models/index.html +13 -58
  185. package/coverage/core/api/models/messages.model.mongodb.js.html +35 -35
  186. package/coverage/core/api/models/organisations.model.mongodb.js.html +3 -3
  187. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  188. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  189. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  190. package/coverage/core/api/services/account/account.service.js.html +67 -67
  191. package/coverage/core/api/services/account/index.html +16 -16
  192. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  193. package/coverage/core/api/services/authorisations/authorisations.service.js.html +141 -144
  194. package/coverage/core/api/services/authorisations/index.html +19 -19
  195. package/coverage/core/api/services/databases/databases.hooks.js.html +82 -82
  196. package/coverage/core/api/services/databases/databases.service.js.html +20 -20
  197. package/coverage/core/api/services/databases/index.html +32 -32
  198. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  199. package/coverage/core/api/services/groups/index.html +1 -1
  200. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  201. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  202. package/coverage/core/api/services/import-export/index.html +1 -1
  203. package/coverage/core/api/services/index.html +21 -21
  204. package/coverage/core/api/services/index.js.html +118 -154
  205. package/coverage/core/api/services/mailer/index.html +1 -1
  206. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  207. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  208. package/coverage/core/api/services/messages/index.html +21 -21
  209. package/coverage/core/api/services/messages/messages.hooks.js.html +89 -86
  210. package/coverage/core/api/services/organisations/index.html +1 -1
  211. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  212. package/coverage/core/api/services/organisations/organisations.service.js.html +23 -23
  213. package/coverage/core/api/services/push/index.html +1 -1
  214. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  215. package/coverage/core/api/services/push/push.service.js.html +1 -1
  216. package/coverage/core/api/services/storage/index.html +5 -5
  217. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  218. package/coverage/core/api/services/storage/storage.service.js.html +27 -27
  219. package/coverage/core/api/services/tags/index.html +1 -1
  220. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  221. package/coverage/core/api/services/users/index.html +23 -8
  222. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  223. package/coverage/core/api/services/users/users.service.js.html +100 -0
  224. package/coverage/core/api/utils.js.html +1 -1
  225. package/coverage/core/common/errors.js.html +1 -1
  226. package/coverage/core/common/index.html +42 -27
  227. package/coverage/core/common/index.js.html +1 -1
  228. package/coverage/core/common/permissions.js.html +195 -510
  229. package/coverage/core/common/schema.js.html +1 -1
  230. package/coverage/core/common/utils.js.html +12 -6
  231. package/coverage/core/common/utils.offline.js.html +199 -0
  232. package/coverage/index.html +142 -172
  233. package/coverage/lcov-report/core/api/application.js.html +296 -296
  234. package/coverage/lcov-report/core/api/authentication.js.html +206 -74
  235. package/coverage/lcov-report/core/api/db.js.html +61 -61
  236. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +15 -189
  237. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +180 -462
  238. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  239. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +16 -16
  240. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +69 -57
  241. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  242. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +58 -46
  243. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +142 -142
  244. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +1 -1
  245. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  246. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  247. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +54 -327
  248. package/coverage/lcov-report/core/api/hooks/index.html +64 -94
  249. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  250. package/coverage/lcov-report/core/api/index.html +41 -56
  251. package/coverage/lcov-report/core/api/index.js.html +1 -1
  252. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  253. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  254. package/coverage/lcov-report/core/api/models/index.html +13 -58
  255. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +35 -35
  256. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +3 -3
  257. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  258. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  259. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  260. package/coverage/lcov-report/core/api/services/account/account.service.js.html +67 -67
  261. package/coverage/lcov-report/core/api/services/account/index.html +16 -16
  262. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  263. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +141 -144
  264. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  265. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +82 -82
  266. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +20 -20
  267. package/coverage/lcov-report/core/api/services/databases/index.html +32 -32
  268. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  269. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  270. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  271. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  272. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  273. package/coverage/lcov-report/core/api/services/index.html +21 -21
  274. package/coverage/lcov-report/core/api/services/index.js.html +118 -154
  275. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  276. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  277. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  278. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  279. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +89 -86
  280. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  281. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  282. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +23 -23
  283. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  284. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  285. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  286. package/coverage/lcov-report/core/api/services/storage/index.html +5 -5
  287. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  288. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +27 -27
  289. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  290. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  291. package/coverage/lcov-report/core/api/services/users/index.html +23 -8
  292. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  293. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  294. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  295. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  296. package/coverage/lcov-report/core/common/index.html +42 -27
  297. package/coverage/lcov-report/core/common/index.js.html +1 -1
  298. package/coverage/lcov-report/core/common/permissions.js.html +195 -510
  299. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  300. package/coverage/lcov-report/core/common/utils.js.html +12 -6
  301. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  302. package/coverage/lcov-report/index.html +142 -172
  303. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +125 -29
  304. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  305. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +20 -44
  306. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  307. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  308. package/coverage/lcov-report/map/api/index.html +1 -1
  309. package/coverage/lcov-report/map/api/index.js.html +1 -1
  310. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  311. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  312. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +49 -7
  313. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  314. package/coverage/lcov-report/map/api/models/index.html +22 -7
  315. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  316. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +112 -0
  317. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  318. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  319. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  320. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +29 -11
  321. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  322. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  323. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  324. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +78 -9
  325. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  326. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  327. package/coverage/lcov-report/map/api/services/index.html +5 -5
  328. package/coverage/lcov-report/map/api/services/index.js.html +287 -50
  329. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  330. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  331. package/coverage/lcov-report/map/api/services/styles/index.html +116 -0
  332. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +196 -0
  333. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  334. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  335. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +8 -5
  336. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  337. package/coverage/lcov-report/map/common/index.html +7 -7
  338. package/coverage/lcov-report/map/common/index.js.html +1 -1
  339. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  340. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  341. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  342. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  343. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  344. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  345. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  346. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  347. package/coverage/lcov-report/map/common/wcs-utils.js.html +9 -9
  348. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  349. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  350. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  351. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  352. package/coverage/lcov.info +2581 -3278
  353. package/coverage/map/api/hooks/hooks.catalog.js.html +125 -29
  354. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  355. package/coverage/map/api/hooks/hooks.query.js.html +20 -44
  356. package/coverage/map/api/hooks/index.html +7 -7
  357. package/coverage/map/api/hooks/index.js.html +1 -1
  358. package/coverage/map/api/index.html +1 -1
  359. package/coverage/map/api/index.js.html +1 -1
  360. package/coverage/map/api/marshall.js.html +1 -1
  361. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  362. package/coverage/map/api/models/catalog.model.mongodb.js.html +49 -7
  363. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  364. package/coverage/map/api/models/index.html +22 -7
  365. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  366. package/coverage/map/api/models/styles.model.mongodb.js.html +112 -0
  367. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  368. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  369. package/coverage/map/api/services/alerts/index.html +1 -1
  370. package/coverage/map/api/services/catalog/catalog.hooks.js.html +29 -11
  371. package/coverage/map/api/services/catalog/index.html +5 -5
  372. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  373. package/coverage/map/api/services/daptiles/index.html +1 -1
  374. package/coverage/map/api/services/features/features.hooks.js.html +78 -9
  375. package/coverage/map/api/services/features/features.service.js.html +307 -4
  376. package/coverage/map/api/services/features/index.html +7 -7
  377. package/coverage/map/api/services/index.html +5 -5
  378. package/coverage/map/api/services/index.js.html +287 -50
  379. package/coverage/map/api/services/projects/index.html +1 -1
  380. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  381. package/coverage/map/api/services/styles/index.html +116 -0
  382. package/coverage/map/api/services/styles/styles.hooks.js.html +196 -0
  383. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  384. package/coverage/map/common/errors.js.html +1 -1
  385. package/coverage/map/common/geotiff-grid-source.js.html +8 -5
  386. package/coverage/map/common/grid.js.html +1 -1
  387. package/coverage/map/common/index.html +7 -7
  388. package/coverage/map/common/index.js.html +1 -1
  389. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  390. package/coverage/map/common/moment-utils.js.html +1 -1
  391. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  392. package/coverage/map/common/opendap-utils.js.html +1 -1
  393. package/coverage/map/common/permissions.js.html +10 -4
  394. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  395. package/coverage/map/common/tms-utils.js.html +6 -6
  396. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  397. package/coverage/map/common/wcs-utils.js.html +9 -9
  398. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  399. package/coverage/map/common/wfs-utils.js.html +11 -11
  400. package/coverage/map/common/wms-utils.js.html +8 -8
  401. package/coverage/map/common/wmts-utils.js.html +7 -7
  402. package/coverage/tmp/coverage-323534-1747828879483-0.json +1 -0
  403. package/coverage/tmp/coverage-323546-1747828879453-0.json +1 -0
  404. package/coverage/tmp/coverage-323557-1747828879439-0.json +1 -0
  405. package/coverage/tmp/coverage-323569-1747828879416-0.json +1 -0
  406. package/coverage/tmp/coverage-323576-1747828879390-0.json +1 -0
  407. package/extras/configs/helpers.js +78 -0
  408. package/extras/configs/panes.left.js +118 -0
  409. package/extras/configs/panes.top.js +222 -0
  410. package/extras/configs/stickies.js +57 -0
  411. package/extras/configs/widgets.left.js +23 -0
  412. package/extras/configs/widgets.top.js +73 -0
  413. package/extras/css/core.variables.scss +8 -0
  414. package/extras/images/north.svg +3 -0
  415. package/extras/tours/map/side-nav.js +3 -3
  416. package/map/api/hooks/hooks.catalog.js +56 -23
  417. package/map/api/hooks/hooks.query.js +16 -24
  418. package/map/api/models/catalog.model.mongodb.js +16 -2
  419. package/{core/api/models/groups.model.mongodb.js → map/api/models/styles.model.mongodb.js} +2 -1
  420. package/map/api/services/catalog/catalog.hooks.js +13 -7
  421. package/map/api/services/features/features.hooks.js +28 -5
  422. package/map/api/services/features/features.service.js +101 -0
  423. package/map/api/services/index.js +125 -46
  424. package/map/api/services/styles/styles.hooks.js +37 -0
  425. package/map/client/cesium/utils/index.js +1 -0
  426. package/map/client/cesium/utils/utils.cesium.js +397 -0
  427. package/map/client/cesium/utils/utils.features.js +8 -0
  428. package/map/client/cesium/utils/utils.geojson.js +59 -0
  429. package/map/client/cesium/utils/utils.style.js +134 -17
  430. package/map/client/components/KEditLayerData.vue +17 -79
  431. package/map/client/components/KFeatureEditor.vue +2 -7
  432. package/map/client/components/KFeaturesChart.vue +2 -6
  433. package/map/client/components/KFeaturesFilterEditor.vue +300 -0
  434. package/map/client/components/KFeaturesFilterManager.vue +196 -0
  435. package/map/client/components/KFeaturesTable.vue +0 -5
  436. package/map/client/components/KFilterCondition.vue +303 -0
  437. package/map/client/components/KLayerEditionToolbar.vue +4 -3
  438. package/map/client/components/KLayerEditor.vue +451 -36
  439. package/map/client/components/KMeasureTool.vue +36 -9
  440. package/map/client/components/KProjectMenu.vue +14 -8
  441. package/map/client/components/catalog/KAddLayer.vue +0 -4
  442. package/map/client/components/catalog/KBaseLayersSelector.vue +42 -46
  443. package/map/client/components/catalog/KConnectLayer.vue +295 -291
  444. package/map/client/components/catalog/KCreateLayer.vue +141 -146
  445. package/map/client/components/catalog/KCreateOfflineView.vue +100 -0
  446. package/map/client/components/catalog/KCreateView.vue +2 -8
  447. package/map/client/components/catalog/KFilteredLayerItem.vue +72 -25
  448. package/map/client/components/catalog/KImportLayer.vue +121 -129
  449. package/map/client/components/catalog/KLayerItem.vue +44 -32
  450. package/map/client/components/catalog/KLayersPanel.vue +45 -17
  451. package/map/client/components/catalog/KLayersSelector.vue +51 -50
  452. package/map/client/components/catalog/KProjectManager.vue +4 -8
  453. package/map/client/components/catalog/KProjectSelector.vue +33 -2
  454. package/map/client/components/catalog/KProjectsPanel.vue +84 -106
  455. package/map/client/components/catalog/KSelectLayers.vue +56 -69
  456. package/map/client/components/catalog/KSelectViews.vue +56 -69
  457. package/map/client/components/catalog/KViewSelector.vue +32 -2
  458. package/map/client/components/catalog/KViewsPanel.vue +178 -110
  459. package/map/client/components/catalog/KWeatherLayersSelector.vue +77 -85
  460. package/map/client/components/form/KLocationField.vue +21 -2
  461. package/map/client/components/form/KOwsLayerField.vue +1 -1
  462. package/map/client/components/form/KOwsServiceField.vue +102 -63
  463. package/map/client/components/form/KSelectLayersField.vue +1 -1
  464. package/map/client/components/form/KSelectViewsField.vue +1 -1
  465. package/map/client/components/form/KTimezoneField.vue +0 -1
  466. package/map/client/components/legend/KLegend.vue +4 -4
  467. package/map/client/components/location/KLocationCardSection.vue +16 -0
  468. package/map/client/components/location/KLocationMap.vue +3 -2
  469. package/map/client/components/location/KLocationSearch.vue +46 -8
  470. package/map/client/components/location/KLocationTimeLineCard.vue +25 -3
  471. package/map/client/components/location/KLocationTip.vue +57 -10
  472. package/map/client/components/selection/KFeaturesSelection.vue +71 -0
  473. package/map/client/components/selection/KSelectedLayerFeatures.vue +343 -0
  474. package/map/client/components/{KAttribution.vue → stickies/KAttribution.vue} +39 -33
  475. package/map/client/components/stickies/KLevelSlider.vue +114 -0
  476. package/map/client/components/stickies/KNorthArrow.vue +26 -0
  477. package/map/client/components/stickies/KPosition.vue +103 -0
  478. package/map/client/components/stickies/KTarget.vue +34 -0
  479. package/map/client/components/styles/KLayerStyleAction.vue +58 -0
  480. package/map/client/components/styles/KStyleEditor.vue +273 -0
  481. package/map/client/components/styles/KStyleEditorSection.vue +79 -0
  482. package/map/client/components/styles/KStyleManager.vue +183 -0
  483. package/map/client/components/styles/KStylePreview.vue +64 -0
  484. package/map/client/components/styles/KStylePreviewItem.vue +68 -0
  485. package/map/client/components/styles/KStylePropertiesGroup.vue +76 -0
  486. package/map/client/components/styles/KStyleProperty.vue +136 -0
  487. package/map/client/components/styles/KStyleTip.vue +118 -0
  488. package/map/client/components/tools/KGeolocateTool.vue +3 -2
  489. package/map/client/components/tools/KSearchTool.vue +34 -6
  490. package/map/client/components/widget/KMapillaryViewer.vue +1 -1
  491. package/map/client/components/widget/KStackableTimeSeries.vue +8 -5
  492. package/map/client/composables/activity.js +29 -43
  493. package/map/client/composables/catalog.js +1 -1
  494. package/map/client/composables/highlight.js +117 -57
  495. package/map/client/composables/location.js +33 -14
  496. package/map/client/composables/project.js +9 -10
  497. package/map/client/composables/selection.js +136 -23
  498. package/map/client/geocoder.js +104 -0
  499. package/map/client/geolocation.js +1 -1
  500. package/map/client/globe.js +3 -0
  501. package/map/client/hooks/hooks.offline.js +95 -0
  502. package/map/client/hooks/index.js +1 -0
  503. package/map/client/i18n/map_en.json +159 -94
  504. package/map/client/i18n/map_fr.json +186 -127
  505. package/map/client/index.js +3 -0
  506. package/map/client/init.js +44 -8
  507. package/map/client/leaflet/BoxSelection.js +2 -2
  508. package/map/client/leaflet/GradientPath.js +84 -4
  509. package/map/client/leaflet/WindBarb.js +323 -0
  510. package/map/client/leaflet/utils/index.js +1 -0
  511. package/map/client/leaflet/utils/utils.events.js +8 -3
  512. package/map/client/leaflet/utils/utils.geojson.js +221 -0
  513. package/map/client/leaflet/utils/utils.style.js +10 -9
  514. package/map/client/map.js +3 -0
  515. package/map/client/mixins/globe/mixin.base-globe.js +151 -19
  516. package/map/client/mixins/globe/mixin.geojson-layers.js +208 -86
  517. package/map/client/mixins/globe/mixin.popup.js +3 -2
  518. package/map/client/mixins/globe/mixin.style.js +3 -1
  519. package/map/client/mixins/globe/mixin.tooltip.js +3 -2
  520. package/map/client/mixins/map/index.js +1 -3
  521. package/map/client/mixins/map/mixin.base-map.js +267 -79
  522. package/map/client/mixins/map/mixin.canvas-layers.js +44 -10
  523. package/map/client/mixins/map/mixin.edit-layers.js +142 -57
  524. package/map/client/mixins/map/mixin.geojson-layers.js +127 -204
  525. package/map/client/mixins/map/mixin.pmtiles-layers.js +24 -11
  526. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +1 -2
  527. package/map/client/mixins/map/mixin.tiled-wind-layers.js +2 -1
  528. package/map/client/mixins/mixin.activity.js +61 -41
  529. package/map/client/mixins/mixin.context.js +19 -14
  530. package/map/client/mixins/mixin.feature-selection.js +0 -1
  531. package/map/client/mixins/mixin.feature-service.js +41 -59
  532. package/map/client/mixins/mixin.weacast.js +1 -1
  533. package/map/client/navigator.js +38 -0
  534. package/map/client/pixi-utils.js +1 -1
  535. package/map/client/planets.js +1 -1
  536. package/map/client/readers/reader.kml.js +57 -1
  537. package/map/client/utils/index.js +1 -0
  538. package/map/client/utils/utils.capture.js +10 -7
  539. package/map/client/utils/utils.catalog.js +2 -2
  540. package/map/client/utils/utils.features.js +193 -39
  541. package/map/client/utils/utils.js +0 -21
  542. package/map/client/utils/utils.layers.js +381 -4
  543. package/map/client/utils/utils.location.js +39 -74
  544. package/map/client/utils/utils.offline.js +89 -0
  545. package/map/client/utils/utils.style.js +133 -80
  546. package/map/common/geotiff-grid-source.js +2 -1
  547. package/map/common/permissions.js +2 -0
  548. package/map/common/schemas/capture.create.json +4 -4
  549. package/map/common/schemas/catalog.update.json +18 -2
  550. package/map/common/schemas/projects.create.json +2 -2
  551. package/map/common/schemas/projects.update.json +2 -2
  552. package/map/common/tms-utils.js +5 -5
  553. package/map/common/wcs-grid-source.js +2 -2
  554. package/map/common/wcs-utils.js +8 -8
  555. package/map/common/wfs-utils.js +10 -10
  556. package/map/common/wms-utils.js +7 -7
  557. package/map/common/wmts-utils.js +6 -6
  558. package/package.json +7 -4
  559. package/test/api/core/account.test.js +0 -72
  560. package/test/api/core/authentication.test.js +184 -0
  561. package/test/api/core/config/default.cjs +1 -3
  562. package/test/api/core/index.test.js +33 -96
  563. package/test/api/core/offline.test.js +55 -0
  564. package/test/api/core/push.test.js +3 -3
  565. package/test/api/core/{test-log-2024-06-06.log → test-log-2025-02-05.log} +3 -3
  566. package/test/api/core/{test-log-2024-11-15.log → test-log-2025-05-21.log} +1 -9
  567. package/test/api/map/alerts.test.js +1 -1
  568. package/test/api/map/config/default.cjs +2 -1
  569. package/test/api/map/data/vigicrues.observations.Q.json +47042 -0
  570. package/test/api/map/index.test.js +113 -9
  571. package/test/api/map/style.test.js +62 -0
  572. package/test/client/core/layout.js +2 -2
  573. package/test/client/core/runner.js +1 -1
  574. package/test/client/core/utils.js +52 -0
  575. package/test/client/map/catalog.js +1 -0
  576. package/core/api/hooks/hooks.groups.js +0 -48
  577. package/core/api/hooks/hooks.organisations.js +0 -152
  578. package/core/api/models/organisations.model.mongodb.js +0 -3
  579. package/core/api/models/tags.model.mongodb.js +0 -10
  580. package/core/api/services/groups/groups.hooks.js +0 -31
  581. package/core/api/services/organisations/organisations.hooks.js +0 -31
  582. package/core/api/services/organisations/organisations.service.js +0 -86
  583. package/core/api/services/tags/tags.hooks.js +0 -31
  584. package/core/api/utils.js +0 -11
  585. package/core/client/components/KChipsPane.vue +0 -103
  586. package/core/client/components/document/index.js +0 -9
  587. package/core/client/components/team/KAddMember.vue +0 -378
  588. package/core/client/components/team/KAddTag.vue +0 -121
  589. package/core/client/components/team/KChangeRole.vue +0 -118
  590. package/core/client/components/team/KGroupCard.vue +0 -110
  591. package/core/client/components/team/KGroupsActivity.vue +0 -78
  592. package/core/client/components/team/KJoinGroup.vue +0 -132
  593. package/core/client/components/team/KMemberCard.vue +0 -328
  594. package/core/client/components/team/KMemberFilter.vue +0 -49
  595. package/core/client/components/team/KMembersActivity.vue +0 -136
  596. package/core/client/components/team/KOrganisationsActivity.vue +0 -51
  597. package/core/client/components/team/KTagCard.vue +0 -72
  598. package/core/client/components/team/KTagsActivity.vue +0 -73
  599. package/core/client/components/team/index.js +0 -9
  600. package/core/client/mixins/mixin.base-context.js +0 -54
  601. package/core/client/utils/utils.platform.js +0 -12
  602. package/core/common/schemas/groups.create.json +0 -28
  603. package/core/common/schemas/groups.update.json +0 -28
  604. package/core/common/schemas/organisations.create.json +0 -28
  605. package/core/common/schemas/organisations.update.json +0 -49
  606. package/core/common/schemas/tags.create.json +0 -35
  607. package/core/common/schemas/tags.update.json +0 -35
  608. package/coverage/tmp/coverage-280506-1731704745613-0.json +0 -1
  609. package/coverage/tmp/coverage-280518-1731704745599-0.json +0 -1
  610. package/coverage/tmp/coverage-280529-1731704745588-0.json +0 -1
  611. package/coverage/tmp/coverage-280541-1731704745574-0.json +0 -1
  612. package/coverage/tmp/coverage-280548-1731704745545-0.json +0 -1
  613. package/map/client/components/KFeaturesFilter.vue +0 -259
  614. package/map/client/components/KLayerStyleEditor.vue +0 -118
  615. package/map/client/components/KLayerStyleForm.vue +0 -740
  616. package/map/client/components/KLevelSlider.vue +0 -100
  617. package/map/client/components/KNorth.vue +0 -31
  618. package/map/client/components/KPositionIndicator.vue +0 -83
  619. package/map/client/components/catalog/KCreateProject.vue +0 -100
  620. package/map/client/mixins/map/mixin.forecast-layers.js +0 -81
  621. package/map/client/mixins/map/mixin.georaster-layers.js +0 -107
  622. package/test/api/core/team.test.js +0 -670
  623. package/test/api/core/test-log-2023-12-19.log +0 -7
  624. package/test/api/core/test-log-2024-01-04.log +0 -14
  625. package/test/api/core/test-log-2024-05-14.log +0 -6
  626. package/test/api/core/test-log-2024-06-26.log +0 -25
  627. package/test/api/core/test-log-2024-06-28.log +0 -2
  628. package/test/api/core/test-log-2024-07-09.log +0 -0
  629. package/test/api/core/test-log-2024-08-13.log +0 -69
  630. package/test/api/core/test-log-2024-10-28.log +0 -53
  631. package/test/api/core/test-log-2024-11-05.log +0 -30
  632. package/test/api/core/test-log-2024-11-18.log +0 -0
  633. package/test/api/core/test-log-2024-12-03.log +0 -30
  634. package/test/api/map/test-log-2023-11-24.log +0 -121
  635. package/test/api/map/test-log-2023-12-12.log +0 -29
  636. package/test/api/map/test-log-2023-12-13.log +0 -5
  637. package/test/api/map/test-log-2024-01-04.log +0 -2
  638. package/test/api/map/test-log-2024-01-11.log +0 -1
  639. package/test/api/map/test-log-2024-01-25.log +0 -19
  640. package/test/api/map/test-log-2024-06-06.log +0 -39
  641. package/test/api/map/test-log-2024-08-13.log +0 -13
  642. package/test/api/map/test-log-2024-08-20.log +0 -55
  643. package/test/api/map/test-log-2024-09-09.log +0 -92
  644. package/test/api/map/test-log-2024-10-28.log +0 -11
  645. /package/extras/{logos → images}/kalisio.png +0 -0
  646. /package/extras/{icons → images}/target.svg +0 -0
  647. /package/test/api/map/data/{vigicrues.observations.json → vigicrues.observations.H.json} +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">88.78% </span>
26
+ <span class="strong">65.74% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>285/321</span>
28
+ <span class='fraction'>142/216</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">82.35% </span>
33
+ <span class="strong">72.22% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>42/51</span>
35
+ <span class='fraction'>13/18</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">53.57% </span>
40
+ <span class="strong">35.29% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>15/28</span>
42
+ <span class='fraction'>6/17</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">88.78% </span>
47
+ <span class="strong">65.74% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>285/321</span>
49
+ <span class='fraction'>142/216</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -279,290 +279,28 @@
279
279
  <a name='L214'></a><a href='#L214'>214</a>
280
280
  <a name='L215'></a><a href='#L215'>215</a>
281
281
  <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
388
- <span class="cline-any cline-yes">1x</span>
389
- <span class="cline-any cline-yes">1x</span>
390
- <span class="cline-any cline-yes">1x</span>
391
- <span class="cline-any cline-yes">1x</span>
392
- <span class="cline-any cline-yes">1x</span>
393
- <span class="cline-any cline-yes">1x</span>
394
- <span class="cline-any cline-yes">1x</span>
395
- <span class="cline-any cline-yes">1x</span>
396
- <span class="cline-any cline-yes">1x</span>
397
- <span class="cline-any cline-yes">1x</span>
398
- <span class="cline-any cline-yes">1x</span>
399
- <span class="cline-any cline-yes">1x</span>
400
- <span class="cline-any cline-yes">1x</span>
401
- <span class="cline-any cline-yes">1x</span>
402
- <span class="cline-any cline-yes">1x</span>
403
- <span class="cline-any cline-yes">1x</span>
404
- <span class="cline-any cline-yes">1x</span>
405
- <span class="cline-any cline-yes">1x</span>
406
- <span class="cline-any cline-yes">1x</span>
407
- <span class="cline-any cline-yes">1x</span>
408
- <span class="cline-any cline-yes">1x</span>
409
- <span class="cline-any cline-yes">1x</span>
410
- <span class="cline-any cline-yes">1x</span>
411
- <span class="cline-any cline-yes">1x</span>
412
- <span class="cline-any cline-yes">1x</span>
413
- <span class="cline-any cline-yes">1x</span>
414
- <span class="cline-any cline-yes">1x</span>
415
- <span class="cline-any cline-yes">1x</span>
416
- <span class="cline-any cline-yes">1x</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-yes">1x</span>
419
- <span class="cline-any cline-yes">44x</span>
420
- <span class="cline-any cline-yes">44x</span>
421
- <span class="cline-any cline-yes">44x</span>
422
- <span class="cline-any cline-yes">44x</span>
423
- <span class="cline-any cline-yes">44x</span>
424
- <span class="cline-any cline-yes">44x</span>
425
- <span class="cline-any cline-yes">24x</span>
426
- <span class="cline-any cline-yes">24x</span>
427
- <span class="cline-any cline-yes">24x</span>
428
- <span class="cline-any cline-yes">44x</span>
429
- <span class="cline-any cline-yes">16x</span>
430
- <span class="cline-any cline-yes">16x</span>
431
- <span class="cline-any cline-yes">44x</span>
282
+ <a name='L217'></a><a href='#L217'>217</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
432
283
  <span class="cline-any cline-yes">1x</span>
433
284
  <span class="cline-any cline-yes">1x</span>
434
285
  <span class="cline-any cline-yes">1x</span>
435
- <span class="cline-any cline-yes">49x</span>
436
- <span class="cline-any cline-yes">49x</span>
437
- <span class="cline-any cline-yes">49x</span>
438
- <span class="cline-any cline-yes">49x</span>
439
- <span class="cline-any cline-yes">49x</span>
440
- <span class="cline-any cline-yes">49x</span>
441
- <span class="cline-any cline-yes">49x</span>
442
- <span class="cline-any cline-yes">49x</span>
443
- <span class="cline-any cline-yes">49x</span>
444
- <span class="cline-any cline-yes">49x</span>
445
- <span class="cline-any cline-yes">49x</span>
446
- <span class="cline-any cline-yes">49x</span>
447
- <span class="cline-any cline-yes">49x</span>
448
- <span class="cline-any cline-yes">39x</span>
449
- <span class="cline-any cline-yes">39x</span>
450
- <span class="cline-any cline-yes">39x</span>
451
- <span class="cline-any cline-yes">39x</span>
452
- <span class="cline-any cline-yes">39x</span>
453
- <span class="cline-any cline-yes">39x</span>
454
- <span class="cline-any cline-yes">39x</span>
455
- <span class="cline-any cline-yes">39x</span>
456
- <span class="cline-any cline-yes">39x</span>
457
- <span class="cline-any cline-yes">39x</span>
458
- <span class="cline-any cline-yes">39x</span>
459
- <span class="cline-any cline-yes">39x</span>
460
- <span class="cline-any cline-yes">39x</span>
461
- <span class="cline-any cline-yes">39x</span>
462
- <span class="cline-any cline-yes">39x</span>
463
- <span class="cline-any cline-yes">39x</span>
464
- <span class="cline-any cline-yes">39x</span>
465
- <span class="cline-any cline-yes">39x</span>
466
- <span class="cline-any cline-yes">39x</span>
467
- <span class="cline-any cline-yes">49x</span>
468
286
  <span class="cline-any cline-yes">1x</span>
469
287
  <span class="cline-any cline-yes">1x</span>
470
288
  <span class="cline-any cline-yes">1x</span>
471
- <span class="cline-any cline-yes">49x</span>
472
- <span class="cline-any cline-yes">49x</span>
473
- <span class="cline-any cline-yes">49x</span>
474
- <span class="cline-any cline-yes">49x</span>
475
- <span class="cline-any cline-yes">125x</span>
476
- <span class="cline-any cline-yes">49x</span>
477
- <span class="cline-any cline-yes">49x</span>
478
- <span class="cline-any cline-yes">49x</span>
479
- <span class="cline-any cline-yes">49x</span>
480
- <span class="cline-any cline-yes">49x</span>
481
- <span class="cline-any cline-yes">49x</span>
482
- <span class="cline-any cline-yes">33x</span>
483
- <span class="cline-any cline-no">&nbsp;</span>
484
- <span class="cline-any cline-no">&nbsp;</span>
485
- <span class="cline-any cline-yes">33x</span>
486
- <span class="cline-any cline-yes">49x</span>
487
- <span class="cline-any cline-yes">49x</span>
488
- <span class="cline-any cline-yes">49x</span>
489
- <span class="cline-any cline-yes">49x</span>
490
289
  <span class="cline-any cline-yes">1x</span>
491
290
  <span class="cline-any cline-yes">1x</span>
492
- <span class="cline-any cline-yes">8x</span>
493
- <span class="cline-any cline-yes">3x</span>
494
- <span class="cline-any cline-yes">3x</span>
495
- <span class="cline-any cline-yes">8x</span>
496
291
  <span class="cline-any cline-yes">1x</span>
497
292
  <span class="cline-any cline-yes">1x</span>
498
- <span class="cline-any cline-no">&nbsp;</span>
499
- <span class="cline-any cline-no">&nbsp;</span>
500
293
  <span class="cline-any cline-yes">1x</span>
501
294
  <span class="cline-any cline-yes">1x</span>
502
- <span class="cline-any cline-yes">63x</span>
503
- <span class="cline-any cline-yes">63x</span>
504
- <span class="cline-any cline-yes">63x</span>
505
- <span class="cline-any cline-yes">63x</span>
506
- <span class="cline-any cline-yes">63x</span>
507
- <span class="cline-any cline-yes">63x</span>
508
- <span class="cline-any cline-yes">63x</span>
509
- <span class="cline-any cline-yes">63x</span>
510
- <span class="cline-any cline-yes">3x</span>
511
- <span class="cline-any cline-yes">63x</span>
512
- <span class="cline-any cline-yes">1x</span>
513
295
  <span class="cline-any cline-yes">1x</span>
514
- <span class="cline-any cline-yes">33x</span>
515
- <span class="cline-any cline-yes">33x</span>
516
- <span class="cline-any cline-yes">33x</span>
517
- <span class="cline-any cline-yes">33x</span>
518
- <span class="cline-any cline-yes">33x</span>
519
- <span class="cline-any cline-yes">33x</span>
520
- <span class="cline-any cline-yes">33x</span>
521
- <span class="cline-any cline-yes">33x</span>
522
- <span class="cline-any cline-yes">33x</span>
523
- <span class="cline-any cline-yes">33x</span>
524
- <span class="cline-any cline-yes">33x</span>
525
296
  <span class="cline-any cline-yes">1x</span>
526
297
  <span class="cline-any cline-yes">1x</span>
527
298
  <span class="cline-any cline-yes">1x</span>
528
- <span class="cline-any cline-yes">42x</span>
529
- <span class="cline-any cline-yes">63x</span>
530
- <span class="cline-any cline-yes">63x</span>
531
- <span class="cline-any cline-yes">63x</span>
532
- <span class="cline-any cline-yes">9x</span>
533
- <span class="cline-any cline-yes">63x</span>
534
- <span class="cline-any cline-yes">9x</span>
535
- <span class="cline-any cline-yes">9x</span>
536
- <span class="cline-any cline-yes">9x</span>
537
- <span class="cline-any cline-yes">9x</span>
538
- <span class="cline-any cline-yes">9x</span>
539
- <span class="cline-any cline-yes">54x</span>
540
- <span class="cline-any cline-yes">6x</span>
541
- <span class="cline-any cline-yes">6x</span>
542
- <span class="cline-any cline-yes">6x</span>
543
- <span class="cline-any cline-yes">6x</span>
544
- <span class="cline-any cline-yes">42x</span>
545
- <span class="cline-any cline-yes">42x</span>
546
- <span class="cline-any cline-yes">42x</span>
547
299
  <span class="cline-any cline-yes">1x</span>
548
300
  <span class="cline-any cline-yes">1x</span>
549
301
  <span class="cline-any cline-yes">1x</span>
550
302
  <span class="cline-any cline-yes">1x</span>
551
- <span class="cline-any cline-yes">25x</span>
552
- <span class="cline-any cline-yes">25x</span>
553
- <span class="cline-any cline-yes">25x</span>
554
- <span class="cline-any cline-yes">25x</span>
555
- <span class="cline-any cline-yes">25x</span>
556
- <span class="cline-any cline-yes">25x</span>
557
- <span class="cline-any cline-yes">25x</span>
558
303
  <span class="cline-any cline-yes">1x</span>
559
- <span class="cline-any cline-yes">6x</span>
560
- <span class="cline-any cline-yes">6x</span>
561
- <span class="cline-any cline-yes">6x</span>
562
- <span class="cline-any cline-yes">6x</span>
563
- <span class="cline-any cline-yes">6x</span>
564
- <span class="cline-any cline-yes">6x</span>
565
- <span class="cline-any cline-yes">6x</span>
566
304
  <span class="cline-any cline-yes">1x</span>
567
305
  <span class="cline-any cline-yes">1x</span>
568
306
  <span class="cline-any cline-yes">1x</span>
@@ -572,105 +310,151 @@
572
310
  <span class="cline-any cline-yes">1x</span>
573
311
  <span class="cline-any cline-yes">1x</span>
574
312
  <span class="cline-any cline-yes">1x</span>
575
- <span class="cline-any cline-yes">5x</span>
576
- <span class="cline-any cline-yes">5x</span>
577
- <span class="cline-any cline-yes">5x</span>
578
- <span class="cline-any cline-yes">5x</span>
579
- <span class="cline-any cline-yes">5x</span>
580
- <span class="cline-any cline-yes">5x</span>
581
- <span class="cline-any cline-yes">5x</span>
582
313
  <span class="cline-any cline-yes">1x</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
324
+ <span class="cline-any cline-no">&nbsp;</span>
325
+ <span class="cline-any cline-no">&nbsp;</span>
326
+ <span class="cline-any cline-no">&nbsp;</span>
583
327
  <span class="cline-any cline-yes">1x</span>
584
328
  <span class="cline-any cline-yes">1x</span>
585
- <span class="cline-any cline-yes">38x</span>
586
- <span class="cline-any cline-yes">34x</span>
587
- <span class="cline-any cline-yes">34x</span>
588
- <span class="cline-any cline-yes">34x</span>
589
- <span class="cline-any cline-yes">34x</span>
590
- <span class="cline-any cline-yes">34x</span>
591
- <span class="cline-any cline-yes">32x</span>
592
- <span class="cline-any cline-yes">44x</span>
593
- <span class="cline-any cline-yes">44x</span>
594
- <span class="cline-any cline-yes">44x</span>
595
- <span class="cline-any cline-yes">44x</span>
596
- <span class="cline-any cline-yes">44x</span>
597
- <span class="cline-any cline-yes">44x</span>
598
- <span class="cline-any cline-yes">44x</span>
599
- <span class="cline-any cline-yes">44x</span>
600
- <span class="cline-any cline-yes">44x</span>
601
- <span class="cline-any cline-yes">44x</span>
602
- <span class="cline-any cline-yes">44x</span>
603
- <span class="cline-any cline-yes">44x</span>
604
- <span class="cline-any cline-yes">44x</span>
605
- <span class="cline-any cline-yes">44x</span>
606
- <span class="cline-any cline-yes">44x</span>
607
- <span class="cline-any cline-yes">44x</span>
608
- <span class="cline-any cline-yes">44x</span>
609
- <span class="cline-any cline-yes">44x</span>
610
- <span class="cline-any cline-yes">44x</span>
611
- <span class="cline-any cline-yes">24x</span>
612
- <span class="cline-any cline-yes">24x</span>
613
- <span class="cline-any cline-yes">24x</span>
614
- <span class="cline-any cline-yes">24x</span>
615
- <span class="cline-any cline-yes">24x</span>
616
- <span class="cline-any cline-yes">24x</span>
617
- <span class="cline-any cline-yes">24x</span>
618
- <span class="cline-any cline-yes">24x</span>
619
- <span class="cline-any cline-yes">44x</span>
620
- <span class="cline-any cline-yes">32x</span>
621
- <span class="cline-any cline-yes">32x</span>
622
- <span class="cline-any cline-yes">34x</span>
623
- <span class="cline-any cline-yes">38x</span>
624
329
  <span class="cline-any cline-yes">1x</span>
330
+ <span class="cline-any cline-yes">9x</span>
331
+ <span class="cline-any cline-yes">9x</span>
332
+ <span class="cline-any cline-yes">9x</span>
333
+ <span class="cline-any cline-yes">9x</span>
334
+ <span class="cline-any cline-yes">9x</span>
335
+ <span class="cline-any cline-yes">9x</span>
336
+ <span class="cline-any cline-yes">9x</span>
337
+ <span class="cline-any cline-yes">9x</span>
338
+ <span class="cline-any cline-yes">9x</span>
339
+ <span class="cline-any cline-yes">9x</span>
340
+ <span class="cline-any cline-yes">9x</span>
341
+ <span class="cline-any cline-yes">9x</span>
342
+ <span class="cline-any cline-yes">9x</span>
343
+ <span class="cline-any cline-yes">3x</span>
344
+ <span class="cline-any cline-yes">3x</span>
345
+ <span class="cline-any cline-yes">3x</span>
346
+ <span class="cline-any cline-yes">3x</span>
347
+ <span class="cline-any cline-yes">3x</span>
348
+ <span class="cline-any cline-yes">3x</span>
349
+ <span class="cline-any cline-yes">3x</span>
350
+ <span class="cline-any cline-yes">3x</span>
351
+ <span class="cline-any cline-yes">3x</span>
352
+ <span class="cline-any cline-yes">3x</span>
353
+ <span class="cline-any cline-yes">3x</span>
354
+ <span class="cline-any cline-yes">3x</span>
355
+ <span class="cline-any cline-yes">3x</span>
356
+ <span class="cline-any cline-yes">3x</span>
357
+ <span class="cline-any cline-yes">3x</span>
358
+ <span class="cline-any cline-yes">3x</span>
359
+ <span class="cline-any cline-yes">3x</span>
360
+ <span class="cline-any cline-yes">3x</span>
361
+ <span class="cline-any cline-yes">3x</span>
362
+ <span class="cline-any cline-yes">9x</span>
625
363
  <span class="cline-any cline-yes">1x</span>
626
364
  <span class="cline-any cline-yes">1x</span>
627
- <span class="cline-any cline-yes">38x</span>
628
- <span class="cline-any cline-yes">34x</span>
629
- <span class="cline-any cline-yes">20x</span>
630
- <span class="cline-any cline-yes">10x</span>
631
- <span class="cline-any cline-yes">10x</span>
632
- <span class="cline-any cline-yes">10x</span>
633
- <span class="cline-any cline-yes">10x</span>
634
- <span class="cline-any cline-yes">10x</span>
635
- <span class="cline-any cline-yes">10x</span>
636
- <span class="cline-any cline-yes">10x</span>
637
- <span class="cline-any cline-yes">10x</span>
638
- <span class="cline-any cline-yes">2x</span>
639
- <span class="cline-any cline-yes">2x</span>
640
- <span class="cline-any cline-yes">10x</span>
641
- <span class="cline-any cline-yes">20x</span>
642
- <span class="cline-any cline-yes">20x</span>
643
- <span class="cline-any cline-yes">34x</span>
644
- <span class="cline-any cline-yes">38x</span>
645
365
  <span class="cline-any cline-yes">1x</span>
366
+ <span class="cline-any cline-yes">9x</span>
367
+ <span class="cline-any cline-yes">9x</span>
368
+ <span class="cline-any cline-yes">9x</span>
369
+ <span class="cline-any cline-yes">9x</span>
370
+ <span class="cline-any cline-yes">9x</span>
371
+ <span class="cline-any cline-yes">9x</span>
372
+ <span class="cline-any cline-yes">9x</span>
373
+ <span class="cline-any cline-yes">9x</span>
374
+ <span class="cline-any cline-yes">9x</span>
375
+ <span class="cline-any cline-yes">9x</span>
376
+ <span class="cline-any cline-yes">9x</span>
377
+ <span class="cline-any cline-yes">3x</span>
378
+ <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-yes">3x</span>
381
+ <span class="cline-any cline-yes">9x</span>
382
+ <span class="cline-any cline-yes">9x</span>
383
+ <span class="cline-any cline-yes">9x</span>
384
+ <span class="cline-any cline-yes">9x</span>
646
385
  <span class="cline-any cline-yes">1x</span>
647
386
  <span class="cline-any cline-yes">1x</span>
387
+ <span class="cline-any cline-yes">5x</span>
648
388
  <span class="cline-any cline-yes">1x</span>
649
389
  <span class="cline-any cline-yes">1x</span>
390
+ <span class="cline-any cline-yes">5x</span>
650
391
  <span class="cline-any cline-yes">1x</span>
651
392
  <span class="cline-any cline-yes">1x</span>
652
393
  <span class="cline-any cline-no">&nbsp;</span>
653
394
  <span class="cline-any cline-no">&nbsp;</span>
654
395
  <span class="cline-any cline-yes">1x</span>
655
396
  <span class="cline-any cline-yes">1x</span>
397
+ <span class="cline-any cline-yes">4x</span>
398
+ <span class="cline-any cline-yes">4x</span>
399
+ <span class="cline-any cline-yes">4x</span>
400
+ <span class="cline-any cline-yes">4x</span>
401
+ <span class="cline-any cline-yes">4x</span>
402
+ <span class="cline-any cline-yes">4x</span>
403
+ <span class="cline-any cline-yes">4x</span>
404
+ <span class="cline-any cline-yes">4x</span>
405
+ <span class="cline-any cline-yes">4x</span>
656
406
  <span class="cline-any cline-yes">1x</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-yes">4x</span>
659
408
  <span class="cline-any cline-yes">1x</span>
660
409
  <span class="cline-any cline-yes">1x</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
410
+ <span class="cline-any cline-yes">3x</span>
411
+ <span class="cline-any cline-yes">3x</span>
412
+ <span class="cline-any cline-yes">3x</span>
413
+ <span class="cline-any cline-yes">3x</span>
414
+ <span class="cline-any cline-yes">3x</span>
415
+ <span class="cline-any cline-yes">3x</span>
416
+ <span class="cline-any cline-yes">3x</span>
417
+ <span class="cline-any cline-yes">3x</span>
418
+ <span class="cline-any cline-yes">3x</span>
419
+ <span class="cline-any cline-yes">3x</span>
420
+ <span class="cline-any cline-yes">3x</span>
663
421
  <span class="cline-any cline-yes">1x</span>
664
422
  <span class="cline-any cline-yes">1x</span>
665
423
  <span class="cline-any cline-yes">1x</span>
666
424
  <span class="cline-any cline-no">&nbsp;</span>
667
425
  <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-no">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-no">&nbsp;</span>
438
+ <span class="cline-any cline-no">&nbsp;</span>
439
+ <span class="cline-any cline-no">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-yes">1x</span>
444
+ <span class="cline-any cline-yes">1x</span>
668
445
  <span class="cline-any cline-yes">1x</span>
669
446
  <span class="cline-any cline-yes">1x</span>
670
447
  <span class="cline-any cline-no">&nbsp;</span>
671
448
  <span class="cline-any cline-no">&nbsp;</span>
449
+ <span class="cline-any cline-no">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
672
454
  <span class="cline-any cline-yes">1x</span>
673
- <span class="cline-any cline-yes">1x</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
674
458
  <span class="cline-any cline-no">&nbsp;</span>
675
459
  <span class="cline-any cline-no">&nbsp;</span>
676
460
  <span class="cline-any cline-no">&nbsp;</span>
@@ -681,10 +465,16 @@
681
465
  <span class="cline-any cline-no">&nbsp;</span>
682
466
  <span class="cline-any cline-no">&nbsp;</span>
683
467
  <span class="cline-any cline-no">&nbsp;</span>
468
+ <span class="cline-any cline-no">&nbsp;</span>
684
469
  <span class="cline-any cline-yes">1x</span>
685
470
  <span class="cline-any cline-yes">1x</span>
686
471
  <span class="cline-any cline-no">&nbsp;</span>
687
472
  <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-no">&nbsp;</span>
477
+ <span class="cline-any cline-no">&nbsp;</span>
688
478
  <span class="cline-any cline-yes">1x</span>
689
479
  <span class="cline-any cline-yes">1x</span>
690
480
  <span class="cline-any cline-no">&nbsp;</span>
@@ -736,20 +526,20 @@ let hooks = []
736
526
  export const RESOURCE_TYPE = 'type'
737
527
  export const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)
738
528
  &nbsp;
739
- export function defineResourceRules (subject, resource, resourceService, can) {
740
- const role = Roles[resource.permissions]
741
- &nbsp;
742
- if (role &gt;= Roles.member) {
743
- can('read', resourceService, { _id: resource._id })
744
- }
745
- if (role &gt;= Roles.manager) {
746
- can('update', resourceService, { _id: resource._id })
747
- can(['create', 'remove'], 'authorisations', { resource: resource._id })
748
- }
749
- if (role &gt;= Roles.owner) {
750
- can('remove', resourceService, { _id: resource._id })
751
- }
752
- }
529
+ export <span class="fstat-no" title="function not covered" >function defineResourceRules (subject, resource, resourceService, can) {</span>
530
+ <span class="cstat-no" title="statement not covered" > const role = Roles[resource.permissions]</span>
531
+ <span class="cstat-no" title="statement not covered" ></span>
532
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.member) {</span>
533
+ <span class="cstat-no" title="statement not covered" > can('read', resourceService, { _id: resource._id })</span>
534
+ <span class="cstat-no" title="statement not covered" > }</span>
535
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.manager) {</span>
536
+ <span class="cstat-no" title="statement not covered" > can('update', resourceService, { _id: resource._id })</span>
537
+ <span class="cstat-no" title="statement not covered" > can(['create', 'remove'], 'authorisations', { resource: resource._id })</span>
538
+ <span class="cstat-no" title="statement not covered" > }</span>
539
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.owner) {</span>
540
+ <span class="cstat-no" title="statement not covered" > can('remove', resourceService, { _id: resource._id })</span>
541
+ <span class="cstat-no" title="statement not covered" > }</span>
542
+ <span class="cstat-no" title="statement not covered" >}</span>
753
543
  &nbsp;
754
544
  // Hook computing default abilities for a given user
755
545
  export function defineUserAbilities (subject, can, cannot) {
@@ -822,13 +612,14 @@ defineAbilities.unregisterHook = <span class="fstat-no" title="function not cove
822
612
  export function hasServiceAbilities (abilities, service) {
823
613
  if (!abilities) <span class="branch-0 cbranch-no" title="branch not covered" >return false</span>
824
614
  // The unique identifier of a service is its path not its name.
825
- // Indeed we have for instance a 'groups' service in each organisation
615
+ // Indeed we have for instance a 'groups' service in each context
826
616
  // Take care that in client we have the service path while on server we have the actual object
827
617
  const path = typeof service === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >? service </span>: service.getPath()
828
618
  // */groups will allow to access any groups service in any context
619
+ const allContextsPath = _.replace(path, /^.*\//, '*/')
829
620
  return abilities.can('service', path) ||
830
621
  abilities.can('service', `*/${path}`) ||
831
- abilities.can('service', _.replace(path, /^.*\//, '*/'))
622
+ abilities.can('service', allContextsPath)
832
623
  }
833
624
  &nbsp;
834
625
  export function hasResourceAbilities (abilities, operation, resourceType, context, resource) {
@@ -837,7 +628,7 @@ export function hasResourceAbilities (abilities, operation, resourceType, contex
837
628
  const object = Object.assign({}, resource)
838
629
  object[RESOURCE_TYPE_KEY] = resourceType
839
630
  // Add a virtual context to take it into account for object having no link to it
840
- if (context) object.context = (typeof context === 'object' ? context._id.toString() <span class="branch-0 cbranch-no" title="branch not covered" >: context.toString())</span>
631
+ if (context) <span class="branch-0 cbranch-no" title="branch not covered" >object.context = (typeof context === 'object' ? context._id.toString() : context.toString())</span>
841
632
  &nbsp;
842
633
  const result = abilities.can(operation, object)
843
634
  &nbsp;
@@ -845,166 +636,60 @@ export function hasResourceAbilities (abilities, operation, resourceType, contex
845
636
  }
846
637
  &nbsp;
847
638
  // Utility function used to remove the virtual context from query
848
- export function removeContext (query) {
849
- _.forOwn(query, (value, key) =&gt; {
850
- // Process current attributes or recurse
851
- // Take care to nested fields like 'field._id'
852
- if (key === 'context') {
853
- delete query.context
854
- } else if (Array.isArray(value)) {
855
- value.forEach(item =&gt; removeContext(item))
856
- // Remove empty objects from array
857
- // _.remove(value, item =&gt; _.isEmpty(item))
858
- // Remove empty arrays from query
859
- if (_.isEmpty(value)) <span class="branch-0 cbranch-no" title="branch not covered" >delete query[key]</span>
860
- } else if (typeof value === 'object') {
861
- removeContext(value)
862
- // Remove empty objects from query
863
- if (_.isEmpty(value)) <span class="branch-0 cbranch-no" title="branch not covered" >delete query[key]</span>
864
- }
865
- })
866
- return query
867
- }
639
+ export <span class="fstat-no" title="function not covered" >function removeContext (query) {</span>
640
+ <span class="cstat-no" title="statement not covered" > _.forOwn(query, (value, key) =&gt; {</span>
641
+ <span class="cstat-no" title="statement not covered" > // Process current attributes or recurse</span>
642
+ <span class="cstat-no" title="statement not covered" > // Take care to nested fields like 'field._id'</span>
643
+ <span class="cstat-no" title="statement not covered" > if (key === 'context') {</span>
644
+ <span class="cstat-no" title="statement not covered" > delete query.context</span>
645
+ <span class="cstat-no" title="statement not covered" > } else if (Array.isArray(value)) {</span>
646
+ <span class="cstat-no" title="statement not covered" > value.forEach(item =&gt; removeContext(item))</span>
647
+ <span class="cstat-no" title="statement not covered" > // Remove empty objects from array</span>
648
+ <span class="cstat-no" title="statement not covered" > // _.remove(value, item =&gt; _.isEmpty(item))</span>
649
+ <span class="cstat-no" title="statement not covered" > // Remove empty arrays from query</span>
650
+ <span class="cstat-no" title="statement not covered" > if (_.isEmpty(value)) delete query[key]</span>
651
+ <span class="cstat-no" title="statement not covered" > } else if (typeof value === 'object') {</span>
652
+ <span class="cstat-no" title="statement not covered" > removeContext(value)</span>
653
+ <span class="cstat-no" title="statement not covered" > // Remove empty objects from query</span>
654
+ <span class="cstat-no" title="statement not covered" > if (_.isEmpty(value)) delete query[key]</span>
655
+ <span class="cstat-no" title="statement not covered" > }</span>
656
+ <span class="cstat-no" title="statement not covered" > })</span>
657
+ <span class="cstat-no" title="statement not covered" > return query</span>
658
+ <span class="cstat-no" title="statement not covered" >}</span>
868
659
  &nbsp;
869
660
  // Get the query used to filter the objects according to given abilities
870
661
  // A null query indicates that access should not be granted
871
- export function getQueryForAbilities (abilities, operation, resourceType) {
872
- if (!abilities) <span class="branch-0 cbranch-no" title="branch not covered" >return null</span>
873
- &nbsp;
874
- const query = toMongoQuery(abilities, resourceType, operation)
875
- // Remove any context to avoid taking it into account because it is not really stored on objects
876
- // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)
877
- return (query ? removeContext(_.cloneDeep(query)) : null)
878
- }
879
- &nbsp;
880
- function buildSubjectsQueryForResource (resourceScope, resourceId, role) {
881
- const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }
882
- if (role) {
883
- _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >? role </span>: RoleNames[role]))
884
- }
885
- return query
886
- }
887
- &nbsp;
888
- export function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {
889
- // Build the query
890
- const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)
891
- // Execute the query
892
- return subjectService.find({ query })
893
- }
894
- &nbsp;
895
- export function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {
896
- // Build the query
897
- const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)
898
- // Indicate we'd only like to count
899
- query.$limit = 0
900
- // Execute the query
901
- return subjectService.find({ query })
902
- }
903
- &nbsp;
904
- // Hook computing organisation abilities for a given user
905
- export function defineOrganisationAbilities (subject, can, cannot) {
906
- if (subject) {
907
- // Create new organisations
908
- can('service', 'organisations')
909
- can('create', 'organisations')
910
- &nbsp;
911
- if (subject.organisations) {
912
- subject.organisations.forEach(organisation =&gt; {
913
- if (organisation._id) {
914
- // Generic rules for resources
915
- defineResourceRules(subject, organisation, 'organisations', can)
916
- // Specific rules for organisations
917
- const role = Roles[organisation.permissions]
918
- if (role &gt;= Roles.member) {
919
- // The unique identifier of a service is its path not its name.
920
- // Indeed we have for instance a 'groups' service in each organisation.
921
- can('service', organisation._id.toString() + '/members')
922
- can('read', 'members', { context: organisation._id })
923
- can('service', organisation._id.toString() + '/tags')
924
- // Tags are public
925
- can('read', 'tags', { context: organisation._id })
926
- // Groups are private
927
- can('service', organisation._id.toString() + '/groups')
928
- can('service', organisation._id.toString() + '/storage')
929
- can(['read', 'create', 'remove', 'createMultipartUpload', 'completeMultipartUpload', 'uploadPart', 'putObject'], 'storage', { context: organisation._id })
930
- }
931
- if (role &gt;= Roles.manager) {
932
- can('update', 'members', { context: organisation._id })
933
- // Managers can manage all groups/tags
934
- can('all', 'groups', { context: organisation._id })
935
- can(['create', 'remove'], 'authorisations', { resourcesService: organisation._id.toString() + '/groups', scope: 'groups' })
936
- can('all', 'tags', { context: organisation._id })
937
- // Remove invited members
938
- can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })
939
- }
940
- }
941
- })
942
- }
943
- }
944
- }
945
- &nbsp;
946
- // Hook computing group abilities for a given user
947
- export function defineGroupAbilities (subject, can, cannot) {
948
- if (subject) {
949
- if (subject.groups) {
950
- subject.groups.forEach(group =&gt; {
951
- if (group._id) {
952
- // Specific rules for groups
953
- const role = Roles[group.permissions]
954
- &nbsp;
955
- if (role &gt;= Roles.member) {
956
- can('read', 'groups', { _id: group._id })
957
- }
958
- if (role &gt;= Roles.manager) {
959
- can(['create', 'remove'], 'authorisations', { resource: group._id, permissions: 'member' })
960
- }
961
- }
962
- })
963
- }
964
- }
965
- }
966
- &nbsp;
967
- // Helper functions to find the members of a given organisation
968
- export function findMembersOfOrganisation (usersService, organisationId, role) {
969
- return findSubjectsForResource(usersService, 'organisations', organisationId, role)
970
- }
971
- &nbsp;
972
- export <span class="fstat-no" title="function not covered" >function countMembersOfOrganisation (usersService, organisationId, role) {</span>
973
- <span class="cstat-no" title="statement not covered" > return countSubjectsForResource(usersService, 'organisations', organisationId, role)</span>
974
- <span class="cstat-no" title="statement not covered" >}</span>
975
- &nbsp;
976
- // Helper functions to find the members of a given group
977
- export <span class="fstat-no" title="function not covered" >function findMembersOfGroup (membersService, groupId, role) {</span>
978
- <span class="cstat-no" title="statement not covered" > return findSubjectsForResource(membersService, 'groups', groupId, role)</span>
979
- <span class="cstat-no" title="statement not covered" >}</span>
980
- &nbsp;
981
- export <span class="fstat-no" title="function not covered" >function countMembersOfGroup (membersService, groupId, role) {</span>
982
- <span class="cstat-no" title="statement not covered" > return countSubjectsForResource(membersService, 'groups', groupId, role)</span>
983
- <span class="cstat-no" title="statement not covered" >}</span>
984
- &nbsp;
985
- // Helper functions to find the members with a given tag
986
- export <span class="fstat-no" title="function not covered" >function findMembersWithTag (membersService, tagId) {</span>
987
- <span class="cstat-no" title="statement not covered" > return findSubjectsForResource(membersService, 'tags', tagId)</span>
988
- <span class="cstat-no" title="statement not covered" >}</span>
989
- &nbsp;
990
- export <span class="fstat-no" title="function not covered" >function countMembersWithTag (membersService, tagId) {</span>
991
- <span class="cstat-no" title="statement not covered" > return countSubjectsForResource(membersService, 'tags', tagId)</span>
662
+ export <span class="fstat-no" title="function not covered" >function getQueryForAbilities (abilities, operation, resourceType) {</span>
663
+ <span class="cstat-no" title="statement not covered" > if (!abilities) return null</span>
664
+ <span class="cstat-no" title="statement not covered" ></span>
665
+ <span class="cstat-no" title="statement not covered" > const query = toMongoQuery(abilities, resourceType, operation)</span>
666
+ <span class="cstat-no" title="statement not covered" > // Remove any context to avoid taking it into account because it is not really stored on objects</span>
667
+ <span class="cstat-no" title="statement not covered" > // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)</span>
668
+ <span class="cstat-no" title="statement not covered" > return (query ? removeContext(_.cloneDeep(query)) : null)</span>
992
669
  <span class="cstat-no" title="statement not covered" >}</span>
993
670
  &nbsp;
994
- export <span class="fstat-no" title="function not covered" >function getRoleForOrganisation (user, organisationId) {</span>
995
- <span class="cstat-no" title="statement not covered" > const result = _.find(user.organisations, { _id: organisationId })</span>
996
- <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) return result.permissions</span>
997
- <span class="cstat-no" title="statement not covered" > return undefined</span>
671
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function buildSubjectsQueryForResource (resourceScope, resourceId, role) {</span></span>
672
+ <span class="cstat-no" title="statement not covered" > const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }</span>
673
+ <span class="cstat-no" title="statement not covered" > if (role) {</span>
674
+ <span class="cstat-no" title="statement not covered" > _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))</span>
675
+ <span class="cstat-no" title="statement not covered" > }</span>
676
+ <span class="cstat-no" title="statement not covered" > return query</span>
998
677
  <span class="cstat-no" title="statement not covered" >}</span>
999
678
  &nbsp;
1000
- export <span class="fstat-no" title="function not covered" >function getRoleForGroup (user, organisationId, groupId) {</span>
1001
- <span class="cstat-no" title="statement not covered" > const result = _.find(user.groups, { context: organisationId, _id: groupId })</span>
1002
- <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) return result.permissions</span>
1003
- <span class="cstat-no" title="statement not covered" > return undefined</span>
679
+ export <span class="fstat-no" title="function not covered" >function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {</span>
680
+ <span class="cstat-no" title="statement not covered" > // Build the query</span>
681
+ <span class="cstat-no" title="statement not covered" > const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)</span>
682
+ <span class="cstat-no" title="statement not covered" > // Execute the query</span>
683
+ <span class="cstat-no" title="statement not covered" > return subjectService.find({ query })</span>
1004
684
  <span class="cstat-no" title="statement not covered" >}</span>
1005
685
  &nbsp;
1006
- export <span class="fstat-no" title="function not covered" >function findGroupsWithRole (user, organisationId, role) {</span>
1007
- <span class="cstat-no" title="statement not covered" > return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })</span>
686
+ export <span class="fstat-no" title="function not covered" >function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {</span>
687
+ <span class="cstat-no" title="statement not covered" > // Build the query</span>
688
+ <span class="cstat-no" title="statement not covered" > const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)</span>
689
+ <span class="cstat-no" title="statement not covered" > // Indicate we'd only like to count</span>
690
+ <span class="cstat-no" title="statement not covered" > query.$limit = 0</span>
691
+ <span class="cstat-no" title="statement not covered" > // Execute the query</span>
692
+ <span class="cstat-no" title="statement not covered" > return subjectService.find({ query })</span>
1008
693
  <span class="cstat-no" title="statement not covered" >}</span>
1009
694
  &nbsp;
1010
695
  export <span class="fstat-no" title="function not covered" >function isSeniorRole (roleName, juniorName) {</span>
@@ -1033,7 +718,7 @@ export <span class="fstat-no" title="function not covered" >function getJuniorRo
1033
718
  <div class='footer quiet pad2 space-top1 center small'>
1034
719
  Code coverage generated by
1035
720
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1036
- at 2024-11-15T21:05:45.905Z
721
+ at 2025-05-21T12:01:19.803Z
1037
722
  </div>
1038
723
  <script src="../../prettify.js"></script>
1039
724
  <script>