@kalisio/kdk 1.3.6 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/.nyc_output/{0d403586-0c7c-4336-94d1-a49e9f02a905.json → 058fc679-d60a-4501-ac04-71171e5200b8.json} +0 -0
  2. package/.nyc_output/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +1 -0
  3. package/.nyc_output/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +1 -0
  4. package/.nyc_output/{21dd57bd-48c5-41c8-8800-252db32a9366.json → 8b1830fa-932e-4a61-9837-4a5b18f83ea9.json} +0 -0
  5. package/.nyc_output/{3eb3a2ca-53c2-4551-ba6b-adf70f9a53cd.json → afd2d144-3570-4858-b94a-b523dbd023dd.json} +0 -0
  6. package/.nyc_output/processinfo/058fc679-d60a-4501-ac04-71171e5200b8.json +1 -0
  7. package/.nyc_output/processinfo/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +1 -0
  8. package/.nyc_output/processinfo/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +1 -0
  9. package/.nyc_output/processinfo/8b1830fa-932e-4a61-9837-4a5b18f83ea9.json +1 -0
  10. package/.nyc_output/processinfo/afd2d144-3570-4858-b94a-b523dbd023dd.json +1 -0
  11. package/.nyc_output/processinfo/index.json +1 -1
  12. package/CHANGELOG.md +167 -79
  13. package/README.md +1 -1
  14. package/coverage/core/api/application.js.html +436 -436
  15. package/coverage/core/api/authentication.js.html +119 -119
  16. package/coverage/core/api/db.js.html +201 -201
  17. package/coverage/core/api/hooks/hooks.account.js.html +48 -48
  18. package/coverage/core/api/hooks/hooks.authentication.js.html +64 -64
  19. package/coverage/core/api/hooks/hooks.authorisations.js.html +369 -378
  20. package/coverage/core/api/hooks/hooks.devices.js.html +49 -49
  21. package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
  22. package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
  23. package/coverage/core/api/hooks/hooks.model.js.html +269 -269
  24. package/coverage/core/api/hooks/hooks.organisations.js.html +183 -231
  25. package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
  26. package/coverage/core/api/hooks/hooks.query.js.html +234 -198
  27. package/coverage/core/api/hooks/hooks.service.js.html +82 -82
  28. package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
  29. package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
  30. package/coverage/core/api/hooks/hooks.users.js.html +304 -256
  31. package/coverage/core/api/hooks/index.html +172 -172
  32. package/coverage/core/api/hooks/index.js.html +24 -24
  33. package/coverage/core/api/index.html +75 -75
  34. package/coverage/core/api/index.js.html +26 -26
  35. package/coverage/core/api/marshall.js.html +57 -57
  36. package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
  37. package/coverage/core/api/models/index.html +50 -50
  38. package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
  39. package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
  40. package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
  41. package/coverage/core/api/oauth2-handler.js.html +18 -18
  42. package/coverage/core/api/oauth2-verifier.js.html +38 -38
  43. package/coverage/core/api/services/account/account.hooks.js.html +16 -16
  44. package/coverage/core/api/services/account/account.service.js.html +108 -108
  45. package/coverage/core/api/services/account/index.html +32 -32
  46. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  47. package/coverage/core/api/services/authorisations/authorisations.service.js.html +132 -129
  48. package/coverage/core/api/services/authorisations/index.html +28 -28
  49. package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
  50. package/coverage/core/api/services/databases/databases.service.js.html +12 -12
  51. package/coverage/core/api/services/databases/index.html +24 -24
  52. package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
  53. package/coverage/core/api/services/devices/devices.service.js.html +121 -121
  54. package/coverage/core/api/services/devices/index.html +28 -28
  55. package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
  56. package/coverage/core/api/services/groups/index.html +13 -13
  57. package/coverage/core/api/services/index.html +21 -21
  58. package/coverage/core/api/services/index.js.html +137 -137
  59. package/coverage/core/api/services/mailer/index.html +24 -24
  60. package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
  61. package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
  62. package/coverage/core/api/services/organisations/index.html +24 -24
  63. package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
  64. package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
  65. package/coverage/core/api/services/pusher/index.html +34 -34
  66. package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
  67. package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
  68. package/coverage/core/api/services/pusher/pusher.service.js.html +414 -414
  69. package/coverage/core/api/services/storage/index.html +21 -21
  70. package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
  71. package/coverage/core/api/services/tags/index.html +21 -21
  72. package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
  73. package/coverage/core/api/services/users/index.html +21 -21
  74. package/coverage/core/api/services/users/users.hooks.js.html +33 -33
  75. package/coverage/core/common/errors.js.html +1 -1
  76. package/coverage/core/common/index.html +42 -27
  77. package/coverage/core/common/index.js.html +16 -16
  78. package/coverage/core/common/permissions.js.html +325 -265
  79. package/coverage/index.html +182 -182
  80. package/coverage/lcov-report/core/api/application.js.html +436 -436
  81. package/coverage/lcov-report/core/api/authentication.js.html +119 -119
  82. package/coverage/lcov-report/core/api/db.js.html +201 -201
  83. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +48 -48
  84. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +64 -64
  85. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +369 -378
  86. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +49 -49
  87. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
  88. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
  89. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
  90. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +183 -231
  91. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
  92. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +234 -198
  93. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
  94. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
  95. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
  96. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +304 -256
  97. package/coverage/lcov-report/core/api/hooks/index.html +172 -172
  98. package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
  99. package/coverage/lcov-report/core/api/index.html +75 -75
  100. package/coverage/lcov-report/core/api/index.js.html +26 -26
  101. package/coverage/lcov-report/core/api/marshall.js.html +57 -57
  102. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
  103. package/coverage/lcov-report/core/api/models/index.html +50 -50
  104. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
  105. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
  106. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
  107. package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
  108. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
  109. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
  110. package/coverage/lcov-report/core/api/services/account/account.service.js.html +108 -108
  111. package/coverage/lcov-report/core/api/services/account/index.html +32 -32
  112. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  113. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +132 -129
  114. package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
  115. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
  116. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
  117. package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
  118. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
  119. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +121 -121
  120. package/coverage/lcov-report/core/api/services/devices/index.html +28 -28
  121. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
  122. package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
  123. package/coverage/lcov-report/core/api/services/index.html +21 -21
  124. package/coverage/lcov-report/core/api/services/index.js.html +137 -137
  125. package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
  126. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
  127. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
  128. package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
  129. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
  130. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
  131. package/coverage/lcov-report/core/api/services/pusher/index.html +34 -34
  132. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
  133. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
  134. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +414 -414
  135. package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
  136. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
  137. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  138. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
  139. package/coverage/lcov-report/core/api/services/users/index.html +21 -21
  140. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
  141. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  142. package/coverage/lcov-report/core/common/index.html +42 -27
  143. package/coverage/lcov-report/core/common/index.js.html +16 -16
  144. package/coverage/lcov-report/core/common/permissions.js.html +325 -265
  145. package/coverage/lcov-report/index.html +182 -182
  146. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  147. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +118 -37
  148. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  149. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  150. package/coverage/lcov-report/map/api/index.html +1 -1
  151. package/coverage/lcov-report/map/api/index.js.html +1 -1
  152. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  153. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  154. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  155. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  156. package/coverage/lcov-report/map/api/models/index.html +1 -1
  157. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  158. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  159. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  160. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  161. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  162. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  163. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  164. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +2 -2
  165. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  166. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  167. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
  168. package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
  169. package/coverage/lcov-report/map/api/services/index.html +1 -1
  170. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  171. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  172. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  173. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  174. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  175. package/coverage/lcov-report/map/common/index.html +12 -12
  176. package/coverage/lcov-report/map/common/index.js.html +1 -1
  177. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  178. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  179. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  180. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  181. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  182. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  183. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  184. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  185. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  186. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  187. package/coverage/lcov-report/map/common/wfs-utils.js.html +8 -5
  188. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  189. package/coverage/lcov-report/map/common/wmts-utils.js.html +71 -11
  190. package/coverage/lcov.info +3742 -3949
  191. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  192. package/coverage/map/api/hooks/hooks.query.js.html +118 -37
  193. package/coverage/map/api/hooks/index.html +7 -7
  194. package/coverage/map/api/hooks/index.js.html +1 -1
  195. package/coverage/map/api/index.html +1 -1
  196. package/coverage/map/api/index.js.html +1 -1
  197. package/coverage/map/api/marshall.js.html +1 -1
  198. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  199. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  200. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  201. package/coverage/map/api/models/index.html +1 -1
  202. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  203. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  204. package/coverage/map/api/services/alerts/index.html +1 -1
  205. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  206. package/coverage/map/api/services/catalog/index.html +1 -1
  207. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  208. package/coverage/map/api/services/daptiles/index.html +1 -1
  209. package/coverage/map/api/services/features/features.hooks.js.html +2 -2
  210. package/coverage/map/api/services/features/index.html +1 -1
  211. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  212. package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
  213. package/coverage/map/api/services/geocoder/index.html +1 -1
  214. package/coverage/map/api/services/index.html +1 -1
  215. package/coverage/map/api/services/index.js.html +1 -1
  216. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  217. package/coverage/map/common/errors.js.html +1 -1
  218. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  219. package/coverage/map/common/grid.js.html +1 -1
  220. package/coverage/map/common/index.html +12 -12
  221. package/coverage/map/common/index.js.html +1 -1
  222. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  223. package/coverage/map/common/moment-utils.js.html +1 -1
  224. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  225. package/coverage/map/common/opendap-utils.js.html +1 -1
  226. package/coverage/map/common/permissions.js.html +1 -1
  227. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  228. package/coverage/map/common/tms-utils.js.html +1 -1
  229. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  230. package/coverage/map/common/wcs-utils.js.html +1 -1
  231. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  232. package/coverage/map/common/wfs-utils.js.html +8 -5
  233. package/coverage/map/common/wms-utils.js.html +1 -1
  234. package/coverage/map/common/wmts-utils.js.html +71 -11
  235. package/extras/icons/kanban.png +0 -0
  236. package/extras/tours/core/add-member.js +10 -1
  237. package/extras/tours/core/{tag-member.js → edit-member-tags.js} +4 -3
  238. package/extras/tours/core/groups.js +8 -2
  239. package/extras/tours/core/members.js +11 -21
  240. package/extras/tours/core/tags.js +7 -1
  241. package/extras/tours/map/catalog-categories.js +4 -4
  242. package/extras/tours/map/catalog-panel.js +16 -16
  243. package/extras/tours/map/favorite-views.js +3 -3
  244. package/lib/core/api/hooks/hooks.authorisations.js +149 -140
  245. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  246. package/lib/core/api/hooks/hooks.organisations.js +1 -23
  247. package/lib/core/api/hooks/hooks.organisations.js.map +1 -1
  248. package/lib/core/api/hooks/hooks.query.js +22 -0
  249. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  250. package/lib/core/api/hooks/hooks.users.js +34 -18
  251. package/lib/core/api/hooks/hooks.users.js.map +1 -1
  252. package/lib/core/api/services/authorisations/authorisations.service.js +34 -25
  253. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  254. package/lib/core/client/api.js +1 -0
  255. package/lib/core/client/api.js.map +1 -1
  256. package/lib/core/client/components/account/KAccountDZ.vue +3 -4
  257. package/lib/core/client/components/account/KAccountDevices.vue +5 -6
  258. package/lib/core/client/components/account/KDeviceCard.vue +2 -1
  259. package/lib/core/client/components/account/KIdentityPanel.vue +1 -7
  260. package/lib/core/client/components/collection/KBoard.vue +26 -155
  261. package/lib/core/client/components/collection/KCard.vue +144 -42
  262. package/lib/core/client/components/collection/KCardSection.vue +52 -0
  263. package/lib/core/client/components/collection/KColumn.vue +181 -0
  264. package/lib/core/client/components/collection/KGrid.vue +13 -18
  265. package/lib/core/client/components/collection/KHistory.vue +61 -89
  266. package/lib/core/client/components/collection/KHistoryEntry.vue +90 -66
  267. package/lib/core/client/components/collection/KItem.vue +21 -2
  268. package/lib/core/client/components/collection/KList.vue +9 -12
  269. package/lib/core/client/components/collection/KTable.vue +33 -39
  270. package/lib/core/client/components/collection/index.js +6 -1
  271. package/lib/core/client/components/collection/index.js.map +1 -1
  272. package/lib/core/client/components/editor/KEditor.vue +0 -6
  273. package/lib/core/client/components/editor/KModalEditor.vue +4 -4
  274. package/lib/core/client/components/editor/KSettingsEditor.vue +49 -0
  275. package/lib/core/client/components/form/KAttachmentField.vue +10 -10
  276. package/lib/core/client/components/form/KChipsField.vue +28 -23
  277. package/lib/core/client/components/form/KColorField.vue +30 -25
  278. package/lib/core/client/components/form/KFileField.vue +11 -40
  279. package/lib/core/client/components/form/KForm.vue +0 -12
  280. package/lib/core/client/components/form/KIconField.vue +1 -0
  281. package/lib/core/client/components/form/KItemField.vue +6 -2
  282. package/lib/core/client/components/form/KRoleField.vue +56 -0
  283. package/lib/core/client/components/form/KSelectField.vue +16 -1
  284. package/lib/core/client/components/form/KView.vue +5 -14
  285. package/lib/core/client/components/frame/KAction.vue +18 -12
  286. package/lib/core/client/components/frame/KAvatar.vue +3 -3
  287. package/lib/core/client/components/frame/KChart.vue +60 -0
  288. package/lib/core/client/components/frame/KChipsPane.vue +80 -0
  289. package/lib/core/client/components/frame/KContent.vue +1 -1
  290. package/lib/core/client/components/frame/KModal.vue +30 -44
  291. package/lib/core/client/components/frame/KPanel.vue +1 -1
  292. package/lib/core/client/components/frame/{KMenu.vue → KPopupAction.vue} +6 -7
  293. package/lib/core/client/components/frame/KSpot.vue +31 -0
  294. package/lib/core/client/components/frame/KStamp.vue +62 -0
  295. package/lib/core/client/components/frame/index.js +56 -1
  296. package/lib/core/client/components/frame/index.js.map +1 -1
  297. package/lib/core/client/components/input/KColorChooser.vue +16 -8
  298. package/lib/core/client/components/input/KIconChooser.vue +2 -1
  299. package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
  300. package/lib/core/client/components/input/KUploader.vue +14 -5
  301. package/lib/core/client/components/layout/KAbout.vue +9 -3
  302. package/lib/core/client/components/layout/KFab.vue +1 -1
  303. package/lib/core/client/components/layout/KPage.vue +44 -19
  304. package/lib/core/client/components/layout/KTour.vue +2 -2
  305. package/lib/core/client/components/layout/KWelcome.vue +13 -12
  306. package/lib/core/client/components/layout/KWindow.vue +1 -1
  307. package/lib/core/client/components/media/KImageViewer.vue +9 -7
  308. package/lib/core/client/components/media/KMediaBrowser.vue +12 -8
  309. package/lib/core/client/components/menu/KMenu.vue +103 -0
  310. package/lib/core/client/components/team/KAddMember.vue +17 -9
  311. package/lib/core/client/components/team/KChangeRole.vue +5 -7
  312. package/lib/core/client/components/team/KGroupCard.vue +34 -51
  313. package/lib/core/client/components/team/KGroupsActivity.vue +9 -2
  314. package/lib/core/client/components/team/KJoinGroup.vue +5 -7
  315. package/lib/core/client/components/team/KMemberCard.vue +104 -63
  316. package/lib/core/client/components/team/KMembersActivity.vue +9 -2
  317. package/lib/core/client/components/team/KOrganisationsActivity.vue +8 -1
  318. package/lib/core/client/components/team/KTagCard.vue +26 -26
  319. package/lib/core/client/components/team/KTagsActivity.vue +9 -2
  320. package/lib/core/client/components/time/KTimeRange.vue +144 -0
  321. package/lib/core/client/components/viewer/KModalViewer.vue +6 -0
  322. package/lib/core/client/components/viewer/KViewer.vue +0 -6
  323. package/lib/core/client/i18n/core_en.json +138 -94
  324. package/lib/core/client/i18n/core_fr.json +61 -17
  325. package/lib/core/client/index.js +46 -14
  326. package/lib/core/client/index.js.map +1 -1
  327. package/lib/core/client/layout.js +8 -1
  328. package/lib/core/client/layout.js.map +1 -1
  329. package/lib/core/client/mixins/mixin.authorisation.js +28 -18
  330. package/lib/core/client/mixins/mixin.authorisation.js.map +1 -1
  331. package/lib/core/client/mixins/mixin.base-collection.js +57 -9
  332. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  333. package/lib/core/client/mixins/mixin.base-context.js +1 -1
  334. package/lib/core/client/mixins/mixin.base-context.js.map +1 -1
  335. package/lib/core/client/mixins/mixin.base-editor.js +26 -16
  336. package/lib/core/client/mixins/mixin.base-editor.js.map +1 -1
  337. package/lib/core/client/mixins/mixin.base-field.js +0 -4
  338. package/lib/core/client/mixins/mixin.base-field.js.map +1 -1
  339. package/lib/core/client/mixins/mixin.base-item.js +29 -14
  340. package/lib/core/client/mixins/mixin.base-item.js.map +1 -1
  341. package/lib/core/client/mixins/mixin.base-viewer.js +0 -2
  342. package/lib/core/client/mixins/mixin.base-viewer.js.map +1 -1
  343. package/lib/core/client/mixins/mixin.object-proxy.js +17 -3
  344. package/lib/core/client/mixins/mixin.object-proxy.js.map +1 -1
  345. package/lib/core/client/mixins/mixin.schema-proxy.js +31 -0
  346. package/lib/core/client/mixins/mixin.schema-proxy.js.map +1 -1
  347. package/lib/core/client/mixins/mixin.service.js +5 -33
  348. package/lib/core/client/mixins/mixin.service.js.map +1 -1
  349. package/lib/core/client/reader.js +54 -0
  350. package/lib/core/client/reader.js.map +1 -0
  351. package/lib/core/client/readers/index.js +30 -0
  352. package/lib/core/client/readers/index.js.map +1 -0
  353. package/lib/core/client/readers/reader.csv.js +43 -0
  354. package/lib/core/client/readers/reader.csv.js.map +1 -0
  355. package/lib/core/client/readers/reader.json.js +38 -0
  356. package/lib/core/client/readers/reader.json.js.map +1 -0
  357. package/lib/core/client/services/index.js +23 -0
  358. package/lib/core/client/services/index.js.map +1 -1
  359. package/lib/core/client/services/local-settings.service.js +4 -0
  360. package/lib/core/client/services/local-settings.service.js.map +1 -1
  361. package/lib/core/client/time.js +131 -0
  362. package/lib/core/client/time.js.map +1 -0
  363. package/lib/core/common/permissions.js +65 -23
  364. package/lib/core/common/permissions.js.map +1 -1
  365. package/lib/core/common/schemas/groups.create.json +1 -1
  366. package/lib/core/common/schemas/groups.update.json +1 -1
  367. package/lib/core/common/schemas/organisations.create.json +1 -1
  368. package/lib/core/common/schemas/organisations.update.json +2 -2
  369. package/lib/core/common/schemas/settings.update.json +139 -0
  370. package/lib/core/common/schemas/tags.update.json +9 -1
  371. package/lib/map/api/hooks/hooks.query.js +55 -29
  372. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  373. package/lib/map/api/services/features/features.hooks.js +1 -1
  374. package/lib/map/api/services/features/features.hooks.js.map +1 -1
  375. package/lib/map/client/components/KCaptureToolbar.vue +156 -0
  376. package/lib/map/client/components/KColorLegend.vue +25 -23
  377. package/lib/map/client/components/KFavoriteViews.vue +71 -35
  378. package/lib/map/client/components/KFeaturesChart.vue +11 -9
  379. package/lib/map/client/components/KFeaturesFilter.vue +18 -8
  380. package/lib/map/client/components/KFeaturesTable.vue +27 -2
  381. package/lib/map/client/components/KLayerEditionToolbar.vue +51 -0
  382. package/lib/map/client/components/KLayerStyleEditor.vue +12 -5
  383. package/lib/map/client/components/KLayerStyleForm.vue +44 -33
  384. package/lib/map/client/components/KLocationInput.vue +126 -65
  385. package/lib/map/client/components/KLocationMap.vue +199 -84
  386. package/lib/map/client/components/KMeasureTool.vue +340 -0
  387. package/lib/map/client/components/KPositionIndicator.vue +1 -0
  388. package/lib/map/client/components/KTimeline.vue +41 -37
  389. package/lib/map/client/components/KUrlLegend.vue +21 -19
  390. package/lib/map/client/components/catalog/KBaseLayersSelector.vue +105 -0
  391. package/lib/map/client/components/catalog/KCatalog.vue +14 -2
  392. package/lib/map/client/components/catalog/KConnectLayer.vue +31 -11
  393. package/lib/map/client/components/catalog/KCreateLayer.vue +37 -14
  394. package/lib/map/client/components/catalog/KImportLayer.vue +33 -40
  395. package/lib/map/client/components/catalog/KLayerCategories.vue +86 -62
  396. package/lib/map/client/components/catalog/KLayersSelector.vue +44 -42
  397. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
  398. package/lib/map/client/components/form/KLocationField.vue +1 -1
  399. package/lib/map/client/components/form/KOwsLayerField.vue +7 -0
  400. package/lib/map/client/components/form/KOwsServiceField.vue +1 -0
  401. package/lib/map/client/components/widget/KInformationBox.vue +10 -16
  402. package/lib/map/client/components/widget/KMapillaryViewer.vue +59 -49
  403. package/lib/map/client/components/widget/KTimeSeries.vue +119 -31
  404. package/lib/map/client/i18n/map_en.json +105 -20
  405. package/lib/map/client/i18n/map_fr.json +107 -23
  406. package/lib/map/client/init.js +24 -7
  407. package/lib/map/client/init.js.map +1 -1
  408. package/lib/map/client/leaflet/GSMaPLayer.js +4 -9
  409. package/lib/map/client/leaflet/GSMaPLayer.js.map +1 -1
  410. package/lib/map/client/leaflet/MaskLayer.js +73 -0
  411. package/lib/map/client/leaflet/MaskLayer.js.map +1 -0
  412. package/lib/map/client/mixins/globe/mixin.base-globe.js +7 -6
  413. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  414. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -9
  415. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  416. package/lib/map/client/mixins/globe/mixin.popup.js +4 -0
  417. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  418. package/lib/map/client/mixins/globe/mixin.tooltip.js +4 -0
  419. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  420. package/lib/map/client/mixins/index.js +8 -13
  421. package/lib/map/client/mixins/index.js.map +1 -1
  422. package/lib/map/client/mixins/map/mixin.base-map.js +71 -8
  423. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  424. package/lib/map/client/mixins/map/mixin.canvas-layers.js +276 -51
  425. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  426. package/lib/map/client/mixins/map/mixin.edit-layers.js +218 -121
  427. package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
  428. package/lib/map/client/mixins/map/mixin.file-layers.js +46 -93
  429. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  430. package/lib/map/client/mixins/map/mixin.geojson-layers.js +22 -11
  431. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  432. package/lib/map/client/mixins/map/mixin.georaster-layers.js +7 -4
  433. package/lib/map/client/mixins/map/mixin.georaster-layers.js.map +1 -1
  434. package/lib/map/client/mixins/map/mixin.gsmap-layers.js +3 -3
  435. package/lib/map/client/mixins/map/mixin.gsmap-layers.js.map +1 -1
  436. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +8 -10
  437. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  438. package/lib/map/client/mixins/map/mixin.mapillary-layers.js +25 -40
  439. package/lib/map/client/mixins/map/mixin.mapillary-layers.js.map +1 -1
  440. package/lib/map/client/mixins/map/mixin.popup.js +4 -0
  441. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  442. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +5 -3
  443. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
  444. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +5 -3
  445. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
  446. package/lib/map/client/mixins/map/mixin.tooltip.js +4 -0
  447. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  448. package/lib/map/client/mixins/mixin.activity.js +62 -68
  449. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  450. package/lib/map/client/mixins/mixin.context.js +26 -3
  451. package/lib/map/client/mixins/mixin.context.js.map +1 -1
  452. package/lib/map/client/mixins/mixin.feature-selection.js +8 -10
  453. package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
  454. package/lib/map/client/mixins/mixin.feature-service.js +9 -7
  455. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  456. package/lib/map/client/mixins/mixin.infobox.js +4 -0
  457. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  458. package/lib/map/client/mixins/mixin.weacast.js +6 -4
  459. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  460. package/lib/map/client/pixi-utils.js +9 -0
  461. package/lib/map/client/pixi-utils.js.map +1 -1
  462. package/lib/map/client/readers/index.js +42 -0
  463. package/lib/map/client/readers/index.js.map +1 -0
  464. package/lib/map/client/readers/reader.geojson.js +59 -0
  465. package/lib/map/client/readers/reader.geojson.js.map +1 -0
  466. package/lib/map/client/readers/reader.gpx.js +41 -0
  467. package/lib/map/client/readers/reader.gpx.js.map +1 -0
  468. package/lib/map/client/readers/reader.kml.js +41 -0
  469. package/lib/map/client/readers/reader.kml.js.map +1 -0
  470. package/lib/map/client/utils.js +52 -1
  471. package/lib/map/client/utils.js.map +1 -1
  472. package/lib/map/common/wfs-utils.js +1 -1
  473. package/lib/map/common/wfs-utils.js.map +1 -1
  474. package/lib/map/common/wmts-utils.js +31 -7
  475. package/lib/map/common/wmts-utils.js.map +1 -1
  476. package/lib/test/client/core/account.js +100 -0
  477. package/lib/test/client/core/account.js.map +1 -0
  478. package/lib/test/client/core/api.js +400 -0
  479. package/lib/test/client/core/api.js.map +1 -0
  480. package/lib/test/client/core/collection.js +109 -0
  481. package/lib/test/client/core/collection.js.map +1 -0
  482. package/lib/test/client/core/index.js +90 -0
  483. package/lib/test/client/core/index.js.map +1 -0
  484. package/lib/test/client/core/layout.js +221 -0
  485. package/lib/test/client/core/layout.js.map +1 -0
  486. package/lib/test/client/core/runner.js +203 -0
  487. package/lib/test/client/core/runner.js.map +1 -0
  488. package/lib/test/client/core/screens.js +68 -0
  489. package/lib/test/client/core/screens.js.map +1 -0
  490. package/lib/test/client/core/utils.js +304 -0
  491. package/lib/test/client/core/utils.js.map +1 -0
  492. package/lib/test/client/index.js +20 -0
  493. package/lib/test/client/index.js.map +1 -0
  494. package/lib/test/client/map/catalog.js +192 -0
  495. package/lib/test/client/map/catalog.js.map +1 -0
  496. package/lib/test/client/map/controls.js +54 -0
  497. package/lib/test/client/map/controls.js.map +1 -0
  498. package/lib/test/client/map/index.js +30 -0
  499. package/lib/test/client/map/index.js.map +1 -0
  500. package/package.json +18 -9
  501. package/test.client.js +1 -0
  502. package/tests/core/test-log-2021-09-02.log +47 -0
  503. package/tests/map/test-log-%DATE%.logYYYY-09-DD +6 -0
  504. package/tests/map/test-log-2021-09-02.log +3 -0
  505. package/.nyc_output/5baea3f8-cf8e-4c76-8ccf-0e48b6f16fa4.json +0 -1
  506. package/.nyc_output/dddde6b5-9024-4b0e-8d8b-4502d437b8a4.json +0 -1
  507. package/.nyc_output/ef5e94ba-9a99-4fb6-ab1d-1a974112bb83.json +0 -1
  508. package/.nyc_output/fd4681f8-5f41-4f17-b393-9f399b24c128.json +0 -1
  509. package/.nyc_output/processinfo/0d403586-0c7c-4336-94d1-a49e9f02a905.json +0 -1
  510. package/.nyc_output/processinfo/21dd57bd-48c5-41c8-8800-252db32a9366.json +0 -1
  511. package/.nyc_output/processinfo/3eb3a2ca-53c2-4551-ba6b-adf70f9a53cd.json +0 -1
  512. package/.nyc_output/processinfo/5baea3f8-cf8e-4c76-8ccf-0e48b6f16fa4.json +0 -1
  513. package/.nyc_output/processinfo/dddde6b5-9024-4b0e-8d8b-4502d437b8a4.json +0 -1
  514. package/.nyc_output/processinfo/ef5e94ba-9a99-4fb6-ab1d-1a974112bb83.json +0 -1
  515. package/.nyc_output/processinfo/fd4681f8-5f41-4f17-b393-9f399b24c128.json +0 -1
  516. package/extras/testcafe/Dockerfile +0 -48
  517. package/extras/testcafe/docker-entrypoint.sh +0 -27
  518. package/extras/testcafe/page-models/core/account.js +0 -75
  519. package/extras/testcafe/page-models/core/base-collection.js +0 -41
  520. package/extras/testcafe/page-models/core/base-page.js +0 -25
  521. package/extras/testcafe/page-models/core/groups.js +0 -36
  522. package/extras/testcafe/page-models/core/index.js +0 -140
  523. package/extras/testcafe/page-models/core/layout.js +0 -145
  524. package/extras/testcafe/page-models/core/members.js +0 -98
  525. package/extras/testcafe/page-models/core/organisations.js +0 -76
  526. package/extras/testcafe/page-models/core/screens.js +0 -99
  527. package/extras/testcafe/page-models/core/tags.js +0 -21
  528. package/extras/testcafe/page-models/map/add-layer.js +0 -51
  529. package/extras/testcafe/page-models/map/catalog.js +0 -132
  530. package/extras/testcafe/page-models/map/index.js +0 -36
  531. package/extras/testcafe/page-models/map/map-activity.js +0 -42
  532. package/extras/testcafe/page-models/map/timeline.js +0 -67
  533. package/lib/core/client/components/frame/KLabel.vue +0 -56
  534. package/lib/core/client/components/team/KTagsPane.vue +0 -35
  535. package/lib/map/client/leaflet/TiledMapillaryLayer.js +0 -137
  536. package/lib/map/client/leaflet/TiledMapillaryLayer.js.map +0 -1
  537. package/lib/map/client/mixins/mixin.time.js +0 -73
  538. package/lib/map/client/mixins/mixin.time.js.map +0 -1
  539. package/tests/core/account.test.js +0 -423
  540. package/tests/core/client.test.js.skip +0 -37
  541. package/tests/core/config/default.js +0 -96
  542. package/tests/core/config/email-templates/confirmInvitation/html.ejs +0 -18
  543. package/tests/core/config/email-templates/identityChange/html.ejs +0 -12
  544. package/tests/core/config/email-templates/newDevice/html.ejs +0 -7
  545. package/tests/core/config/email-templates/passwordChange/html.ejs +0 -5
  546. package/tests/core/config/email-templates/resendVerifySignup/html.ejs +0 -10
  547. package/tests/core/config/email-templates/resetPwd/html.ejs +0 -5
  548. package/tests/core/config/email-templates/sendResetPwd/html.ejs +0 -8
  549. package/tests/core/config/email-templates/verifySignup/html.ejs +0 -3
  550. package/tests/core/data/10k_most_common_passwords.txt +0 -10000
  551. package/tests/core/data/logo.png +0 -0
  552. package/tests/core/hooks.test.js +0 -175
  553. package/tests/core/index.test.js +0 -432
  554. package/tests/core/notifications.test.js +0 -465
  555. package/tests/core/storage.test.js +0 -134
  556. package/tests/core/team.test.js +0 -610
  557. package/tests/core/utils.js +0 -62
  558. package/tests/map/alerts.test.js +0 -554
  559. package/tests/map/config/default.js +0 -112
  560. package/tests/map/config/layers.json +0 -37
  561. package/tests/map/daptiles.test.js +0 -41
  562. package/tests/map/data/DescribeCoverage.xml +0 -55
  563. package/tests/map/data/GetCoverage.tif +0 -0
  564. package/tests/map/data/adsb.observations.json +0 -132
  565. package/tests/map/data/dataset.grb.das +0 -55
  566. package/tests/map/data/dataset.grb.dds +0 -17
  567. package/tests/map/data/dataset.grb.dods +0 -0
  568. package/tests/map/data/lat_lon_bounds.grb.dods +0 -0
  569. package/tests/map/data/subdataset.grb.dods +0 -0
  570. package/tests/map/data/vigicrues.observations.json +0 -47042
  571. package/tests/map/data/vigicrues.stations.json +0 -15422
  572. package/tests/map/data/zones.json +0 -1228
  573. package/tests/map/forecast-data/gfs-world/u-wind/2021-07-15_12-00-00_2021-07-15_12-00-00.grib +0 -0
  574. package/tests/map/forecast-data/gfs-world/v-wind/2021-07-15_12-00-00_2021-07-15_12-00-00.grib +0 -0
  575. package/tests/map/grid-sources.test.js +0 -304
  576. package/tests/map/hooks.test.js +0 -96
  577. package/tests/map/index.test.js +0 -333
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.readJSON = readJSON;
7
+
8
+ var _loglevel = require('loglevel');
9
+
10
+ var _loglevel2 = _interopRequireDefault(_loglevel);
11
+
12
+ var _i18next = require('i18next');
13
+
14
+ var _i18next2 = _interopRequireDefault(_i18next);
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function readJSON(file, options) {
19
+ return new Promise((resolve, reject) => {
20
+ const reader = new FileReader();
21
+ reader.onloadend = () => {
22
+ let content = reader.result;
23
+ try {
24
+ content = JSON.parse(content);
25
+ } catch (error) {
26
+ _loglevel2.default.debug(error);
27
+ reject(new Error(_i18next2.default.t('errors.INVALID_JSON_FILE', { file }), { errors: error }));
28
+ }
29
+ resolve(content);
30
+ };
31
+ reader.onerror = error => {
32
+ _loglevel2.default.debug(error);
33
+ reject(new Error(_i18next2.default.t('errors.CANNOT_READ_FILE', { file }), { errors: error }));
34
+ };
35
+ reader.readAsText(file);
36
+ });
37
+ }
38
+ //# sourceMappingURL=reader.json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../core/client/readers/reader.json.js"],"names":["readJSON","file","options","Promise","resolve","reject","reader","FileReader","onloadend","content","result","JSON","parse","error","logger","debug","Error","i18next","t","errors","onerror","readAsText"],"mappings":";;;;;QAGgBA,Q,GAAAA,Q;;AAHhB;;;;AACA;;;;;;AAEO,SAASA,QAAT,CAAmBC,IAAnB,EAAyBC,OAAzB,EAAkC;AACvC,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,UAAMC,SAAS,IAAIC,UAAJ,EAAf;AACAD,WAAOE,SAAP,GAAmB,MAAM;AACvB,UAAIC,UAAUH,OAAOI,MAArB;AACA,UAAI;AACFD,kBAAUE,KAAKC,KAAL,CAAWH,OAAX,CAAV;AACD,OAFD,CAEE,OAAOI,KAAP,EAAc;AACdC,2BAAOC,KAAP,CAAaF,KAAb;AACAR,eAAO,IAAIW,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,0BAAV,EAAsC,EAAEjB,IAAF,EAAtC,CAAV,EAA2D,EAAEkB,QAAQN,KAAV,EAA3D,CAAP;AACD;AACDT,cAAQK,OAAR;AACD,KATD;AAUAH,WAAOc,OAAP,GAAkBP,KAAD,IAAW;AAC1BC,yBAAOC,KAAP,CAAaF,KAAb;AACAR,aAAO,IAAIW,KAAJ,CAAUC,kBAAQC,CAAR,CAAU,yBAAV,EAAqC,EAAEjB,IAAF,EAArC,CAAV,EAA0D,EAAEkB,QAAQN,KAAV,EAA1D,CAAP;AACD,KAHD;AAIAP,WAAOe,UAAP,CAAkBpB,IAAlB;AACD,GAjBM,CAAP;AAkBD","file":"reader.json.js","sourcesContent":["import logger from 'loglevel'\r\nimport i18next from 'i18next'\r\n\r\nexport function readJSON (file, options) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n let content = reader.result\r\n try {\r\n content = JSON.parse(content)\r\n } catch (error) {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.INVALID_JSON_FILE', { file }), { errors: error }))\r\n }\r\n resolve(content)\r\n }\r\n reader.onerror = (error) => {\r\n logger.debug(error)\r\n reject(new Error(i18next.t('errors.CANNOT_READ_FILE', { file }), { errors: error }))\r\n }\r\n reader.readAsText(file)\r\n })\r\n}\r\n"]}
@@ -10,6 +10,10 @@ var _localSettings = require('./local-settings.service');
10
10
 
