@kalisio/kdk 1.3.5 → 1.4.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 (535) hide show
  1. package/.nyc_output/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +1 -0
  2. package/.nyc_output/{0b8aa700-8daa-49ce-85e7-a8f8965d55f0.json → 2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json} +0 -0
  3. package/.nyc_output/{20df4355-911a-4b16-a8ab-d3392e9f0a7f.json → 81d21e46-766a-46bc-b1b7-143ca577347a.json} +0 -0
  4. package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +1 -0
  5. package/.nyc_output/{257af0bb-96c3-465a-b5ef-a1df60078d5f.json → aaf3ebbb-f895-4d7b-9255-bc5dee832570.json} +0 -0
  6. package/.nyc_output/{284aebfa-23fd-425f-9d72-e4b8904dc224.json → dbeb2602-0ac2-4e66-978b-0d29548359ca.json} +0 -0
  7. package/.nyc_output/{5cbee06e-be6e-468a-bd78-4793ee785fe4.json → e47d1e4c-2fff-4dcb-908f-d3081162547c.json} +0 -0
  8. package/.nyc_output/processinfo/{2bece194-92f7-4971-a688-10604044a7fa.json → 2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json} +1 -1
  9. package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +1 -0
  10. package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +1 -0
  11. package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +1 -0
  12. package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +1 -0
  13. package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +1 -0
  14. package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.json +1 -0
  15. package/.nyc_output/processinfo/index.json +1 -1
  16. package/CHANGELOG.md +189 -67
  17. package/README.md +1 -1
  18. package/coverage/core/api/application.js.html +145 -145
  19. package/coverage/core/api/authentication.js.html +37 -37
  20. package/coverage/core/api/db.js.html +74 -74
  21. package/coverage/core/api/hooks/hooks.account.js.html +15 -15
  22. package/coverage/core/api/hooks/hooks.authentication.js.html +16 -16
  23. package/coverage/core/api/hooks/hooks.authorisations.js.html +112 -121
  24. package/coverage/core/api/hooks/hooks.devices.js.html +5 -5
  25. package/coverage/core/api/hooks/hooks.groups.js.html +3 -3
  26. package/coverage/core/api/hooks/hooks.logger.js.html +7 -7
  27. package/coverage/core/api/hooks/hooks.model.js.html +149 -149
  28. package/coverage/core/api/hooks/hooks.organisations.js.html +13 -61
  29. package/coverage/core/api/hooks/hooks.pusher.js.html +7 -7
  30. package/coverage/core/api/hooks/hooks.query.js.html +68 -32
  31. package/coverage/core/api/hooks/hooks.service.js.html +15 -15
  32. package/coverage/core/api/hooks/hooks.storage.js.html +5 -5
  33. package/coverage/core/api/hooks/hooks.tags.js.html +7 -7
  34. package/coverage/core/api/hooks/hooks.users.js.html +111 -63
  35. package/coverage/core/api/hooks/index.html +72 -72
  36. package/coverage/core/api/hooks/index.js.html +15 -15
  37. package/coverage/core/api/index.html +35 -35
  38. package/coverage/core/api/index.js.html +13 -13
  39. package/coverage/core/api/marshall.js.html +81 -81
  40. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  41. package/coverage/core/api/models/index.html +1 -1
  42. package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
  43. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  44. package/coverage/core/api/models/users.model.mongodb.js.html +7 -7
  45. package/coverage/core/api/oauth2-handler.js.html +3 -3
  46. package/coverage/core/api/oauth2-verifier.js.html +5 -5
  47. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  48. package/coverage/core/api/services/account/account.service.js.html +34 -34
  49. package/coverage/core/api/services/account/index.html +17 -17
  50. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +3 -3
  51. package/coverage/core/api/services/authorisations/authorisations.service.js.html +40 -37
  52. package/coverage/core/api/services/authorisations/index.html +17 -17
  53. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  54. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  55. package/coverage/core/api/services/databases/index.html +1 -1
  56. package/coverage/core/api/services/devices/devices.hooks.js.html +1 -1
  57. package/coverage/core/api/services/devices/devices.service.js.html +1 -1
  58. package/coverage/core/api/services/devices/index.html +1 -1
  59. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  60. package/coverage/core/api/services/groups/index.html +1 -1
  61. package/coverage/core/api/services/index.html +5 -5
  62. package/coverage/core/api/services/index.js.html +40 -40
  63. package/coverage/core/api/services/mailer/index.html +1 -1
  64. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  65. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  66. package/coverage/core/api/services/organisations/index.html +1 -1
  67. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  68. package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
  69. package/coverage/core/api/services/pusher/index.html +1 -1
  70. package/coverage/core/api/services/pusher/pusher.channels.js.html +1 -1
  71. package/coverage/core/api/services/pusher/pusher.hooks.js.html +1 -1
  72. package/coverage/core/api/services/pusher/pusher.service.js.html +1 -1
  73. package/coverage/core/api/services/storage/index.html +1 -1
  74. package/coverage/core/api/services/storage/storage.hooks.js.html +4 -4
  75. package/coverage/core/api/services/tags/index.html +1 -1
  76. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  77. package/coverage/core/api/services/users/index.html +1 -1
  78. package/coverage/core/api/services/users/users.hooks.js.html +12 -12
  79. package/coverage/core/common/index.html +32 -32
  80. package/coverage/core/common/index.js.html +27 -27
  81. package/coverage/core/common/permissions.js.html +135 -75
  82. package/coverage/index.html +157 -157
  83. package/coverage/lcov-report/core/api/application.js.html +145 -145
  84. package/coverage/lcov-report/core/api/authentication.js.html +37 -37
  85. package/coverage/lcov-report/core/api/db.js.html +74 -74
  86. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +15 -15
  87. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +16 -16
  88. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +112 -121
  89. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +5 -5
  90. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +3 -3
  91. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +7 -7
  92. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +149 -149
  93. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +13 -61
  94. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +7 -7
  95. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +68 -32
  96. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +15 -15
  97. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +5 -5
  98. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +7 -7
  99. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +111 -63
  100. package/coverage/lcov-report/core/api/hooks/index.html +72 -72
  101. package/coverage/lcov-report/core/api/hooks/index.js.html +15 -15
  102. package/coverage/lcov-report/core/api/index.html +35 -35
  103. package/coverage/lcov-report/core/api/index.js.html +13 -13
  104. package/coverage/lcov-report/core/api/marshall.js.html +81 -81
  105. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  106. package/coverage/lcov-report/core/api/models/index.html +1 -1
  107. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
  108. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  109. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +7 -7
  110. package/coverage/lcov-report/core/api/oauth2-handler.js.html +3 -3
  111. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +5 -5
  112. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  113. package/coverage/lcov-report/core/api/services/account/account.service.js.html +34 -34
  114. package/coverage/lcov-report/core/api/services/account/index.html +17 -17
  115. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +3 -3
  116. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +40 -37
  117. package/coverage/lcov-report/core/api/services/authorisations/index.html +17 -17
  118. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  119. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  120. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  121. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +1 -1
  122. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +1 -1
  123. package/coverage/lcov-report/core/api/services/devices/index.html +1 -1
  124. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  125. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  126. package/coverage/lcov-report/core/api/services/index.html +5 -5
  127. package/coverage/lcov-report/core/api/services/index.js.html +40 -40
  128. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  129. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  130. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  131. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  132. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  133. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
  134. package/coverage/lcov-report/core/api/services/pusher/index.html +1 -1
  135. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +1 -1
  136. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +1 -1
  137. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +1 -1
  138. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  139. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +4 -4
  140. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  141. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  142. package/coverage/lcov-report/core/api/services/users/index.html +1 -1
  143. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +12 -12
  144. package/coverage/lcov-report/core/common/index.html +32 -32
  145. package/coverage/lcov-report/core/common/index.js.html +27 -27
  146. package/coverage/lcov-report/core/common/permissions.js.html +135 -75
  147. package/coverage/lcov-report/index.html +157 -157
  148. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +55 -55
  149. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +337 -274
  150. package/coverage/lcov-report/map/api/hooks/index.html +43 -43
  151. package/coverage/lcov-report/map/api/hooks/index.js.html +12 -12
  152. package/coverage/lcov-report/map/api/index.html +31 -31
  153. package/coverage/lcov-report/map/api/index.js.html +24 -24
  154. package/coverage/lcov-report/map/api/marshall.js.html +39 -39
  155. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +20 -20
  156. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +22 -22
  157. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +24 -24
  158. package/coverage/lcov-report/map/api/models/index.html +43 -43
  159. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +21 -21
  160. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +156 -156
  161. package/coverage/lcov-report/map/api/services/alerts/index.html +30 -30
  162. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +19 -19
  163. package/coverage/lcov-report/map/api/services/catalog/index.html +17 -17
  164. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  165. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  166. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +20 -20
  167. package/coverage/lcov-report/map/api/services/features/index.html +21 -21
  168. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +8 -8
  169. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +99 -99
  170. package/coverage/lcov-report/map/api/services/geocoder/index.html +28 -28
  171. package/coverage/lcov-report/map/api/services/index.html +21 -21
  172. package/coverage/lcov-report/map/api/services/index.js.html +71 -71
  173. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
  174. package/coverage/lcov-report/map/common/errors.js.html +9 -9
  175. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +120 -120
  176. package/coverage/lcov-report/map/common/grid.js.html +268 -268
  177. package/coverage/lcov-report/map/common/index.html +149 -149
  178. package/coverage/lcov-report/map/common/index.js.html +31 -31
  179. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +71 -71
  180. package/coverage/lcov-report/map/common/moment-utils.js.html +14 -14
  181. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +280 -280
  182. package/coverage/lcov-report/map/common/opendap-utils.js.html +220 -220
  183. package/coverage/lcov-report/map/common/permissions.js.html +21 -21
  184. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +51 -51
  185. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  186. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +99 -99
  187. package/coverage/lcov-report/map/common/wcs-utils.js.html +66 -66
  188. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +196 -196
  189. package/coverage/lcov-report/map/common/wfs-utils.js.html +8 -5
  190. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  191. package/coverage/lcov-report/map/common/wmts-utils.js.html +71 -11
  192. package/coverage/lcov.info +3588 -3659
  193. package/coverage/map/api/hooks/hooks.catalog.js.html +55 -55
  194. package/coverage/map/api/hooks/hooks.query.js.html +337 -274
  195. package/coverage/map/api/hooks/index.html +43 -43
  196. package/coverage/map/api/hooks/index.js.html +12 -12
  197. package/coverage/map/api/index.html +31 -31
  198. package/coverage/map/api/index.js.html +24 -24
  199. package/coverage/map/api/marshall.js.html +39 -39
  200. package/coverage/map/api/models/alerts.model.mongodb.js.html +20 -20
  201. package/coverage/map/api/models/catalog.model.mongodb.js.html +22 -22
  202. package/coverage/map/api/models/features.model.mongodb.js.html +24 -24
  203. package/coverage/map/api/models/index.html +43 -43
  204. package/coverage/map/api/services/alerts/alerts.hooks.js.html +21 -21
  205. package/coverage/map/api/services/alerts/alerts.service.js.html +156 -156
  206. package/coverage/map/api/services/alerts/index.html +30 -30
  207. package/coverage/map/api/services/catalog/catalog.hooks.js.html +19 -19
  208. package/coverage/map/api/services/catalog/index.html +17 -17
  209. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  210. package/coverage/map/api/services/daptiles/index.html +1 -1
  211. package/coverage/map/api/services/features/features.hooks.js.html +20 -20
  212. package/coverage/map/api/services/features/index.html +21 -21
  213. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +8 -8
  214. package/coverage/map/api/services/geocoder/geocoder.service.js.html +99 -99
  215. package/coverage/map/api/services/geocoder/index.html +28 -28
  216. package/coverage/map/api/services/index.html +21 -21
  217. package/coverage/map/api/services/index.js.html +71 -71
  218. package/coverage/map/common/dynamic-grid-source.js.html +68 -68
  219. package/coverage/map/common/errors.js.html +9 -9
  220. package/coverage/map/common/geotiff-grid-source.js.html +120 -120
  221. package/coverage/map/common/grid.js.html +268 -268
  222. package/coverage/map/common/index.html +149 -149
  223. package/coverage/map/common/index.js.html +31 -31
  224. package/coverage/map/common/meteo-model-grid-source.js.html +71 -71
  225. package/coverage/map/common/moment-utils.js.html +14 -14
  226. package/coverage/map/common/opendap-grid-source.js.html +280 -280
  227. package/coverage/map/common/opendap-utils.js.html +220 -220
  228. package/coverage/map/common/permissions.js.html +21 -21
  229. package/coverage/map/common/time-based-grid-source.js.html +51 -51
  230. package/coverage/map/common/tms-utils.js.html +1 -1
  231. package/coverage/map/common/wcs-grid-source.js.html +99 -99
  232. package/coverage/map/common/wcs-utils.js.html +66 -66
  233. package/coverage/map/common/weacast-grid-source.js.html +196 -196
  234. package/coverage/map/common/wfs-utils.js.html +8 -5
  235. package/coverage/map/common/wms-utils.js.html +1 -1
  236. package/coverage/map/common/wmts-utils.js.html +71 -11
  237. package/extras/icons/kanban.png +0 -0
  238. package/extras/testcafe/page-models/map/catalog.js +2 -2
  239. package/extras/tours/core/add-member.js +10 -1
  240. package/extras/tours/core/{tag-member.js → edit-member-tags.js} +4 -3
  241. package/extras/tours/core/groups.js +8 -2
  242. package/extras/tours/core/members.js +11 -21
  243. package/extras/tours/core/tags.js +7 -1
  244. package/extras/tours/map/catalog-categories.js +4 -4
  245. package/extras/tours/map/catalog-panel.js +16 -16
  246. package/extras/tours/map/favorite-views.js +3 -3
  247. package/lib/core/api/hooks/hooks.authorisations.js +149 -140
  248. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  249. package/lib/core/api/hooks/hooks.organisations.js +1 -23
  250. package/lib/core/api/hooks/hooks.organisations.js.map +1 -1
  251. package/lib/core/api/hooks/hooks.query.js +22 -0
  252. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  253. package/lib/core/api/hooks/hooks.users.js +34 -18
  254. package/lib/core/api/hooks/hooks.users.js.map +1 -1
  255. package/lib/core/api/services/authorisations/authorisations.service.js +34 -25
  256. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  257. package/lib/core/client/api.js +1 -0
  258. package/lib/core/client/api.js.map +1 -1
  259. package/lib/core/client/components/account/KAccountDZ.vue +3 -4
  260. package/lib/core/client/components/account/KAccountDevices.vue +5 -6
  261. package/lib/core/client/components/account/KDeviceCard.vue +2 -1
  262. package/lib/core/client/components/account/KIdentityPanel.vue +1 -7
  263. package/lib/core/client/components/collection/KBoard.vue +26 -155
  264. package/lib/core/client/components/collection/KCard.vue +144 -42
  265. package/lib/core/client/components/collection/KCardSection.vue +52 -0
  266. package/lib/core/client/components/collection/KColumn.vue +181 -0
  267. package/lib/core/client/components/collection/KGrid.vue +13 -18
  268. package/lib/core/client/components/collection/KHistory.vue +61 -89
  269. package/lib/core/client/components/collection/KHistoryEntry.vue +90 -66
  270. package/lib/core/client/components/collection/KItem.vue +21 -2
  271. package/lib/core/client/components/collection/KList.vue +9 -12
  272. package/lib/core/client/components/collection/KTable.vue +33 -39
  273. package/lib/core/client/components/collection/index.js +6 -1
  274. package/lib/core/client/components/collection/index.js.map +1 -1
  275. package/lib/core/client/components/editor/KEditor.vue +0 -6
  276. package/lib/core/client/components/editor/KModalEditor.vue +4 -4
  277. package/lib/core/client/components/editor/KSettingsEditor.vue +49 -0
  278. package/lib/core/client/components/form/KAttachmentField.vue +10 -10
  279. package/lib/core/client/components/form/KChipsField.vue +28 -23
  280. package/lib/core/client/components/form/KColorField.vue +30 -25
  281. package/lib/core/client/components/form/KForm.vue +0 -12
  282. package/lib/core/client/components/form/KIconField.vue +1 -0
  283. package/lib/core/client/components/form/KItemField.vue +8 -4
  284. package/lib/core/client/components/form/KRoleField.vue +56 -0
  285. package/lib/core/client/components/form/KSelectField.vue +16 -1
  286. package/lib/core/client/components/form/KView.vue +5 -14
  287. package/lib/core/client/components/frame/KAction.vue +18 -12
  288. package/lib/core/client/components/frame/KAvatar.vue +3 -3
  289. package/lib/core/client/components/frame/KChart.vue +60 -0
  290. package/lib/core/client/components/frame/KChipsPane.vue +80 -0
  291. package/lib/core/client/components/frame/KContent.vue +1 -1
  292. package/lib/core/client/components/frame/KModal.vue +30 -44
  293. package/lib/core/client/components/frame/KPanel.vue +1 -1
  294. package/lib/core/client/components/frame/{KMenu.vue → KPopupAction.vue} +6 -7
  295. package/lib/core/client/components/frame/KSpot.vue +31 -0
  296. package/lib/core/client/components/frame/KStamp.vue +62 -0
  297. package/lib/core/client/components/frame/index.js +56 -1
  298. package/lib/core/client/components/frame/index.js.map +1 -1
  299. package/lib/core/client/components/input/KColorChooser.vue +16 -8
  300. package/lib/core/client/components/input/KIconChooser.vue +2 -1
  301. package/lib/core/client/components/input/KUploader.vue +14 -5
  302. package/lib/core/client/components/layout/KAbout.vue +9 -3
  303. package/lib/core/client/components/layout/KFab.vue +1 -1
  304. package/lib/core/client/components/layout/KPage.vue +44 -19
  305. package/lib/core/client/components/layout/KTour.vue +2 -2
  306. package/lib/core/client/components/layout/KWelcome.vue +13 -12
  307. package/lib/core/client/components/layout/KWindow.vue +1 -1
  308. package/lib/core/client/components/media/KImageViewer.vue +9 -7
  309. package/lib/core/client/components/media/KMediaBrowser.vue +12 -8
  310. package/lib/core/client/components/menu/KMenu.vue +103 -0
  311. package/lib/core/client/components/team/KAddMember.vue +17 -9
  312. package/lib/core/client/components/team/KChangeRole.vue +5 -7
  313. package/lib/core/client/components/team/KGroupCard.vue +34 -51
  314. package/lib/core/client/components/team/KGroupsActivity.vue +9 -2
  315. package/lib/core/client/components/team/KJoinGroup.vue +5 -7
  316. package/lib/core/client/components/team/KMemberCard.vue +104 -63
  317. package/lib/core/client/components/team/KMembersActivity.vue +9 -2
  318. package/lib/core/client/components/team/KOrganisationsActivity.vue +8 -1
  319. package/lib/core/client/components/team/KTagCard.vue +26 -26
  320. package/lib/core/client/components/team/KTagsActivity.vue +9 -2
  321. package/lib/core/client/components/time/KTimeRange.vue +144 -0
  322. package/lib/core/client/components/viewer/KModalViewer.vue +6 -0
  323. package/lib/core/client/components/viewer/KViewer.vue +0 -6
  324. package/lib/core/client/i18n/core_en.json +133 -93
  325. package/lib/core/client/i18n/core_fr.json +56 -16
  326. package/lib/core/client/index.js +28 -14
  327. package/lib/core/client/index.js.map +1 -1
  328. package/lib/core/client/mixins/mixin.authorisation.js +28 -18
  329. package/lib/core/client/mixins/mixin.authorisation.js.map +1 -1
  330. package/lib/core/client/mixins/mixin.base-collection.js +57 -9
  331. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  332. package/lib/core/client/mixins/mixin.base-context.js +1 -1
  333. package/lib/core/client/mixins/mixin.base-context.js.map +1 -1
  334. package/lib/core/client/mixins/mixin.base-editor.js +26 -16
  335. package/lib/core/client/mixins/mixin.base-editor.js.map +1 -1
  336. package/lib/core/client/mixins/mixin.base-field.js +0 -4
  337. package/lib/core/client/mixins/mixin.base-field.js.map +1 -1
  338. package/lib/core/client/mixins/mixin.base-item.js +29 -14
  339. package/lib/core/client/mixins/mixin.base-item.js.map +1 -1
  340. package/lib/core/client/mixins/mixin.base-viewer.js +0 -2
  341. package/lib/core/client/mixins/mixin.base-viewer.js.map +1 -1
  342. package/lib/core/client/mixins/mixin.object-proxy.js +17 -3
  343. package/lib/core/client/mixins/mixin.object-proxy.js.map +1 -1
  344. package/lib/core/client/mixins/mixin.schema-proxy.js +31 -0
  345. package/lib/core/client/mixins/mixin.schema-proxy.js.map +1 -1
  346. package/lib/core/client/mixins/mixin.service.js +5 -33
  347. package/lib/core/client/mixins/mixin.service.js.map +1 -1
  348. package/lib/core/client/services/index.js +23 -0
  349. package/lib/core/client/services/index.js.map +1 -1
  350. package/lib/core/client/services/local-settings.service.js +4 -0
  351. package/lib/core/client/services/local-settings.service.js.map +1 -1
  352. package/lib/core/client/time.js +131 -0
  353. package/lib/core/client/time.js.map +1 -0
  354. package/lib/core/common/permissions.js +65 -23
  355. package/lib/core/common/permissions.js.map +1 -1
  356. package/lib/core/common/schemas/groups.create.json +1 -1
  357. package/lib/core/common/schemas/groups.update.json +1 -1
  358. package/lib/core/common/schemas/organisations.create.json +1 -1
  359. package/lib/core/common/schemas/organisations.update.json +2 -2
  360. package/lib/core/common/schemas/settings.update.json +139 -0
  361. package/lib/core/common/schemas/tags.update.json +9 -1
  362. package/lib/map/api/hooks/hooks.query.js +48 -27
  363. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  364. package/lib/map/api/services/features/features.hooks.js +1 -1
  365. package/lib/map/api/services/features/features.hooks.js.map +1 -1
  366. package/lib/map/client/components/KColorLegend.vue +25 -23
  367. package/lib/map/client/components/KFavoriteViews.vue +71 -35
  368. package/lib/map/client/components/KFeaturesChart.vue +11 -9
  369. package/lib/map/client/components/KFeaturesFilter.vue +15 -7
  370. package/lib/map/client/components/KFeaturesTable.vue +27 -2
  371. package/lib/map/client/components/KLayerEditionToolbar.vue +43 -0
  372. package/lib/map/client/components/KLayerStyleEditor.vue +10 -4
  373. package/lib/map/client/components/KLayerStyleForm.vue +14 -11
  374. package/lib/map/client/components/KLocationInput.vue +126 -65
  375. package/lib/map/client/components/KLocationMap.vue +199 -84
  376. package/lib/map/client/components/KPositionIndicator.vue +1 -0
  377. package/lib/map/client/components/KTimeline.vue +41 -36
  378. package/lib/map/client/components/KUrlLegend.vue +21 -19
  379. package/lib/map/client/components/catalog/KBaseLayersSelector.vue +105 -0
  380. package/lib/map/client/components/catalog/KCatalog.vue +14 -2
  381. package/lib/map/client/components/catalog/KConnectLayer.vue +31 -11
  382. package/lib/map/client/components/catalog/KCreateLayer.vue +37 -14
  383. package/lib/map/client/components/catalog/KImportLayer.vue +28 -8
  384. package/lib/map/client/components/catalog/KLayerCategories.vue +86 -62
  385. package/lib/map/client/components/catalog/KLayersSelector.vue +42 -42
  386. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
  387. package/lib/map/client/components/form/KLocationField.vue +1 -1
  388. package/lib/map/client/components/form/KOwsLayerField.vue +21 -2
  389. package/lib/map/client/components/form/KOwsServiceField.vue +1 -0
  390. package/lib/map/client/components/widget/KInformationBox.vue +10 -16
  391. package/lib/map/client/components/widget/KMapillaryViewer.vue +59 -49
  392. package/lib/map/client/components/widget/KTimeSeries.vue +39 -29
  393. package/lib/map/client/i18n/map_en.json +65 -17
  394. package/lib/map/client/i18n/map_fr.json +67 -20
  395. package/lib/map/client/init.js +18 -6
  396. package/lib/map/client/init.js.map +1 -1
  397. package/lib/map/client/leaflet/GSMaPLayer.js +4 -9
  398. package/lib/map/client/leaflet/GSMaPLayer.js.map +1 -1
  399. package/lib/map/client/leaflet/GradientPath.js.map +1 -1
  400. package/lib/map/client/leaflet/MaskLayer.js +64 -0
  401. package/lib/map/client/leaflet/MaskLayer.js.map +1 -0
  402. package/lib/map/client/mixins/globe/mixin.base-globe.js +4 -1
  403. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  404. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -9
  405. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  406. package/lib/map/client/mixins/index.js +8 -13
  407. package/lib/map/client/mixins/index.js.map +1 -1
  408. package/lib/map/client/mixins/map/mixin.base-map.js +30 -6
  409. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  410. package/lib/map/client/mixins/map/mixin.canvas-layers.js +274 -51
  411. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  412. package/lib/map/client/mixins/map/mixin.edit-layers.js +218 -121
  413. package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
  414. package/lib/map/client/mixins/map/mixin.file-layers.js +25 -18
  415. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  416. package/lib/map/client/mixins/map/mixin.geojson-layers.js +18 -10
  417. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  418. package/lib/map/client/mixins/map/mixin.georaster-layers.js +7 -4
  419. package/lib/map/client/mixins/map/mixin.georaster-layers.js.map +1 -1
  420. package/lib/map/client/mixins/map/mixin.gsmap-layers.js +3 -3
  421. package/lib/map/client/mixins/map/mixin.gsmap-layers.js.map +1 -1
  422. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +8 -10
  423. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  424. package/lib/map/client/mixins/map/mixin.mapillary-layers.js +25 -40
  425. package/lib/map/client/mixins/map/mixin.mapillary-layers.js.map +1 -1
  426. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +5 -3
  427. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
  428. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +5 -3
  429. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
  430. package/lib/map/client/mixins/mixin.activity.js +60 -68
  431. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  432. package/lib/map/client/mixins/mixin.feature-selection.js +8 -10
  433. package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
  434. package/lib/map/client/mixins/mixin.feature-service.js +7 -5
  435. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  436. package/lib/map/client/mixins/mixin.weacast.js +6 -4
  437. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  438. package/lib/map/client/pixi-utils.js +9 -0
  439. package/lib/map/client/pixi-utils.js.map +1 -1
  440. package/lib/map/client/utils.js +50 -0
  441. package/lib/map/client/utils.js.map +1 -1
  442. package/lib/map/common/wfs-utils.js +1 -1
  443. package/lib/map/common/wfs-utils.js.map +1 -1
  444. package/lib/map/common/wmts-utils.js +31 -7
  445. package/lib/map/common/wmts-utils.js.map +1 -1
  446. package/lib/test/client/core/account.js +100 -0
  447. package/lib/test/client/core/account.js.map +1 -0
  448. package/lib/test/client/core/api.js +400 -0
  449. package/lib/test/client/core/api.js.map +1 -0
  450. package/lib/test/client/core/collection.js +109 -0
  451. package/lib/test/client/core/collection.js.map +1 -0
  452. package/lib/test/client/core/index.js +90 -0
  453. package/lib/test/client/core/index.js.map +1 -0
  454. package/lib/test/client/core/layout.js +221 -0
  455. package/lib/test/client/core/layout.js.map +1 -0
  456. package/lib/test/client/core/runner.js +204 -0
  457. package/lib/test/client/core/runner.js.map +1 -0
  458. package/lib/test/client/core/screens.js +68 -0
  459. package/lib/test/client/core/screens.js.map +1 -0
  460. package/lib/test/client/core/utils.js +304 -0
  461. package/lib/test/client/core/utils.js.map +1 -0
  462. package/lib/test/client/index.js +20 -0
  463. package/lib/test/client/index.js.map +1 -0
  464. package/lib/test/client/map/catalog.js +191 -0
  465. package/lib/test/client/map/catalog.js.map +1 -0
  466. package/lib/test/client/map/controls.js +54 -0
  467. package/lib/test/client/map/controls.js.map +1 -0
  468. package/lib/test/client/map/index.js +30 -0
  469. package/lib/test/client/map/index.js.map +1 -0
  470. package/package.json +17 -9
  471. package/test.client.js +1 -0
  472. package/tests/core/test-log-2021-07-15.log +71 -0
  473. package/tests/core/test-log-2021-09-02.log +47 -0
  474. package/tests/map/test-log-%DATE%.logYYYY-07-DD +12 -0
  475. package/tests/map/test-log-%DATE%.logYYYY-09-DD +6 -0
  476. package/tests/map/test-log-2021-07-12.log +12 -0
  477. package/tests/map/test-log-2021-07-15.log +5 -0
  478. package/tests/map/test-log-2021-09-02.log +3 -0
  479. package/.nyc_output/11cd93d8-69cb-405c-98a3-d249ea35b6da.json +0 -1
  480. package/.nyc_output/2bece194-92f7-4971-a688-10604044a7fa.json +0 -1
  481. package/.nyc_output/5ddee33e-b658-4c8e-a247-54f575ac67e8.json +0 -1
  482. package/.nyc_output/78760ae4-555f-4d9c-a6a1-acf5e2f0fe45.json +0 -1
  483. package/.nyc_output/d0bb2559-084e-4c92-b9e6-29a9abd41f7c.json +0 -1
  484. package/.nyc_output/processinfo/0b8aa700-8daa-49ce-85e7-a8f8965d55f0.json +0 -1
  485. package/.nyc_output/processinfo/11cd93d8-69cb-405c-98a3-d249ea35b6da.json +0 -1
  486. package/.nyc_output/processinfo/20df4355-911a-4b16-a8ab-d3392e9f0a7f.json +0 -1
  487. package/.nyc_output/processinfo/257af0bb-96c3-465a-b5ef-a1df60078d5f.json +0 -1
  488. package/.nyc_output/processinfo/284aebfa-23fd-425f-9d72-e4b8904dc224.json +0 -1
  489. package/.nyc_output/processinfo/5cbee06e-be6e-468a-bd78-4793ee785fe4.json +0 -1
  490. package/.nyc_output/processinfo/5ddee33e-b658-4c8e-a247-54f575ac67e8.json +0 -1
  491. package/.nyc_output/processinfo/78760ae4-555f-4d9c-a6a1-acf5e2f0fe45.json +0 -1
  492. package/.nyc_output/processinfo/d0bb2559-084e-4c92-b9e6-29a9abd41f7c.json +0 -1
  493. package/lib/core/client/components/frame/KLabel.vue +0 -56
  494. package/lib/core/client/components/team/KTagsPane.vue +0 -35
  495. package/lib/map/client/leaflet/TiledMapillaryLayer.js +0 -137
  496. package/lib/map/client/leaflet/TiledMapillaryLayer.js.map +0 -1
  497. package/lib/map/client/mixins/mixin.time.js +0 -73
  498. package/lib/map/client/mixins/mixin.time.js.map +0 -1
  499. package/tests/core/account.test.js +0 -415
  500. package/tests/core/client.test.js.skip +0 -37
  501. package/tests/core/config/default.js +0 -97
  502. package/tests/core/config/email-templates/confirmInvitation/html.ejs +0 -18
  503. package/tests/core/config/email-templates/identityChange/html.ejs +0 -12
  504. package/tests/core/config/email-templates/newDevice/html.ejs +0 -7
  505. package/tests/core/config/email-templates/passwordChange/html.ejs +0 -5
  506. package/tests/core/config/email-templates/resendVerifySignup/html.ejs +0 -10
  507. package/tests/core/config/email-templates/resetPwd/html.ejs +0 -5
  508. package/tests/core/config/email-templates/sendResetPwd/html.ejs +0 -8
  509. package/tests/core/config/email-templates/verifySignup/html.ejs +0 -3
  510. package/tests/core/data/10k_most_common_passwords.txt +0 -10000
  511. package/tests/core/data/logo.png +0 -0
  512. package/tests/core/hooks.test.js +0 -175
  513. package/tests/core/index.test.js +0 -418
  514. package/tests/core/notifications.test.js +0 -465
  515. package/tests/core/storage.test.js +0 -134
  516. package/tests/core/team.test.js +0 -610
  517. package/tests/core/utils.js +0 -59
  518. package/tests/map/alerts.test.js +0 -554
  519. package/tests/map/config/default.js +0 -112
  520. package/tests/map/config/layers.json +0 -37
  521. package/tests/map/daptiles.test.js +0 -41
  522. package/tests/map/data/DescribeCoverage.xml +0 -55
  523. package/tests/map/data/GetCoverage.tif +0 -0
  524. package/tests/map/data/adsb.observations.json +0 -132
  525. package/tests/map/data/dataset.grb.das +0 -55
  526. package/tests/map/data/dataset.grb.dds +0 -17
  527. package/tests/map/data/dataset.grb.dods +0 -0
  528. package/tests/map/data/lat_lon_bounds.grb.dods +0 -0
  529. package/tests/map/data/subdataset.grb.dods +0 -0
  530. package/tests/map/data/vigicrues.observations.json +0 -47042
  531. package/tests/map/data/vigicrues.stations.json +0 -15422
  532. package/tests/map/data/zones.json +0 -1228
  533. package/tests/map/grid-sources.test.js +0 -304
  534. package/tests/map/hooks.test.js +0 -96
  535. package/tests/map/index.test.js +0 -333