11
11
  var _localSettings2 = _interopRequireDefault(_localSettings);
12
12
 
13
+ var _config = require('config');
14
+
15
+ var _config2 = _interopRequireDefault(_config);
16
+
13
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
18
 
15
19
  exports.LocalSettingsService = _localSettings2.default;
@@ -26,5 +30,24 @@ function init() {
26
30
  api.declareService('storage', { context: true });
27
31
  api.declareService('account');
28
32
  api.declareService('devices');
33
+
34
+ // Setup service for settings edition
35
+ api.createService('settings', Object.assign({
36
+ service: _localSettings2.default,
37
+ propertyMapping: {
38
+ shortTime: 'time.format.time.short',
39
+ longTime: 'time.format.time.long',
40
+ shortDate: 'time.format.date.short',
41
+ longDate: 'time.format.date.long',
42
+ shortYear: 'time.format.year.short',
43
+ longYear: 'time.format.year.long',
44
+ utc: 'time.format.utc',
45
+ timelineStep: 'time.step',
46
+ timeseriesSpan: 'timeseries.span',
47
+ location: 'locationFormat',
48
+ restoreView: 'restore.view',
49
+ restoreLayers: 'restore.layers'
50
+ }
51
+ }, _config2.default.settings || {})); // Default options can be overriden from app config
29
52
  }