@@ -3,10 +3,47 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RESOURCE_TYPE_KEY = exports.RESOURCE_TYPE = exports.RoleNames = exports.Roles = undefined;
6
+ exports.defineAbilities = exports.RESOURCE_TYPE_KEY = exports.RESOURCE_TYPE = exports.RoleNames = exports.Roles = undefined;
7
+
8
+ // Compute abilities for a given user
9
+ let defineAbilities = exports.defineAbilities = (() => {
10
+ var _ref = _asyncToGenerator(function* (subject, ...args) {
11
+ const { rules, can, cannot } = _umd.AbilityBuilder.extract();
12
+
13
+ // Run registered hooks providing any additional arguments used to handle complex use cases
14
+ yield Promise.all(hooks.map((() => {
15
+ var _ref2 = _asyncToGenerator(function* (hook) {
16
+ yield hook(subject, can, cannot, ...args);
17
+ });
18
+
19
+ return function (_x2) {
20
+ return _ref2.apply(this, arguments);
21
+ };
22
+ })()));
23
+
24
+ // CASL cannot infer the object type from the object itself so we need
25
+ // to tell it how he can find the object type, i.e. service name.
26
+ return new _umd.Ability(rules, {
27
+ subjectName: function (resource) {
28
+ if (!resource || typeof resource === 'string') {
29
+ return resource;
30
+ }
31
+ return resource[RESOURCE_TYPE_KEY];
32
+ }
33
+ });
34
+ });
35
+
36
+ return function defineAbilities(_x) {
37
+ return _ref.apply(this, arguments);
38
+ };
39
+ })();
40
+
41
+ exports.isSeniorRole = isSeniorRole;
42
+ exports.isJuniorRole = isJuniorRole;
43
+ exports.getSeniorRoles = getSeniorRoles;
44
+ exports.getJuniorRoles = getJuniorRoles;
7
45
  exports.defineResourceRules = defineResourceRules;