30
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/services/index.js"],"names":["init","LocalSettingsService","api","declareService","context"],"mappings":";;;;;;kBAIwBA,I;;AAJxB;;;;;;QAESC,oB,GAAAA,uB;AAEM,SAASD,IAAT,GAAiB;AAC9B,QAAME,MAAM,IAAZ;;AAEA;AACAA,MAAIC,cAAJ,CAAmB,OAAnB;AACAD,MAAIC,cAAJ,CAAmB,gBAAnB;AACAD,MAAIC,cAAJ,CAAmB,MAAnB,EAA2B,EAAEC,SAAS,IAAX,EAA3B;AACAF,MAAIC,cAAJ,CAAmB,eAAnB;AACAD,MAAIC,cAAJ,CAAmB,SAAnB,EAA8B,EAAEC,SAAS,IAAX,EAA9B;AACAF,MAAIC,cAAJ,CAAmB,QAAnB,EAA6B,EAAEC,SAAS,IAAX,EAA7B;AACAF,MAAIC,cAAJ,CAAmB,SAAnB,EAA8B,EAAEC,SAAS,IAAX,EAA9B;AACAF,MAAIC,cAAJ,CAAmB,SAAnB;AACAD,MAAIC,cAAJ,CAAmB,SAAnB;AACD","file":"index.js","sourcesContent":["import LocalSettingsService from './local-settings.service'\r\n\r\nexport { LocalSettingsService }\r\n\r\nexport default function init () {\r\n const api = this\r\n\r\n // Declare the built-in services, others are optional\r\n api.declareService('users')\r\n api.declareService('authorisations')\r\n api.declareService('tags', { context: true })\r\n api.declareService('organisations')\r\n api.declareService('members', { context: true })\r\n api.declareService('groups', { context: true })\r\n api.declareService('storage', { context: true })\r\n api.declareService('account')\r\n api.declareService('devices')\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/services/index.js"],"names":["init","LocalSettingsService","api","declareService","context","createService","Object","assign","service","propertyMapping","shortTime","longTime","shortDate","longDate","shortYear","longYear","utc","timelineStep","timeseriesSpan","location","restoreView","restoreLayers","config","settings"],"mappings":";;;;;;kBAKwBA,I;;AALxB;;;;AACA;;;;;;QAESC,oB,GAAAA,uB;AAEM,SAASD,IAAT,GAAiB;AAC9B,QAAME,MAAM,IAAZ;;AAEA;AACAA,MAAIC,cAAJ,CAAmB,OAAnB;AACAD,MAAIC,cAAJ,CAAmB,gBAAnB;AACAD,MAAIC,cAAJ,CAAmB,MAAnB,EAA2B,EAAEC,SAAS,IAAX,EAA3B;AACAF,MAAIC,cAAJ,CAAmB,eAAnB;AACAD,MAAIC,cAAJ,CAAmB,SAAnB,EAA8B,EAAEC,SAAS,IAAX,EAA9B;AACAF,MAAIC,cAAJ,CAAmB,QAAnB,EAA6B,EAAEC,SAAS,IAAX,EAA7B;AACAF,MAAIC,cAAJ,CAAmB,SAAnB,EAA8B,EAAEC,SAAS,IAAX,EAA9B;AACAF,MAAIC,cAAJ,CAAmB,SAAnB;AACAD,MAAIC,cAAJ,CAAmB,SAAnB;;AAEA;AACAD,MAAIG,aAAJ,CAAkB,UAAlB,EAA8BC,OAAOC,MAAP,CAAc;AAC1CC,aAASP,uBADiC;AAE1CQ,qBAAiB;AACfC,iBAAW,wBADI;AAEfC,gBAAU,uBAFK;AAGfC,iBAAW,wBAHI;AAIfC,gBAAU,uBAJK;AAKfC,iBAAW,wBALI;AAMfC,gBAAU,uBANK;AAOfC,WAAK,iBAPU;AAQfC,oBAAc,WARC;AASfC,sBAAgB,iBATD;AAUfC,gBAAU,gBAVK;AAWfC,mBAAa,cAXE;AAYfC,qBAAe;AAZA;AAFyB,GAAd,EAgB3BC,iBAAOC,QAAP,IAAmB,EAhBQ,CAA9B,EAf8B,CA+BH;AAC5B","file":"index.js","sourcesContent":["import LocalSettingsService from './local-settings.service'\r\nimport config from 'config'\r\n\r\nexport { LocalSettingsService }\r\n\r\nexport default function init () {\r\n const api = this\r\n\r\n // Declare the built-in services, others are optional\r\n api.declareService('users')\r\n api.declareService('authorisations')\r\n api.declareService('tags', { context: true })\r\n api.declareService('organisations')\r\n api.declareService('members', { context: true })\r\n api.declareService('groups', { context: true })\r\n api.declareService('storage', { context: true })\r\n api.declareService('account')\r\n api.declareService('devices')\r\n\r\n // Setup service for settings edition\r\n api.createService('settings', Object.assign({\r\n service: LocalSettingsService,\r\n propertyMapping: {\r\n shortTime: 'time.format.time.short',\r\n longTime: 'time.format.time.long',\r\n shortDate: 'time.format.date.short',\r\n longDate: 'time.format.date.long',\r\n shortYear: 'time.format.year.short',\r\n longYear: 'time.format.year.long',\r\n utc: 'time.format.utc',\r\n timelineStep: 'time.step',\r\n timeseriesSpan: 'timeseries.span',\r\n location: 'locationFormat',\r\n restoreView: 'restore.view',\r\n restoreLayers: 'restore.layers'\r\n }\r\n }, config.settings || {})) // Default options can be overriden from app config\r\n}\r\n"]}
@@ -61,6 +61,10 @@ exports.default = function (name, api, options) {
61
61
  _store.Store.set(value, _lodash2.default.get(settings, key));
62
62
  }
63
63
  });