8
46
  exports.defineUserAbilities = defineUserAbilities;
9
- exports.defineAbilities = defineAbilities;
10
47
  exports.hasServiceAbilities = hasServiceAbilities;
11
48
  exports.hasResourceAbilities = hasResourceAbilities;
12
49
  exports.removeContext = removeContext;
@@ -31,6 +68,8 @@ var _umd = require('casl/dist/umd');
31
68
 
32
69
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
70
 
71
+ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
72
+
34
73
  // Define some alias to simplify ability definitions
35
74
  _umd.Ability.addAlias('update', 'patch');
36
75
  _umd.Ability.addAlias('read', ['get', 'find']);
@@ -45,6 +84,30 @@ const Roles = exports.Roles = {
45
84
 
46
85
  const RoleNames = exports.RoleNames = ['member', 'manager', 'owner'];
47
86
 
87
+ function isSeniorRole(roleName, juniorName) {
88
+ return Roles[roleName] >= Roles[juniorName];
89
+ }
90
+
91
+ function isJuniorRole(roleName, seniorName) {
92
+ return Roles[roleName] < Roles[seniorName];
93
+ }
94
+
95
+ function getSeniorRoles(roleName) {
96
+ const seniorRoles = [];
97
+ _lodash2.default.forEach(Roles, role => {
98
+ if (Roles[roleName] < role) seniorRoles.push(RoleNames[role]);
99
+ });
100
+ return seniorRoles;
101
+ }
102
+
103
+ function getJuniorRoles(roleName) {
104
+ const juniorRoles = [];
105
+ _lodash2.default.forEach(Roles, role => {
106
+ if (Roles[roleName] >= role) juniorRoles.push(RoleNames[role]);
107
+ });
108
+ return juniorRoles;
109
+ }
110
+
48
111
  // Hooks that can be added to customize abilities computation
49
112
  let hooks = [];
50
113
 
@@ -105,25 +168,6 @@ function defineUserAbilities(subject, can, cannot) {
105
168
  }
106
169
  }