64
+ },
65
+
66
+ getSettingsMapping() {
67
+ return mapping;
64
68
  }
65
69
  };
66
70
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/services/local-settings.service.js"],"names":["name","api","options","mapping","propertyMapping","rootPaths","_","uniq","values","map","path","split","settingsKey","config","appName","toLowerCase","get","id","data","forOwn","value","key","set","Store","patch","previousRootValues","rootPath","has","forEach","index","eventName","kebabCase","Events","$emit","saveSettings","window","localStorage","setItem","JSON","stringify","restoreSettings","settings","getItem","parse"],"mappings":";;;;;;kBAKe,UAAUA,IAAV,EAAgBC,GAAhB,EAAqBC,OAArB,EAA8B;AAC3C,QAAMC,UAAUD,QAAQE,eAAxB;AACA;AACA;AACA,QAAMC,YAAYC,iBAAEC,IAAF,CAAOD,iBAAEE,MAAF,CAASL,OAAT,EAAkBM,GAAlB,CAAsBC,QAAQA,KAAKC,KAAL,CAAW,GAAX,EAAgB,CAAhB,CAA9B,CAAP,CAAlB;AACA,QAAMC,cAAcC,iBAAOC,OAAP,CAAeC,WAAf,KAA+B,GAA/B,IAAsCb,QAAQU,WAAR,IAAuB,UAA7D,CAApB;AACA,SAAO;;AAECI,OAAN,CAAWC,EAAX,EAAe;AAAA;AACb,cAAMC,OAAO,EAAb;AACAZ,yBAAEa,MAAF,CAAShB,OAAT,EAAkB,UAACiB,KAAD,EAAQC,GAAR,EAAgB;AAChCf,2BAAEgB,GAAF,CAAMJ,IAAN,EAAYG,GAAZ,EAAiBE,aAAMP,GAAN,CAAUI,KAAV,CAAjB;AACD,SAFD;AAGA,eAAOF,IAAP;AALa;AAMd,KARI;;AAUCM,SAAN,CAAaP,EAAb,EAAiBC,IAAjB,EAAuB;AAAA;;AAAA;AACrB,cAAMO,qBAAqBpB,UAAUI,GAAV,CAAc;AAAA,iBAAYc,aAAMP,GAAN,CAAUU,QAAV,CAAZ;AAAA,SAAd,CAA3B;AACApB,yBAAEa,MAAF,CAASD,IAAT,EAAe,UAACE,KAAD,EAAQC,GAAR,EAAgB;AAC7B,cAAIf,iBAAEqB,GAAF,CAAMxB,OAAN,EAAekB,GAAf,CAAJ,EAAyB;AACvBE,yBAAMD,GAAN,CAAUnB,QAAQkB,GAAR,CAAV,EAAwBD,KAAxB;AACD;AACF,SAJD;AAKAf,kBAAUuB,OAAV,CAAkB,UAACF,QAAD,EAAWG,KAAX,EAAqB;AACrC,gBAAMC,YAAYxB,iBAAEyB,SAAF,CAAa,GAAEL,QAAS,UAAxB,CAAlB;AACAM,yBAAOC,KAAP,CAAaH,SAAb,EAAwBP,aAAMP,GAAN,CAAUU,QAAV,CAAxB,EAA6CD,mBAAmBI,KAAnB,CAA7C;AACD,SAHD;AAIA,cAAKK,YAAL;AAXqB;AAYtB,KAtBI;;AAwBLA,mBAAgB;AACd,YAAMhB,OAAO,EAAb;AACAZ,uBAAEa,MAAF,CAAShB,OAAT,EAAkB,CAACiB,KAAD,EAAQC,GAAR,KAAgB;AAChC,YAAIE,aAAMI,GAAN,CAAUP,KAAV,CAAJ,EAAsB;AACpBd,2BAAEgB,GAAF,CAAMJ,IAAN,EAAYG,GAAZ,EAAiBE,aAAMP,GAAN,CAAUI,KAAV,CAAjB;AACD;AACF,OAJD;AAKAe,aAAOC,YAAP,CAAoBC,OAApB,CAA4BzB,WAA5B,EAAyC0B,KAAKC,SAAL,CAAerB,IAAf,CAAzC;AACD,KAhCI;;AAkCLsB,sBAAmB;AACjB,UAAIC,WAAWN,OAAOC,YAAP,CAAoBM,OAApB,CAA4B9B,WAA5B,CAAf;AACA,UAAI,CAAC6B,QAAL,EAAe;AACfA,iBAAWH,KAAKK,KAAL,CAAWF,QAAX,CAAX;AACAnC,uBAAEa,MAAF,CAAShB,OAAT,EAAkB,CAACiB,KAAD,EAAQC,GAAR,KAAgB;AAChC,YAAIf,iBAAEqB,GAAF,CAAMc,QAAN,EAAgBpB,GAAhB,CAAJ,EAA0B;AACxBE,uBAAMD,GAAN,CAAUF,KAAV,EAAiBd,iBAAEU,GAAF,CAAMyB,QAAN,EAAgBpB,GAAhB,CAAjB;AACD;AACF,OAJD;AAKD;AA3CI,GAAP;AA6CD,C;;AAxDD;;;;AACA;;;;AACA;;AACA","file":"local-settings.service.js","sourcesContent":["import _ from 'lodash'\r\nimport config from 'config'\r\nimport { Store } from '../store'\r\nimport { Events } from '../events'\r\n\r\nexport default function (name, api, options) {\r\n const mapping = options.propertyMapping\r\n // We will emit also an event for all top level properties in case of nested ones\r\n // This simplifies event management for some listeners instead of listening to all nested properties\r\n const rootPaths = _.uniq(_.values(mapping).map(path => path.split('.')[0]))\r\n const settingsKey = config.appName.toLowerCase() + '-' + (options.settingsKey || 'settings')\r\n return {\r\n\r\n async get (id) {\r\n const data = {}\r\n _.forOwn(mapping, (value, key) => {\r\n _.set(data, key, Store.get(value))\r\n })\r\n return data\r\n },\r\n\r\n async patch (id, data) {\r\n const previousRootValues = rootPaths.map(rootPath => Store.get(rootPath))\r\n _.forOwn(data, (value, key) => {\r\n if (_.has(mapping, key)) {\r\n Store.set(mapping[key], value)\r\n }\r\n })\r\n rootPaths.forEach((rootPath, index) => {\r\n const eventName = _.kebabCase(`${rootPath}-changed`)\r\n Events.$emit(eventName, Store.get(rootPath), previousRootValues[index])\r\n })\r\n this.saveSettings()\r\n },\r\n\r\n saveSettings () {\r\n const data = {}\r\n _.forOwn(mapping, (value, key) => {\r\n if (Store.has(value)) {\r\n _.set(data, key, Store.get(value))\r\n }\r\n })\r\n window.localStorage.setItem(settingsKey, JSON.stringify(data))\r\n },\r\n\r\n restoreSettings () {\r\n let settings = window.localStorage.getItem(settingsKey)\r\n if (!settings) return\r\n settings = JSON.parse(settings)\r\n _.forOwn(mapping, (value, key) => {\r\n if (_.has(settings, key)) {\r\n Store.set(value, _.get(settings, key))\r\n }\r\n })\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/services/local-settings.service.js"],"names":["name","api","options","mapping","propertyMapping","rootPaths","_","uniq","values","map","path","split","settingsKey","config","appName","toLowerCase","get","id","data","forOwn","value","key","set","Store","patch","previousRootValues","rootPath","has","forEach","index","eventName","kebabCase","Events","$emit","saveSettings","window","localStorage","setItem","JSON","stringify","restoreSettings","settings","getItem","parse","getSettingsMapping"],"mappings":";;;;;;kBAKe,UAAUA,IAAV,EAAgBC,GAAhB,EAAqBC,OAArB,EAA8B;AAC3C,QAAMC,UAAUD,QAAQE,eAAxB;AACA;AACA;AACA,QAAMC,YAAYC,iBAAEC,IAAF,CAAOD,iBAAEE,MAAF,CAASL,OAAT,EAAkBM,GAAlB,CAAsBC,QAAQA,KAAKC,KAAL,CAAW,GAAX,EAAgB,CAAhB,CAA9B,CAAP,CAAlB;AACA,QAAMC,cAAcC,iBAAOC,OAAP,CAAeC,WAAf,KAA+B,GAA/B,IAAsCb,QAAQU,WAAR,IAAuB,UAA7D,CAApB;AACA,SAAO;;AAECI,OAAN,CAAWC,EAAX,EAAe;AAAA;AACb,cAAMC,OAAO,EAAb;AACAZ,yBAAEa,MAAF,CAAShB,OAAT,EAAkB,UAACiB,KAAD,EAAQC,GAAR,EAAgB;AAChCf,2BAAEgB,GAAF,CAAMJ,IAAN,EAAYG,GAAZ,EAAiBE,aAAMP,GAAN,CAAUI,KAAV,CAAjB;AACD,SAFD;AAGA,eAAOF,IAAP;AALa;AAMd,KARI;;AAUCM,SAAN,CAAaP,EAAb,EAAiBC,IAAjB,EAAuB;AAAA;;AAAA;AACrB,cAAMO,qBAAqBpB,UAAUI,GAAV,CAAc;AAAA,iBAAYc,aAAMP,GAAN,CAAUU,QAAV,CAAZ;AAAA,SAAd,CAA3B;AACApB,yBAAEa,MAAF,CAASD,IAAT,EAAe,UAACE,KAAD,EAAQC,GAAR,EAAgB;AAC7B,cAAIf,iBAAEqB,GAAF,CAAMxB,OAAN,EAAekB,GAAf,CAAJ,EAAyB;AACvBE,yBAAMD,GAAN,CAAUnB,QAAQkB,GAAR,CAAV,EAAwBD,KAAxB;AACD;AACF,SAJD;AAKAf,kBAAUuB,OAAV,CAAkB,UAACF,QAAD,EAAWG,KAAX,EAAqB;AACrC,gBAAMC,YAAYxB,iBAAEyB,SAAF,CAAa,GAAEL,QAAS,UAAxB,CAAlB;AACAM,yBAAOC,KAAP,CAAaH,SAAb,EAAwBP,aAAMP,GAAN,CAAUU,QAAV,CAAxB,EAA6CD,mBAAmBI,KAAnB,CAA7C;AACD,SAHD;AAIA,cAAKK,YAAL;AAXqB;AAYtB,KAtBI;;AAwBLA,mBAAgB;AACd,YAAMhB,OAAO,EAAb;AACAZ,uBAAEa,MAAF,CAAShB,OAAT,EAAkB,CAACiB,KAAD,EAAQC,GAAR,KAAgB;AAChC,YAAIE,aAAMI,GAAN,CAAUP,KAAV,CAAJ,EAAsB;AACpBd,2BAAEgB,GAAF,CAAMJ,IAAN,EAAYG,GAAZ,EAAiBE,aAAMP,GAAN,CAAUI,KAAV,CAAjB;AACD;AACF,OAJD;AAKAe,aAAOC,YAAP,CAAoBC,OAApB,CAA4BzB,WAA5B,EAAyC0B,KAAKC,SAAL,CAAerB,IAAf,CAAzC;AACD,KAhCI;;AAkCLsB,sBAAmB;AACjB,UAAIC,WAAWN,OAAOC,YAAP,CAAoBM,OAApB,CAA4B9B,WAA5B,CAAf;AACA,UAAI,CAAC6B,QAAL,EAAe;AACfA,iBAAWH,KAAKK,KAAL,CAAWF,QAAX,CAAX;AACAnC,uBAAEa,MAAF,CAAShB,OAAT,EAAkB,CAACiB,KAAD,EAAQC,GAAR,KAAgB;AAChC,YAAIf,iBAAEqB,GAAF,CAAMc,QAAN,EAAgBpB,GAAhB,CAAJ,EAA0B;AACxBE,uBAAMD,GAAN,CAAUF,KAAV,EAAiBd,iBAAEU,GAAF,CAAMyB,QAAN,EAAgBpB,GAAhB,CAAjB;AACD;AACF,OAJD;AAKD,KA3CI;;AA6CLuB,yBAAsB;AACpB,aAAOzC,OAAP;AACD;AA/CI,GAAP;AAiDD,C;;AA5DD;;;;AACA;;;;AACA;;AACA","file":"local-settings.service.js","sourcesContent":["import _ from 'lodash'\r\nimport config from 'config'\r\nimport { Store } from '../store'\r\nimport { Events } from '../events'\r\n\r\nexport default function (name, api, options) {\r\n const mapping = options.propertyMapping\r\n // We will emit also an event for all top level properties in case of nested ones\r\n // This simplifies event management for some listeners instead of listening to all nested properties\r\n const rootPaths = _.uniq(_.values(mapping).map(path => path.split('.')[0]))\r\n const settingsKey = config.appName.toLowerCase() + '-' + (options.settingsKey || 'settings')\r\n return {\r\n\r\n async get (id) {\r\n const data = {}\r\n _.forOwn(mapping, (value, key) => {\r\n _.set(data, key, Store.get(value))\r\n })\r\n return data\r\n },\r\n\r\n async patch (id, data) {\r\n const previousRootValues = rootPaths.map(rootPath => Store.get(rootPath))\r\n _.forOwn(data, (value, key) => {\r\n if (_.has(mapping, key)) {\r\n Store.set(mapping[key], value)\r\n }\r\n })\r\n rootPaths.forEach((rootPath, index) => {\r\n const eventName = _.kebabCase(`${rootPath}-changed`)\r\n Events.$emit(eventName, Store.get(rootPath), previousRootValues[index])\r\n })\r\n this.saveSettings()\r\n },\r\n\r\n saveSettings () {\r\n const data = {}\r\n _.forOwn(mapping, (value, key) => {\r\n if (Store.has(value)) {\r\n _.set(data, key, Store.get(value))\r\n }\r\n })\r\n window.localStorage.setItem(settingsKey, JSON.stringify(data))\r\n },\r\n\r\n restoreSettings () {\r\n let settings = window.localStorage.getItem(settingsKey)\r\n if (!settings) return\r\n settings = JSON.parse(settings)\r\n _.forOwn(mapping, (value, key) => {\r\n if (_.has(settings, key)) {\r\n Store.set(value, _.get(settings, key))\r\n }\r\n })\r\n },\r\n\r\n getSettingsMapping () {\r\n return mapping\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Time = undefined;
7
+
8
+ var _lodash = require('lodash');
9
+
10
+ var _lodash2 = _interopRequireDefault(_lodash);
11
+
12
+ var _moment = require('moment');
13
+
14
+ var _moment2 = _interopRequireDefault(_moment);
15
+
16
+ var _events = require('./events');
17
+
18
+ var _store = require('./store');
19
+
20
+ var _utils = require('./utils');
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ // Export singleton
25
+ const Time = exports.Time = {
26
+ initialize() {
27
+ // Set locale globally
28
+ _moment2.default.locale((0, _utils.getLocale)());
29
+ // Set the time object within the store
30
+ const now = _moment2.default.utc();
31
+ _store.Store.set('time', {
32
+ range: {
33
+ start: now.clone().subtract(1, 'months').startOf('day'),
34
+ end: now.clone().endOf('day'),
35
+ field: 'createdAt',
36
+ query: {}
37
+ },
38
+ format: {
39
+ time: {
40
+ short: 'H[h]',
41
+ long: 'HH:mm'
42
+ },
43
+ date: {
44
+ short: 'DD/MM',
45
+ long: 'dddd D'
46
+ },
47
+ year: {
48
+ short: 'YY',
49
+ long: 'YYYY'
50
+ },
51
+ utc: false
52
+ },
53
+ currentTime: now,
54
+ step: 60 // 1H
55
+ });
56
+ this.updateTimeRangeQuery();
57
+ // Make filter react to external changes to update the query
58
+ _events.Events.$on('time-range-changed', () => this.updateTimeRangeQuery());
59
+ },
60
+ convertToMoment(datetime) {
61
+ if (_moment2.default.isMoment(datetime)) {
62
+ // Clone to avoid mutating and force UTC mode
63
+ return _moment2.default.utc(datetime.valueOf());
64
+ } else {
65
+ // Convert from Date, string or milliseconds (ie EPOCH)
66
+ return _moment2.default.utc(datetime);
67
+ }
68
+ },
69
+ get() {
70
+ return _store.Store.get('time');
71
+ },
72
+ getRange() {
73
+ return this.get().range;
74
+ },
75
+ patchRange(range) {
76
+ _store.Store.patch('time.range', range);
77
+ },
78
+ getRangeQuery() {
79
+ return _store.Store.get('time.range.query');
80
+ },
81
+ // Build sort query
82
+ updateTimeRangeQuery() {
83
+ const query = {};
84
+ query[this.getRange().field] = { $gte: this.getRange().start.format(), $lte: this.getRange().end.format()
85
+ // Avoid reentrance as we listen to other filter property changes
86
+ };if (!_lodash2.default.isEqual(query, this.getRangeQuery())) _store.Store.patch('time.range', { query });
87
+ },
88
+ getFormat() {
89
+ return this.get().format;
90
+ },
91
+ format(datetime, format) {
92
+ let currentTime = this.convertToMoment(datetime);
93
+ if (!this.getFormat().utc) {
94
+ // Convert to local time
95
+ currentTime = (0, _moment2.default)(currentTime.valueOf());
96
+ }
97
+ if (format === 'iso') return currentTime.format();
98
+ // Defaults to long mode if not given
99
+ else return currentTime.format(_lodash2.default.get(this.getFormat(), format, _lodash2.default.get(this.getFormat(), format + '.long')));
100
+ },
101
+ getCurrentTime() {
102
+ return this.get().currentTime;
103
+ },
104
+ setCurrentTime(datetime) {
105
+ const now = this.convertToMoment(datetime);
106
+ if (this.getCurrentTime().isSame(now)) return;
107
+ _store.Store.patch('time.currentTime', now);
108
+ },
109
+ getCurrentFormattedTime() {
110
+ const currentTime = this.getCurrentTime();
111
+ return {
112
+ time: {
113
+ short: this.format(currentTime, 'time.short'),
114
+ long: this.format(currentTime, 'time.long')
115
+ },
116
+ date: {
117
+ short: this.format(currentTime, 'date.short'),
118
+ long: this.format(currentTime, 'date.long')
119
+ },
120
+ year: {
121
+ short: this.format(currentTime, 'year.short'),
122
+ long: this.format(currentTime, 'year.long')
123
+ },
124
+ iso: this.format(currentTime, 'iso')
125
+ };
126
+ },
127
+ getStep() {
128
+ return this.get().step;
129
+ }
130
+ };
131
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../core/client/time.js"],"names":["Time","initialize","moment","locale","now","utc","Store","set","range","start","clone","subtract","startOf","end","endOf","field","query","format","time","short","long","date","year","currentTime","step","updateTimeRangeQuery","Events","$on","convertToMoment","datetime","isMoment","valueOf","get","getRange","patchRange","patch","getRangeQuery","$gte","$lte","_","isEqual","getFormat","getCurrentTime","setCurrentTime","isSame","getCurrentFormattedTime","iso","getStep"],"mappings":"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","file":"time.js","sourcesContent":["import _ from 'lodash'\r\nimport moment from 'moment'\r\nimport { Events } from './events'\r\nimport { Store } from './store'\r\nimport { getLocale } from './utils'\r\n\r\n// Export singleton\r\nexport const Time = {\r\n initialize () {\r\n // Set locale globally\r\n moment.locale(getLocale())\r\n // Set the time object within the store\r\n const now = moment.utc()\r\n Store.set('time', {\r\n range: {\r\n start: now.clone().subtract(1, 'months').startOf('day'),\r\n end: now.clone().endOf('day'),\r\n field: 'createdAt',\r\n query: {}\r\n },\r\n format: {\r\n time: {\r\n short: 'H[h]',\r\n long: 'HH:mm'\r\n },\r\n date: {\r\n short: 'DD/MM',\r\n long: 'dddd D'\r\n },\r\n year: {\r\n short: 'YY',\r\n long: 'YYYY'\r\n },\r\n utc: false\r\n },\r\n currentTime: now,\r\n step: 60 // 1H\r\n })\r\n this.updateTimeRangeQuery()\r\n // Make filter react to external changes to update the query\r\n Events.$on('time-range-changed', () => this.updateTimeRangeQuery())\r\n },\r\n convertToMoment (datetime) {\r\n if (moment.isMoment(datetime)) {\r\n // Clone to avoid mutating and force UTC mode\r\n return moment.utc(datetime.valueOf())\r\n } else { // Convert from Date, string or milliseconds (ie EPOCH)\r\n return moment.utc(datetime)\r\n }\r\n },\r\n get () {\r\n return Store.get('time')\r\n },\r\n getRange () {\r\n return this.get().range\r\n },\r\n patchRange (range) {\r\n Store.patch('time.range', range)\r\n },\r\n getRangeQuery () {\r\n return Store.get('time.range.query')\r\n },\r\n // Build sort query\r\n updateTimeRangeQuery () {\r\n const query = {}\r\n query[this.getRange().field] = { $gte: this.getRange().start.format(), $lte: this.getRange().end.format() }\r\n // Avoid reentrance as we listen to other filter property changes\r\n if (!_.isEqual(query, this.getRangeQuery())) Store.patch('time.range', { query })\r\n },\r\n getFormat () {\r\n return this.get().format\r\n },\r\n format (datetime, format) {\r\n let currentTime = this.convertToMoment(datetime)\r\n if (!this.getFormat().utc) {\r\n // Convert to local time\r\n currentTime = moment(currentTime.valueOf())\r\n }\r\n if (format === 'iso') return currentTime.format()\r\n // Defaults to long mode if not given\r\n else return currentTime.format(_.get(this.getFormat(), format, _.get(this.getFormat(), format + '.long')))\r\n },\r\n getCurrentTime () {\r\n return this.get().currentTime\r\n },\r\n setCurrentTime (datetime) {\r\n const now = this.convertToMoment(datetime)\r\n if (this.getCurrentTime().isSame(now)) return\r\n Store.patch('time.currentTime', now)\r\n },\r\n getCurrentFormattedTime () {\r\n const currentTime = this.getCurrentTime()\r\n return {\r\n time: {\r\n short: this.format(currentTime, 'time.short'),\r\n long: this.format(currentTime, 'time.long')\r\n },\r\n date: {\r\n short: this.format(currentTime, 'date.short'),\r\n long: this.format(currentTime, 'date.long')\r\n },\r\n year: {\r\n short: this.format(currentTime, 'year.short'),\r\n long: this.format(currentTime, 'year.long')\r\n },\r\n iso: this.format(currentTime, 'iso')\r\n }\r\n },\r\n getStep () {\r\n return this.get().step\r\n }\r\n}\r\n"]}
@@ -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,