107
170
 
108
- // Compute abilities for a given user
109
- function defineAbilities(subject) {
110
- const { rules, can, cannot } = _umd.AbilityBuilder.extract();
111
-
112
- // Run registered hooks
113
- hooks.forEach(hook => hook(subject, can, cannot));
114
-
115
- // CASL cannot infer the object type from the object itself so we need
116
- // to tell it how he can find the object type, i.e. service name.
117
- return new _umd.Ability(rules, {
118
- subjectName: resource => {
119
- if (!resource || typeof resource === 'string') {
120
- return resource;
121
- }
122
- return resource[RESOURCE_TYPE_KEY];
123
- }
124
- });
125
- }
126
-
127
171
  defineAbilities.registerHook = function (hook) {
128
172
  if (!hooks.includes(hook)) {
129
173
  hooks.push(hook);
@@ -240,8 +284,6 @@ function defineOrganisationAbilities(subject, can, cannot) {
240
284
  can(['read', 'create', 'remove'], 'storage', { context: organisation._id });
241
285
  }
242
286
  if (role >= Roles.manager) {
243
- // The unique identifier of a service is its path not its name.
244
- // Indeed we have for instance a 'groups' service in each organisation.
245
287
  can('update', 'members', { context: organisation._id });
246
288
  can('update', 'tags', { context: organisation._id });
247
289
  can('create', 'groups', { context: organisation._id });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../core/common/permissions.js"],"names":["defineResourceRules","defineUserAbilities","defineAbilities","hasServiceAbilities","hasResourceAbilities","removeContext","getQueryForAbilities","findSubjectsForResource","countSubjectsForResource","defineOrganisationAbilities","defineGroupAbilities","findMembersOfOrganisation","countMembersOfOrganisation","findMembersOfGroup","countMembersOfGroup","getRoleForOrganisation","getRoleForGroup","findGroupsWithRole","Ability","addAlias","Roles","member","manager","owner","RoleNames","hooks","RESOURCE_TYPE","RESOURCE_TYPE_KEY","Symbol","for","subject","resource","resourceService","can","role","permissions","_id","cannot","id","toString","$regex","rules","AbilityBuilder","extract","forEach","hook","subjectName","registerHook","includes","push","unregisterHook","filter","registeredHook","abilities","service","path","getPath","_","replace","operation","resourceType","context","object","Object","assign","result","query","forOwn","value","key","Array","isArray","item","isEmpty","rulesFor","cloneDeep","buildSubjectsQueryForResource","resourceScope","resourceId","$elemMatch","set","subjectService","find","$limit","organisations","organisation","groups","group","usersService","organisationId","membersService","groupId","user","isUndefined","undefined"],"mappings":"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","file":"permissions.js","sourcesContent":["import _ from 'lodash'\r\nimport { Ability, AbilityBuilder, toMongoQuery } from 'casl/dist/umd'\r\n\r\n// Define some alias to simplify ability definitions\r\nAbility.addAlias('update', 'patch')\r\nAbility.addAlias('read', ['get', 'find'])\r\nAbility.addAlias('remove', 'delete')\r\nAbility.addAlias('all', ['read', 'create', 'update', 'remove'])\r\n\r\nexport const Roles = {\r\n member: 0,\r\n manager: 1,\r\n owner: 2\r\n}\r\n\r\nexport const RoleNames = [\r\n 'member',\r\n 'manager',\r\n 'owner'\r\n]\r\n\r\n// Hooks that can be added to customize abilities computation\r\nlet hooks = []\r\n\r\n// Get the unique global symbol to store resource type / context on a resource object\r\nexport const RESOURCE_TYPE = 'type'\r\nexport const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)\r\n\r\nexport function defineResourceRules (subject, resource, resourceService, can) {\r\n const role = Roles[resource.permissions]\r\n\r\n if (role >= Roles.member) {\r\n can('read', resourceService, { _id: resource._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can('update', resourceService, { _id: resource._id })\r\n can(['create', 'remove'], 'authorisations', { resource: resource._id })\r\n }\r\n if (role >= Roles.owner) {\r\n can('remove', resourceService, { _id: resource._id })\r\n }\r\n}\r\n\r\n// Hook computing default abilities for a given user\r\nexport function defineUserAbilities (subject, can, cannot) {\r\n // Allow user registration\r\n can('service', 'users')\r\n can('create', 'users')\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n\r\n if (subject && subject._id) {\r\n // Read user profiles for authorizing\r\n can('read', 'users')\r\n // Update user profile and destroy it\r\n can(['update', 'remove'], 'users', { _id: subject._id })\r\n // Access authorisation service, then rights will be granted on a per-resource basis\r\n can('service', 'authorisations')\r\n // Access storage service, then rights will be granted on a per-resource basis\r\n can('service', 'storage')\r\n // This is for the user avatar\r\n // take care that the storage service uses 'id' as input but produces _id as output\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() })\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n // Avatar is part of user profiles so that they can be read by any\r\n can('read', 'storage', { _id: { $regex: '^avatars/*' } })\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n }\r\n}\r\n\r\n// Compute abilities for a given user\r\nexport function defineAbilities (subject) {\r\n const { rules, can, cannot } = AbilityBuilder.extract()\r\n\r\n // Run registered hooks\r\n hooks.forEach(hook => hook(subject, can, cannot))\r\n\r\n // CASL cannot infer the object type from the object itself so we need\r\n // to tell it how he can find the object type, i.e. service name.\r\n return new Ability(rules, {\r\n subjectName: resource => {\r\n if (!resource || typeof resource === 'string') {\r\n return resource\r\n }\r\n return resource[RESOURCE_TYPE_KEY]\r\n }\r\n })\r\n}\r\n\r\ndefineAbilities.registerHook = function (hook) {\r\n if (!hooks.includes(hook)) {\r\n hooks.push(hook)\r\n }\r\n}\r\n\r\ndefineAbilities.unregisterHook = function (hook) {\r\n hooks = hooks.filter(registeredHook => registeredHook !== hook)\r\n}\r\n\r\nexport function hasServiceAbilities (abilities, service) {\r\n if (!abilities) return false\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation\r\n // Take care that in client we have the service path while on server we have the actual object\r\n const path = typeof service === 'string' ? service : service.getPath()\r\n return abilities.can('service', path) || abilities.can('service', _.replace(path, /^.*\\//, '*/'))\r\n}\r\n\r\nexport function hasResourceAbilities (abilities, operation, resourceType, context, resource) {\r\n if (!abilities) return false\r\n // Create a shallow copy adding context and type\r\n const object = Object.assign({}, resource)\r\n object[RESOURCE_TYPE_KEY] = resourceType\r\n // Add a virtual context to take it into account for object having no link to it\r\n if (context) object.context = (typeof context === 'object' ? context._id.toString() : context.toString())\r\n\r\n const result = abilities.can(operation, object)\r\n\r\n return result\r\n}\r\n\r\n// Utility function used to remove the virtual context from query\r\nexport function removeContext (query) {\r\n _.forOwn(query, (value, key) => {\r\n // Process current attributes or recurse\r\n // Take care to nested fields like 'field._id'\r\n if (key === 'context') {\r\n delete query.context\r\n } else if (Array.isArray(value)) {\r\n value.forEach(item => removeContext(item))\r\n // Remove empty objects from array\r\n // _.remove(value, item => _.isEmpty(item))\r\n // Remove empty arrays from query\r\n if (_.isEmpty(value)) delete query[key]\r\n } else if (typeof value === 'object') {\r\n removeContext(value)\r\n // Remove empty objects from query\r\n if (_.isEmpty(value)) delete query[key]\r\n }\r\n })\r\n return query\r\n}\r\n\r\n// Get the query used to filter the objects according to given abilities\r\n// A null query indicates that access should not be granted\r\nexport function getQueryForAbilities (abilities, operation, resourceType) {\r\n if (!abilities) return null\r\n\r\n const rules = abilities.rulesFor(operation, resourceType)\r\n const query = toMongoQuery(rules)\r\n // Remove any context to avoid taking it into account because it is not really stored on objects\r\n // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)\r\n return (query ? removeContext(_.cloneDeep(query)) : null)\r\n}\r\n\r\nfunction buildSubjectsQueryForResource (resourceScope, resourceId, role) {\r\n const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }\r\n if (role) {\r\n _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))\r\n }\r\n return query\r\n}\r\n\r\nexport function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\nexport function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Indicate we'd only like to count\r\n query.$limit = 0\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\n// Hook computing organisation abilities for a given user\r\nexport function defineOrganisationAbilities (subject, can, cannot) {\r\n if (subject) {\r\n // Create new organisations\r\n can('service', 'organisations')\r\n can('create', 'organisations')\r\n\r\n if (subject.organisations) {\r\n subject.organisations.forEach(organisation => {\r\n if (organisation._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, organisation, 'organisations', can)\r\n // Specific rules for organisations\r\n const role = Roles[organisation.permissions]\r\n if (role >= Roles.member) {\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation.\r\n can('service', organisation._id.toString() + '/members')\r\n can('read', 'members', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/tags')\r\n can('read', 'tags', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/groups')\r\n can('service', organisation._id.toString() + '/storage')\r\n can(['read', 'create', 'remove'], 'storage', { context: organisation._id })\r\n }\r\n if (role >= Roles.manager) {\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation.\r\n can('update', 'members', { context: organisation._id })\r\n can('update', 'tags', { context: organisation._id })\r\n can('create', 'groups', { context: organisation._id })\r\n can(['create', 'remove'], 'tags', { context: organisation._id })\r\n // Remove invited members\r\n can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })\r\n }\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Hook computing group abilities for a given user\r\nexport function defineGroupAbilities (subject, can, cannot) {\r\n if (subject) {\r\n if (subject.groups) {\r\n subject.groups.forEach(group => {\r\n if (group._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, group, 'groups', can)\r\n // No specific rules for groups\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Helper functions to find the members of a given organisation\r\nexport function findMembersOfOrganisation (usersService, organisationId, role) {\r\n return findSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\nexport function countMembersOfOrganisation (usersService, organisationId, role) {\r\n return countSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\n// Helper functions to find the members of a given group\r\nexport function findMembersOfGroup (membersService, groupId, role) {\r\n return findSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function countMembersOfGroup (membersService, groupId, role) {\r\n return countSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function getRoleForOrganisation (user, organisationId) {\r\n const result = _.find(user.organisations, { _id: organisationId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function getRoleForGroup (user, organisationId, groupId) {\r\n const result = _.find(user.groups, { context: organisationId, _id: groupId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function findGroupsWithRole (user, organisationId, role) {\r\n return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../core/common/permissions.js"],"names":["subject","args","rules","can","cannot","AbilityBuilder","extract","Promise","all","hooks","map","hook","Ability","subjectName","resource","RESOURCE_TYPE_KEY","defineAbilities","isSeniorRole","isJuniorRole","getSeniorRoles","getJuniorRoles","defineResourceRules","defineUserAbilities","hasServiceAbilities","hasResourceAbilities","removeContext","getQueryForAbilities","findSubjectsForResource","countSubjectsForResource","defineOrganisationAbilities","defineGroupAbilities","findMembersOfOrganisation","countMembersOfOrganisation","findMembersOfGroup","countMembersOfGroup","getRoleForOrganisation","getRoleForGroup","findGroupsWithRole","addAlias","Roles","member","manager","owner","RoleNames","roleName","juniorName","seniorName","seniorRoles","_","forEach","role","push","juniorRoles","RESOURCE_TYPE","Symbol","for","resourceService","permissions","_id","id","toString","$regex","registerHook","includes","unregisterHook","filter","registeredHook","abilities","service","path","getPath","replace","operation","resourceType","context","object","Object","assign","result","query","forOwn","value","key","Array","isArray","item","isEmpty","rulesFor","cloneDeep","buildSubjectsQueryForResource","resourceScope","resourceId","$elemMatch","set","subjectService","find","$limit","organisations","organisation","groups","group","usersService","organisationId","membersService","groupId","user","isUndefined","undefined"],"mappings":"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","file":"permissions.js","sourcesContent":["import _ from 'lodash'\r\nimport { Ability, AbilityBuilder, toMongoQuery } from 'casl/dist/umd'\r\n\r\n// Define some alias to simplify ability definitions\r\nAbility.addAlias('update', 'patch')\r\nAbility.addAlias('read', ['get', 'find'])\r\nAbility.addAlias('remove', 'delete')\r\nAbility.addAlias('all', ['read', 'create', 'update', 'remove'])\r\n\r\nexport const Roles = {\r\n member: 0,\r\n manager: 1,\r\n owner: 2\r\n}\r\n\r\nexport const RoleNames = [\r\n 'member',\r\n 'manager',\r\n 'owner'\r\n]\r\n\r\nexport function isSeniorRole (roleName, juniorName) {\r\n return Roles[roleName] >= Roles[juniorName]\r\n}\r\n\r\nexport function isJuniorRole (roleName, seniorName) {\r\n return Roles[roleName] < Roles[seniorName]\r\n}\r\n\r\nexport function getSeniorRoles (roleName) {\r\n const seniorRoles = []\r\n _.forEach(Roles, role => { if (Roles[roleName] < role) seniorRoles.push(RoleNames[role]) })\r\n return seniorRoles\r\n}\r\n\r\nexport function getJuniorRoles (roleName) {\r\n const juniorRoles = []\r\n _.forEach(Roles, role => { if (Roles[roleName] >= role) juniorRoles.push(RoleNames[role]) })\r\n return juniorRoles\r\n}\r\n\r\n// Hooks that can be added to customize abilities computation\r\nlet hooks = []\r\n\r\n// Get the unique global symbol to store resource type / context on a resource object\r\nexport const RESOURCE_TYPE = 'type'\r\nexport const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)\r\n\r\nexport function defineResourceRules (subject, resource, resourceService, can) {\r\n const role = Roles[resource.permissions]\r\n\r\n if (role >= Roles.member) {\r\n can('read', resourceService, { _id: resource._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can('update', resourceService, { _id: resource._id })\r\n can(['create', 'remove'], 'authorisations', { resource: resource._id })\r\n }\r\n if (role >= Roles.owner) {\r\n can('remove', resourceService, { _id: resource._id })\r\n }\r\n}\r\n\r\n// Hook computing default abilities for a given user\r\nexport function defineUserAbilities (subject, can, cannot) {\r\n // Allow user registration\r\n can('service', 'users')\r\n can('create', 'users')\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n\r\n if (subject && subject._id) {\r\n // Read user profiles for authorizing\r\n can('read', 'users')\r\n // Update user profile and destroy it\r\n can(['update', 'remove'], 'users', { _id: subject._id })\r\n // Access authorisation service, then rights will be granted on a per-resource basis\r\n can('service', 'authorisations')\r\n // Access storage service, then rights will be granted on a per-resource basis\r\n can('service', 'storage')\r\n // This is for the user avatar\r\n // take care that the storage service uses 'id' as input but produces _id as output\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() })\r\n can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })\r\n can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })\r\n // Avatar is part of user profiles so that they can be read by any\r\n can('read', 'storage', { _id: { $regex: '^avatars/*' } })\r\n // Verification email, reset password, etc.\r\n can('service', 'account')\r\n can('create', 'account')\r\n can('service', 'devices')\r\n can('update', 'devices')\r\n can('remove', 'devices')\r\n }\r\n}\r\n\r\n// Compute abilities for a given user\r\nexport async function defineAbilities (subject, ...args) {\r\n const { rules, can, cannot } = AbilityBuilder.extract()\r\n\r\n // Run registered hooks providing any additional arguments used to handle complex use cases\r\n await Promise.all(hooks.map(async hook => {\r\n await hook(subject, can, cannot, ...args)\r\n }))\r\n\r\n // CASL cannot infer the object type from the object itself so we need\r\n // to tell it how he can find the object type, i.e. service name.\r\n return new Ability(rules, {\r\n subjectName: resource => {\r\n if (!resource || typeof resource === 'string') {\r\n return resource\r\n }\r\n return resource[RESOURCE_TYPE_KEY]\r\n }\r\n })\r\n}\r\n\r\ndefineAbilities.registerHook = function (hook) {\r\n if (!hooks.includes(hook)) {\r\n hooks.push(hook)\r\n }\r\n}\r\n\r\ndefineAbilities.unregisterHook = function (hook) {\r\n hooks = hooks.filter(registeredHook => registeredHook !== hook)\r\n}\r\n\r\nexport function hasServiceAbilities (abilities, service) {\r\n if (!abilities) return false\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation\r\n // Take care that in client we have the service path while on server we have the actual object\r\n const path = typeof service === 'string' ? service : service.getPath()\r\n return abilities.can('service', path) || abilities.can('service', _.replace(path, /^.*\\//, '*/'))\r\n}\r\n\r\nexport function hasResourceAbilities (abilities, operation, resourceType, context, resource) {\r\n if (!abilities) return false\r\n // Create a shallow copy adding context and type\r\n const object = Object.assign({}, resource)\r\n object[RESOURCE_TYPE_KEY] = resourceType\r\n // Add a virtual context to take it into account for object having no link to it\r\n if (context) object.context = (typeof context === 'object' ? context._id.toString() : context.toString())\r\n\r\n const result = abilities.can(operation, object)\r\n\r\n return result\r\n}\r\n\r\n// Utility function used to remove the virtual context from query\r\nexport function removeContext (query) {\r\n _.forOwn(query, (value, key) => {\r\n // Process current attributes or recurse\r\n // Take care to nested fields like 'field._id'\r\n if (key === 'context') {\r\n delete query.context\r\n } else if (Array.isArray(value)) {\r\n value.forEach(item => removeContext(item))\r\n // Remove empty objects from array\r\n // _.remove(value, item => _.isEmpty(item))\r\n // Remove empty arrays from query\r\n if (_.isEmpty(value)) delete query[key]\r\n } else if (typeof value === 'object') {\r\n removeContext(value)\r\n // Remove empty objects from query\r\n if (_.isEmpty(value)) delete query[key]\r\n }\r\n })\r\n return query\r\n}\r\n\r\n// Get the query used to filter the objects according to given abilities\r\n// A null query indicates that access should not be granted\r\nexport function getQueryForAbilities (abilities, operation, resourceType) {\r\n if (!abilities) return null\r\n\r\n const rules = abilities.rulesFor(operation, resourceType)\r\n const query = toMongoQuery(rules)\r\n // Remove any context to avoid taking it into account because it is not really stored on objects\r\n // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)\r\n return (query ? removeContext(_.cloneDeep(query)) : null)\r\n}\r\n\r\nfunction buildSubjectsQueryForResource (resourceScope, resourceId, role) {\r\n const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }\r\n if (role) {\r\n _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))\r\n }\r\n return query\r\n}\r\n\r\nexport function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\nexport function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {\r\n // Build the query\r\n const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)\r\n // Indicate we'd only like to count\r\n query.$limit = 0\r\n // Execute the query\r\n return subjectService.find({ query })\r\n}\r\n\r\n// Hook computing organisation abilities for a given user\r\nexport function defineOrganisationAbilities (subject, can, cannot) {\r\n if (subject) {\r\n // Create new organisations\r\n can('service', 'organisations')\r\n can('create', 'organisations')\r\n\r\n if (subject.organisations) {\r\n subject.organisations.forEach(organisation => {\r\n if (organisation._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, organisation, 'organisations', can)\r\n // Specific rules for organisations\r\n const role = Roles[organisation.permissions]\r\n if (role >= Roles.member) {\r\n // The unique identifier of a service is its path not its name.\r\n // Indeed we have for instance a 'groups' service in each organisation.\r\n can('service', organisation._id.toString() + '/members')\r\n can('read', 'members', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/tags')\r\n can('read', 'tags', { context: organisation._id })\r\n can('service', organisation._id.toString() + '/groups')\r\n can('service', organisation._id.toString() + '/storage')\r\n can(['read', 'create', 'remove'], 'storage', { context: organisation._id })\r\n }\r\n if (role >= Roles.manager) {\r\n can('update', 'members', { context: organisation._id })\r\n can('update', 'tags', { context: organisation._id })\r\n can('create', 'groups', { context: organisation._id })\r\n can(['create', 'remove'], 'tags', { context: organisation._id })\r\n // Remove invited members\r\n can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })\r\n }\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Hook computing group abilities for a given user\r\nexport function defineGroupAbilities (subject, can, cannot) {\r\n if (subject) {\r\n if (subject.groups) {\r\n subject.groups.forEach(group => {\r\n if (group._id) {\r\n // Generic rules for resources\r\n defineResourceRules(subject, group, 'groups', can)\r\n // No specific rules for groups\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n// Helper functions to find the members of a given organisation\r\nexport function findMembersOfOrganisation (usersService, organisationId, role) {\r\n return findSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\nexport function countMembersOfOrganisation (usersService, organisationId, role) {\r\n return countSubjectsForResource(usersService, 'organisations', organisationId, role)\r\n}\r\n\r\n// Helper functions to find the members of a given group\r\nexport function findMembersOfGroup (membersService, groupId, role) {\r\n return findSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function countMembersOfGroup (membersService, groupId, role) {\r\n return countSubjectsForResource(membersService, 'groups', groupId, role)\r\n}\r\n\r\nexport function getRoleForOrganisation (user, organisationId) {\r\n const result = _.find(user.organisations, { _id: organisationId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function getRoleForGroup (user, organisationId, groupId) {\r\n const result = _.find(user.groups, { context: organisationId, _id: groupId })\r\n if (!_.isUndefined(result)) return result.permissions\r\n return undefined\r\n}\r\n\r\nexport function findGroupsWithRole (user, organisationId, role) {\r\n return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })\r\n}\r\n"]}
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "description": {
18
18
  "type": "string",
19
- "maxLength": 256,
19
+ "maxLength": 2048,
20
20
  "field": {
21
21
  "component": "form/KTextField",
22
22
  "label": "schemas.GROUPS_DESCRIPTION_FIELD_LABEL"
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "description": {
18
18
  "type": "string",
19
- "maxLength": 256,
19
+ "maxLength": 2048,
20
20
  "field": {
21
21
  "component": "form/KTextField",
22
22
  "label": "schemas.GROUPS_DESCRIPTION_FIELD_LABEL"
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "description": {
18
18
  "type": "string",
19
- "maxLength": 256,
19
+ "maxLength": 2048,
20
20
  "field": {
21
21
  "component": "form/KTextField",
22
22
  "label": "schemas.ORGANISATIONS_DESCRIPTION_FIELD_LABEL"
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "description": {
18
18
  "type": "string",
19
- "maxLength": 256,
19
+ "maxLength": 2048,
20
20
  "field": {
21
21
  "component": "form/KTextField",
22
22
  "label": "schemas.ORGANISATIONS_DESCRIPTION_FIELD_LABEL"
@@ -27,7 +27,7 @@
27
27
  "field": {
28
28
  "component": "form/KAttachmentField",
29
29
  "label": "schemas.AVATAR_FIELD_LABEL",
30
- "service": "storage",
30
+ "service": "<%= id %>/storage",
31
31
  "acceptedFiles": ".png,.jpg,.jpeg,.webp",
32
32
  "maxFilesize": 0.5,
33
33
  "autoProcessQueue": false,
@@ -0,0 +1,139 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-06/schema#",
3
+ "$id": "http://www.kalisio.xyz/schemas/settings.update.json#",
4
+ "title": "schemas.UPDATE_SETTINGS_TITLE",
5
+ "type": "object",
6
+ "properties": {
7
+ "shortTime": {
8
+ "type": "string",
9
+ "group": "schemas.TIME_FORMAT_SETTINGS",
10
+ "field": {
11
+ "component": "form/KTextField",
12
+ "label": "schemas.TIME_FORMAT_SHORT_TIME_FIELD_LABEL",
13
+ "helper": "schemas.TIME_FORMAT_SHORT_TIME_FIELD_HELPER"
14
+ }
15
+ },
16
+ "longTime": {
17
+ "type": "string",
18
+ "group": "schemas.TIME_FORMAT_SETTINGS",
19
+ "field": {
20
+ "component": "form/KTextField",
21
+ "label": "schemas.TIME_FORMAT_LONG_TIME_FIELD_LABEL",
22
+ "helper": "schemas.TIME_FORMAT_LONG_TIME_FIELD_HELPER"
23
+ }
24
+ },
25
+ "shortDate": {
26
+ "type": "string",
27
+ "group": "schemas.TIME_FORMAT_SETTINGS",
28
+ "field": {
29
+ "component": "form/KTextField",
30
+ "label": "schemas.TIME_FORMAT_SHORT_DATE_FIELD_LABEL",
31
+ "helper": "schemas.TIME_FORMAT_SHORT_DATE_FIELD_HELPER"
32
+
33
+ }
34
+ },
35
+ "longDate": {
36
+ "type": "string",
37
+ "group": "schemas.TIME_FORMAT_SETTINGS",
38
+ "field": {
39
+ "component": "form/KTextField",
40
+ "label": "schemas.TIME_FORMAT_LONG_DATE_FIELD_LABEL",
41
+ "helper": "schemas.TIME_FORMAT_LONG_DATE_FIELD_HELPER"
42
+ }
43
+ },
44
+ "shortYear": {
45
+ "type": "string",
46
+ "group": "schemas.TIME_FORMAT_SETTINGS",
47
+ "field": {
48
+ "component": "form/KTextField",
49
+ "label": "schemas.TIME_FORMAT_SHORT_YEAR_FIELD_LABEL",
50
+ "helper": "schemas.TIME_FORMAT_SHORT_YEAR_FIELD_HELPER"
51
+ }
52
+ },
53
+ "longYear": {
54
+ "type": "string",
55
+ "group": "schemas.TIME_FORMAT_SETTINGS",
56
+ "field": {
57
+ "component": "form/KTextField",
58
+ "label": "schemas.TIME_FORMAT_LONG_YEAR_FIELD_LABEL",
59
+ "helper": "schemas.TIME_FORMAT_LONG_YEAR_FIELD_HELPER"
60
+ }
61
+ },
62
+ "utc": {
63
+ "type": "boolean",
64
+ "group": "schemas.TIME_FORMAT_SETTINGS",
65
+ "field": {
66
+ "component": "form/KToggleField",
67
+ "label": "schemas.TIME_FORMAT_UTC_FIELD_LABEL"
68
+ }
69
+ },
70
+ "timelineStep": {
71
+ "type": "number",
72
+ "group": "schemas.TIMELINE_SETTINGS",
73
+ "field": {
74
+ "component": "form/KSelectField",
75
+ "label": "schemas.TIMELINE_STEP",
76
+ "options": [
77
+ { "label": "5m", "value": 5 },
78
+ { "label": "10m", "value": 10 },
79
+ { "label": "12m", "value": 12 },
80
+ { "label": "15m", "value": 15 },
81
+ { "label": "20m", "value": 20 },
82
+ { "label": "30m", "value": 30 },
83
+ { "label": "60m", "value": 60, "selected": true }
84
+ ]
85
+ }
86
+ },
87
+ "timeseriesSpan": {
88
+ "type": "number",
89
+ "group": "schemas.TIMESERIES_SETTINGS",
90
+ "field": {
91
+ "component": "form/KSelectField",
92
+ "label": "schemas.TIMESERIES_SPAN",
93
+ "options": [
94
+ { "label": "3H", "value": 180 },
95
+ { "label": "6H", "value": 360 },
96
+ { "label": "12H", "value": 720 },
97
+ { "label": "24H", "value": 1440, "selected": true },
98
+ { "label": "48H", "value": 2880 },
99
+ { "label": "72H", "value": 4320 },
100
+ { "label": "96H", "value": 5760 }
101
+ ]
102
+ }
103
+ },
104
+ "restoreView": {
105
+ "type": "boolean",
106
+ "group": "schemas.MAP_SETTINGS",
107
+ "field": {
108
+ "component": "form/KToggleField",
109
+ "label": "schemas.RESTORE_VIEW_FIELD_LABEL"
110
+ }
111
+ },
112
+ "restoreLayers": {
113
+ "type": "boolean",
114
+ "group": "schemas.MAP_SETTINGS",
115
+ "field": {
116
+ "component": "form/KToggleField",
117
+ "label": "schemas.RESTORE_LAYERS_FIELD_LABEL"
118
+ }
119
+ },
120
+ "location": {
121
+ "type": "string",
122
+ "group": "schemas.MAP_SETTINGS",
123
+ "field": {
124
+ "component": "form/KTextField",
125
+ "label": "schemas.LOCATION_FORMAT_LABEL",
126
+ "helper": "schemas.LOCATION_FORMAT_HELPER"
127
+ }
128
+ }
129
+ },
130
+ "required": [
131
+ "shortTime",
132
+ "longTime",
133
+ "shortDate",
134
+ "longDate",
135
+ "shortYear",
136
+ "longYear",
137
+ "location"
138
+ ]
139
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-06/schema#",
3
3
  "$id": "http://www.kalisio.xyz/schemas/tags.update.json#",
4
- "title": "schemas.OBJECT_NAME",
4
+ "title": "schemas.TAG_NAME",
5
5
  "description": "Tag edition schema",
6
6
  "type": "object",
7
7
  "properties": {
@@ -20,6 +20,14 @@
20
20
  "component": "form/KIconField",
21
21
  "label": "schemas.TAGS_ICON_FIELD_LABEL"
22
22
  }
23
+ },
24
+ "description": {
25
+ "type": "string",
26
+ "maxLength": 2048,
27
+ "field": {
28
+ "component": "form/KTextField",
29
+ "label": "schemas.TAGS_DESCRIPTION_FIELD_LABEL"
30
+ }
23
31
  }
24
32
  },
25
33
  "required": ["value"]
@@ -89,7 +89,7 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
89
89
  });
90
90
  });
91
91
  const elementResults = yield collection.aggregate(pipeline, aggregateOptions).toArray();
92
- debug(`Generated ${elementResults.length} feature(s) for ${element} element`);
92
+ debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults);
93
93
  // Rearrange data so that we get ordered arrays indexed by element
94
94
  elementResults.forEach(function (result) {
95
95
  result.time = { [element]: result.time };
@@ -262,27 +262,31 @@ function asGeoJson(options = {}) {
262
262
  const params = hook.params;
263
263
  const query = params.query;
264
264
  if (!options.force && !params.asGeoJson) return;
265
- if (query.$distinct) return; // Not applicable in this case
266
- let results = hook.result;
265
+ if (query.$distinct || query.$aggregation) return; // Not applicable in this case
266
+ const longitudeProperty = options.longitudeProperty || 'longitude';
267
+ const latitudeProperty = options.latitudeProperty || 'latitude';
268
+ const altitudeProperty = options.altitudeProperty || 'altitude';
269
+ const geometryProperty = options.geometryProperty || 'geometry';
270
+ let results = _lodash2.default.get(hook, options.dataPath || 'result');
267
271
  // Already as GeoJson ?
268
272
  if (results.type === 'FeatureCollection') return;
269
- const pagination = _lodash2.default.pick(results, ['total', 'skip', 'limit']);
270
- results = Array.isArray(results) ? results : results.data;
273
+ const isPaginated = !_lodash2.default.isNil(results.data);
274
+ const pagination = isPaginated ? _lodash2.default.pick(results, ['total', 'skip', 'limit']) : {};
275
+ results = isPaginated ? results.data : results;
271
276
  results = results.filter(item => {
272
- // Item locations are not already in GeoJson feature format so we need to convert if we can
273
- if (options.longitudeProperty && options.latitudeProperty) {
274
- return _lodash2.default.has(item, options.longitudeProperty) && _lodash2.default.has(item, options.latitudeProperty);
275
- } else {
276
- return true;
277
- }
277
+ // Check if item is not already in GeoJson feature format and we can convert if required
278
+ return _lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty) ||
279
+ // When performing feature aggregation on geometries the result can be an array
280
+ Array.isArray(_lodash2.default.get(item, geometryProperty)) ||
281
+ // Check for a geometry property (previously provided or already transformed item)
282
+ _lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates');
278
283
  }).map(item => {
279
284
  let coordinates;
280
- // Item locations are not already in GeoJson feature format so we need to convert
281
285
  // Keep track of coordinates before picking properties
282
- if (options.longitudeProperty && options.latitudeProperty) {
283
- coordinates = [_lodash2.default.get(item, options.longitudeProperty), _lodash2.default.get(item, options.latitudeProperty)];
284
- if (options.altitudeProperty && _lodash2.default.has(item, options.altitudeProperty)) {
285
- coordinates.push(_lodash2.default.get(item, options.altitudeProperty));
286
+ if (_lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty)) {
287
+ coordinates = [_lodash2.default.get(item, longitudeProperty), _lodash2.default.get(item, latitudeProperty)];
288
+ if (_lodash2.default.has(item, altitudeProperty)) {
289
+ coordinates.push(_lodash2.default.get(item, altitudeProperty));
286
290
  }
287
291
  }
288
292
  if (options.pick) {
@@ -291,11 +295,26 @@ function asGeoJson(options = {}) {
291
295
  if (options.omit) {
292
296
  item = _lodash2.default.omit(item, options.omit);
293
297
  }
294
- // Item locations are not already in GeoJson feature format so we need to convert
295
- if (options.longitudeProperty && options.latitudeProperty) {
296
- return Object.assign({ type: 'Feature', geometry: { type: 'Point', coordinates }, properties: {} }, item);
297
- } else {
298
- return item;
298
+ // Item locations are already in GeoJson format
299
+ if (_lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates')) {
300
+ return Object.assign({
301
+ type: 'Feature',
302
+ geometry: _lodash2.default.get(item, geometryProperty),
303
+ properties: {}
304
+ }, _lodash2.default.omit(item, [geometryProperty]));
305
+ } else if (Array.isArray(_lodash2.default.get(item, geometryProperty))) {
306
+ return Object.assign({
307
+ type: 'Feature',
308
+ geometry: { type: 'GeometryCollection', geometries: _lodash2.default.get(item, geometryProperty) },
309
+ properties: {}
310
+ }, _lodash2.default.omit(item, [geometryProperty]));
311
+ } else if (coordinates) {
312
+ // Item locations are not already in GeoJson feature format so we need to convert
313
+ return Object.assign({
314
+ type: 'Feature',
315
+ geometry: { type: 'Point', coordinates },
316
+ properties: {}
317
+ }, _lodash2.default.omit(item, [longitudeProperty, latitudeProperty]));
299
318
  }
300
319
  });
301
320
  // Move some data to properties ?
@@ -307,16 +326,18 @@ function asGeoJson(options = {}) {
307
326
  });
308
327
  });
309
328
  }
310
- // Copy pagination information so that client can use it anyway
329
+ // Copy pagination information if any so that client can use it anyway
311
330
  if (_lodash2.default.get(options, 'asFeatureCollection', true)) {
312
- hook.result = Object.assign({
331
+ _lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
313
332
  type: 'FeatureCollection',
314
333
  features: results
315
- }, pagination);
316
- } else {
317
- hook.result = Object.assign({
334
+ }, pagination)); // If no pagination this merged object will be empty
335
+ } else if (isPaginated) {
336
+ _lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
318
337
  data: results
319
- }, pagination);
338
+ }, pagination));
339
+ } else {
340
+ _lodash2.default.set(hook, options.dataPath || 'result', results);
320
341
  }
321
342
  };
322
343
  }