@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,139 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-06/schema#",
3
+ "$id": "http://www.kalisio.xyz/schemas/settings.update.json#",
4
+ "title": "schemas.UPDATE_SETTINGS_TITLE",
5
+ "type": "object",
6
+ "properties": {
7
+ "shortTime": {
8
+ "type": "string",
9
+ "group": "schemas.TIME_FORMAT_SETTINGS",
10
+ "field": {
11
+ "component": "form/KTextField",
12
+ "label": "schemas.TIME_FORMAT_SHORT_TIME_FIELD_LABEL",
13
+ "helper": "schemas.TIME_FORMAT_SHORT_TIME_FIELD_HELPER"
14
+ }
15
+ },
16
+ "longTime": {
17
+ "type": "string",
18
+ "group": "schemas.TIME_FORMAT_SETTINGS",
19
+ "field": {
20
+ "component": "form/KTextField",
21
+ "label": "schemas.TIME_FORMAT_LONG_TIME_FIELD_LABEL",
22
+ "helper": "schemas.TIME_FORMAT_LONG_TIME_FIELD_HELPER"
23
+ }
24
+ },
25
+ "shortDate": {
26
+ "type": "string",
27
+ "group": "schemas.TIME_FORMAT_SETTINGS",
28
+ "field": {
29
+ "component": "form/KTextField",
30
+ "label": "schemas.TIME_FORMAT_SHORT_DATE_FIELD_LABEL",
31
+ "helper": "schemas.TIME_FORMAT_SHORT_DATE_FIELD_HELPER"
32
+
33
+ }
34
+ },
35
+ "longDate": {
36
+ "type": "string",
37
+ "group": "schemas.TIME_FORMAT_SETTINGS",
38
+ "field": {
39
+ "component": "form/KTextField",
40
+ "label": "schemas.TIME_FORMAT_LONG_DATE_FIELD_LABEL",
41
+ "helper": "schemas.TIME_FORMAT_LONG_DATE_FIELD_HELPER"
42
+ }
43
+ },
44
+ "shortYear": {
45
+ "type": "string",
46
+ "group": "schemas.TIME_FORMAT_SETTINGS",
47
+ "field": {
48
+ "component": "form/KTextField",
49
+ "label": "schemas.TIME_FORMAT_SHORT_YEAR_FIELD_LABEL",
50
+ "helper": "schemas.TIME_FORMAT_SHORT_YEAR_FIELD_HELPER"
51
+ }
52
+ },
53
+ "longYear": {
54
+ "type": "string",
55
+ "group": "schemas.TIME_FORMAT_SETTINGS",
56
+ "field": {
57
+ "component": "form/KTextField",
58
+ "label": "schemas.TIME_FORMAT_LONG_YEAR_FIELD_LABEL",
59
+ "helper": "schemas.TIME_FORMAT_LONG_YEAR_FIELD_HELPER"
60
+ }
61
+ },
62
+ "utc": {
63
+ "type": "boolean",
64
+ "group": "schemas.TIME_FORMAT_SETTINGS",
65
+ "field": {
66
+ "component": "form/KToggleField",
67
+ "label": "schemas.TIME_FORMAT_UTC_FIELD_LABEL"
68
+ }
69
+ },
70
+ "timelineStep": {
71
+ "type": "number",
72
+ "group": "schemas.TIMELINE_SETTINGS",
73
+ "field": {
74
+ "component": "form/KSelectField",
75
+ "label": "schemas.TIMELINE_STEP",
76
+ "options": [
77
+ { "label": "5m", "value": 5 },
78
+ { "label": "10m", "value": 10 },
79
+ { "label": "12m", "value": 12 },
80
+ { "label": "15m", "value": 15 },
81
+ { "label": "20m", "value": 20 },
82
+ { "label": "30m", "value": 30 },
83
+ { "label": "60m", "value": 60, "selected": true }
84
+ ]
85
+ }
86
+ },
87
+ "timeseriesSpan": {
88
+ "type": "number",
89
+ "group": "schemas.TIMESERIES_SETTINGS",
90
+ "field": {
91
+ "component": "form/KSelectField",
92
+ "label": "schemas.TIMESERIES_SPAN",
93
+ "options": [
94
+ { "label": "3H", "value": 180 },
95
+ { "label": "6H", "value": 360 },
96
+ { "label": "12H", "value": 720 },
97
+ { "label": "24H", "value": 1440, "selected": true },
98
+ { "label": "48H", "value": 2880 },
99
+ { "label": "72H", "value": 4320 },
100
+ { "label": "96H", "value": 5760 }
101
+ ]
102
+ }
103
+ },
104
+ "restoreView": {
105
+ "type": "boolean",
106
+ "group": "schemas.MAP_SETTINGS",
107
+ "field": {
108
+ "component": "form/KToggleField",
109
+ "label": "schemas.RESTORE_VIEW_FIELD_LABEL"
110
+ }
111
+ },
112
+ "restoreLayers": {
113
+ "type": "boolean",
114
+ "group": "schemas.MAP_SETTINGS",
115
+ "field": {
116
+ "component": "form/KToggleField",
117
+ "label": "schemas.RESTORE_LAYERS_FIELD_LABEL"
118
+ }
119
+ },
120
+ "location": {
121
+ "type": "string",
122
+ "group": "schemas.MAP_SETTINGS",
123
+ "field": {
124
+ "component": "form/KTextField",
125
+ "label": "schemas.LOCATION_FORMAT_LABEL",
126
+ "helper": "schemas.LOCATION_FORMAT_HELPER"
127
+ }
128
+ }
129
+ },
130
+ "required": [
131
+ "shortTime",
132
+ "longTime",
133
+ "shortDate",
134
+ "longDate",
135
+ "shortYear",
136
+ "longYear",
137
+ "location"
138
+ ]
139
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-06/schema#",
3
3
  "$id": "http://www.kalisio.xyz/schemas/tags.update.json#",
4
- "title": "schemas.OBJECT_NAME",
4
+ "title": "schemas.TAG_NAME",
5
5
  "description": "Tag edition schema",
6
6
  "type": "object",
7
7
  "properties": {
@@ -20,6 +20,14 @@
20
20
  "component": "form/KIconField",
21
21
  "label": "schemas.TAGS_ICON_FIELD_LABEL"
22
22
  }
23
+ },
24
+ "description": {
25
+ "type": "string",
26
+ "maxLength": 2048,
27
+ "field": {
28
+ "component": "form/KTextField",
29
+ "label": "schemas.TAGS_DESCRIPTION_FIELD_LABEL"
30
+ }
23
31
  }
24
32
  },
25
33
  "required": ["value"]
@@ -38,6 +38,7 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
38
38
  } else {
39
39
  Object.assign(groupBy, {
40
40
  time: { $push: '$time' }, // Keep track of all times
41
+ runTime: { $push: '$runTime' }, // Keep track of all run times
41
42
  type: { $last: '$type' }, // type is assumed similar for all results, keep last
42
43
  properties: { $last: '$properties' // non-aggregated properties are assumed similar for all results, keep last
43
44
  } });
@@ -73,8 +74,8 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
73
74
  }
74
75
  // Find matching features only
75
76
  pipeline.push({ $match: Object.assign({ [prefix + element]: { $exists: true } }, match) });
76
- // Ensure they are ordered by increasing time by default
77
- pipeline.push({ $sort: query.$sort || { time: 1 } });
77
+ // Ensure they are ordered by increasing time by default and most recent forecast first
78
+ pipeline.push({ $sort: Object.assign({ time: 1, runTime: -1 }, query.$sort) });
78
79
  // Keep track of all feature values
79
80
  if (singleTime) {
80
81
  pipeline.push({ $group: groupBy });
@@ -89,10 +90,11 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
89
90
  });
90
91
  });
91
92
  const elementResults = yield collection.aggregate(pipeline, aggregateOptions).toArray();
92
- debug(`Generated ${elementResults.length} feature(s) for ${element} element`);
93
+ debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults);
93
94
  // Rearrange data so that we get ordered arrays indexed by element
94
95
  elementResults.forEach(function (result) {
95
96
  result.time = { [element]: result.time };
97
+ if (result.runTime) result.runTime = { [element]: result.runTime };
96
98
  if (!singleTime && !isGeometry) {
97
99
  // Set back the element values as properties because we aggregated in an accumulator
98
100
  // to avoid conflict with non-aggregated feature properties
@@ -114,6 +116,9 @@ let aggregateFeaturesQuery = exports.aggregateFeaturesQuery = (() => {
114
116
  // Merge with previous matching feature if any
115
117
  if (previousResult) {
116
118
  Object.assign(previousResult.time, result.time);
119
+ if (result.runTime) {
120
+ if (previousResult.runTime) Object.assign(previousResult.runTime, result.runTime);else previousResult.runTime = { [element]: result.runTime };
121
+ }
117
122
  _lodash2.default.set(previousResult, prefix + element, _lodash2.default.get(result, prefix + element));
118
123
  } else {
119
124
  aggregatedResults.push(result);
@@ -262,27 +267,31 @@ function asGeoJson(options = {}) {
262
267
  const params = hook.params;
263
268
  const query = params.query;
264
269
  if (!options.force && !params.asGeoJson) return;
265
- if (query.$distinct) return; // Not applicable in this case
266
- let results = hook.result;
270
+ if (query.$distinct || query.$aggregation) return; // Not applicable in this case
271
+ const longitudeProperty = options.longitudeProperty || 'longitude';
272
+ const latitudeProperty = options.latitudeProperty || 'latitude';
273
+ const altitudeProperty = options.altitudeProperty || 'altitude';
274
+ const geometryProperty = options.geometryProperty || 'geometry';
275
+ let results = _lodash2.default.get(hook, options.dataPath || 'result');
267
276
  // Already as GeoJson ?
268
277
  if (results.type === 'FeatureCollection') return;
269
- const pagination = _lodash2.default.pick(results, ['total', 'skip', 'limit']);
270
- results = Array.isArray(results) ? results : results.data;
278
+ const isPaginated = !_lodash2.default.isNil(results.data);
279
+ const pagination = isPaginated ? _lodash2.default.pick(results, ['total', 'skip', 'limit']) : {};
280
+ results = isPaginated ? results.data : results;
271
281
  results = results.filter(item => {
272
- // Item locations are not already in GeoJson feature format so we need to convert if we can
273
- if (options.longitudeProperty && options.latitudeProperty) {
274
- return _lodash2.default.has(item, options.longitudeProperty) && _lodash2.default.has(item, options.latitudeProperty);
275
- } else {
276
- return true;
277
- }
282
+ // Check if item is not already in GeoJson feature format and we can convert if required
283
+ return _lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty) ||
284
+ // When performing feature aggregation on geometries the result can be an array
285
+ Array.isArray(_lodash2.default.get(item, geometryProperty)) ||
286
+ // Check for a geometry property (previously provided or already transformed item)
287
+ _lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates');
278
288
  }).map(item => {
279
289
  let coordinates;
280
- // Item locations are not already in GeoJson feature format so we need to convert
281
290
  // Keep track of coordinates before picking properties
282
- if (options.longitudeProperty && options.latitudeProperty) {
283
- coordinates = [_lodash2.default.get(item, options.longitudeProperty), _lodash2.default.get(item, options.latitudeProperty)];
284
- if (options.altitudeProperty && _lodash2.default.has(item, options.altitudeProperty)) {
285
- coordinates.push(_lodash2.default.get(item, options.altitudeProperty));
291
+ if (_lodash2.default.has(item, longitudeProperty) && _lodash2.default.has(item, latitudeProperty)) {
292
+ coordinates = [_lodash2.default.get(item, longitudeProperty), _lodash2.default.get(item, latitudeProperty)];
293
+ if (_lodash2.default.has(item, altitudeProperty)) {
294
+ coordinates.push(_lodash2.default.get(item, altitudeProperty));
286
295
  }
287
296
  }
288
297
  if (options.pick) {
@@ -291,11 +300,26 @@ function asGeoJson(options = {}) {
291
300
  if (options.omit) {
292
301
  item = _lodash2.default.omit(item, options.omit);
293
302
  }
294
- // Item locations are not already in GeoJson feature format so we need to convert
295
- if (options.longitudeProperty && options.latitudeProperty) {
296
- return Object.assign({ type: 'Feature', geometry: { type: 'Point', coordinates }, properties: {} }, item);
297
- } else {
298
- return item;
303
+ // Item locations are already in GeoJson format
304
+ if (_lodash2.default.has(item, geometryProperty + '.type') && _lodash2.default.has(item, geometryProperty + '.coordinates')) {
305
+ return Object.assign({
306
+ type: 'Feature',
307
+ geometry: _lodash2.default.get(item, geometryProperty),
308
+ properties: {}
309
+ }, _lodash2.default.omit(item, [geometryProperty]));
310
+ } else if (Array.isArray(_lodash2.default.get(item, geometryProperty))) {
311
+ return Object.assign({
312
+ type: 'Feature',
313
+ geometry: { type: 'GeometryCollection', geometries: _lodash2.default.get(item, geometryProperty) },
314
+ properties: {}
315
+ }, _lodash2.default.omit(item, [geometryProperty]));
316
+ } else if (coordinates) {
317
+ // Item locations are not already in GeoJson feature format so we need to convert
318
+ return Object.assign({
319
+ type: 'Feature',
320
+ geometry: { type: 'Point', coordinates },
321
+ properties: {}
322
+ }, _lodash2.default.omit(item, [longitudeProperty, latitudeProperty]));
299
323
  }
300
324
  });
301
325
  // Move some data to properties ?
@@ -307,16 +331,18 @@ function asGeoJson(options = {}) {
307
331
  });
308
332
  });
309
333
  }
310
- // Copy pagination information so that client can use it anyway
334
+ // Copy pagination information if any so that client can use it anyway
311
335
  if (_lodash2.default.get(options, 'asFeatureCollection', true)) {
312
- hook.result = Object.assign({
336
+ _lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
313
337
  type: 'FeatureCollection',
314
338
  features: results
315
- }, pagination);
316
- } else {
317
- hook.result = Object.assign({
339
+ }, pagination)); // If no pagination this merged object will be empty
340
+ } else if (isPaginated) {
341
+ _lodash2.default.set(hook, options.dataPath || 'result', Object.assign({
318
342
  data: results
319
- }, pagination);
343
+ }, pagination));
344
+ } else {
345
+ _lodash2.default.set(hook, options.dataPath || 'result', results);
320
346
  }
321
347
  };
322
348
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../map/api/hooks/hooks.query.js"],"names":["hook","query","params","service","$aggregate","collection","Model","featureId","options","featureIdType","ids","$groupBy","reduce","object","id","Object","assign","groupBy","_id","keys","_","singleTime","toNumber","$limit","map","key","feature","$first","time","$push","type","$last","properties","includes","geometry","match","omit","aggregateOptions","has","set","get","hint","aggregatedResults","Promise","all","element","isGeometry","prefix","pipeline","$geoNear","push","$match","$exists","$sort","$group","$replaceRoot","newRoot","debug","forEach","forOwn","stage","value","elementResults","aggregate","toArray","length","result","unset","resultKeys","pick","previousResult","find","aggregatedResultKeys","aggregatedResult","isEqual","aggregateFeaturesQuery","marshallGeometryQuery","marshallSpatialQuery","asGeoJson","isNil","centerLon","longitude","centerLat","latitude","distance","near","coordinates","maxDistance","distanceField","spherical","$geoWithin","$centerSphere","south","north","west","east","geometryQuery","$geoIntersects","$geometry","geoJson","force","$distinct","results","pagination","Array","isArray","data","filter","item","longitudeProperty","latitudeProperty","altitudeProperty","mapping","from","to","delete","features"],"mappings":"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","file":"hooks.query.js","sourcesContent":["import _ from 'lodash'\r\nimport { marshallGeometry } from '../marshall'\r\nimport makeDebug from 'debug'\r\n\r\nconst debug = makeDebug('kdk:map:query:hooks')\r\n\r\nexport function marshallGeometryQuery (hook) {\r\n const query = hook.params.query\r\n if (_.isNil(query)) return\r\n const geometry = query.geometry\r\n if (_.isNil(geometry)) return\r\n marshallGeometry(geometry)\r\n}\r\n\r\nexport function marshallSpatialQuery (hook) {\r\n const query = hook.params.query\r\n if (query) {\r\n if (!_.isNil(query.geometry)) marshallGeometry(query.geometry)\r\n // Shortcut for proximity query\r\n if ((!_.isNil(query.centerLon) || !_.isNil(query.longitude)) &&\r\n (!_.isNil(query.centerLat) || !_.isNil(query.latitude)) && !_.isNil(query.distance)) {\r\n const longitude = (_.isNil(query.centerLon) ? _.toNumber(query.longitude) : _.toNumber(query.centerLon))\r\n const latitude = (_.isNil(query.centerLat) ? _.toNumber(query.latitude) : _.toNumber(query.centerLat))\r\n const distance = _.toNumber(query.distance)\r\n // Transform to MongoDB spatial request\r\n delete query.centerLon\r\n delete query.longitude\r\n delete query.centerLat\r\n delete query.latitude\r\n delete query.distance\r\n // Aggregation requires a specific operator\r\n if (query.$aggregate) {\r\n query.$geoNear = {\r\n near: { type: 'Point', coordinates: [longitude, latitude] },\r\n maxDistance: distance,\r\n distanceField: 'distance',\r\n spherical: true\r\n }\r\n } else {\r\n /* We switched from $near to $geoWithin due to https://github.com/kalisio/kdk/issues/345\r\n query.geometry = {\r\n $near: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n },\r\n $maxDistance: distance\r\n }\r\n }\r\n */\r\n query.geometry = {\r\n $geoWithin: {\r\n $centerSphere: [[longitude, latitude], distance / 6378137.0] // Earth radius as in radians\r\n }\r\n }\r\n }\r\n }\r\n // Shortcut for bbox query\r\n if (!_.isNil(query.south) && !_.isNil(query.north) && !_.isNil(query.west) && !_.isNil(query.east)) {\r\n const south = _.toNumber(query.south)\r\n const north = _.toNumber(query.north)\r\n const west = _.toNumber(query.west)\r\n const east = _.toNumber(query.east)\r\n // Transform to MongoDB spatial request\r\n delete query.south\r\n delete query.north\r\n delete query.west\r\n delete query.east\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Polygon',\r\n coordinates: [ // BBox as a polygon\r\n [[west, south], [east, south], [east, north], [west, north], [west, south]] // Closing point\r\n ]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n // Shortcut for location query\r\n if (!_.isNil(query.longitude) && !_.isNil(query.latitude)) {\r\n const longitude = _.toNumber(query.longitude)\r\n const latitude = _.toNumber(query.latitude)\r\n // Transform to MongoDB spatial request\r\n delete query.longitude\r\n delete query.latitude\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n if (query.geoJson) {\r\n delete query.geoJson\r\n hook.params.asGeoJson = true\r\n }\r\n }\r\n}\r\n\r\nexport function asGeoJson (options = {}) {\r\n return function (hook) {\r\n const params = hook.params\r\n const query = params.query\r\n if (!options.force && !params.asGeoJson) return\r\n if (query.$distinct) return // Not applicable in this case\r\n let results = hook.result\r\n // Already as GeoJson ?\r\n if (results.type === 'FeatureCollection') return\r\n const pagination = _.pick(results, ['total', 'skip', 'limit'])\r\n results = Array.isArray(results) ? results : results.data\r\n results = results\r\n .filter(item => {\r\n // Item locations are not already in GeoJson feature format so we need to convert if we can\r\n if (options.longitudeProperty && options.latitudeProperty) {\r\n return _.has(item, options.longitudeProperty) && _.has(item, options.latitudeProperty)\r\n } else {\r\n return true\r\n }\r\n })\r\n .map(item => {\r\n let coordinates\r\n // Item locations are not already in GeoJson feature format so we need to convert\r\n // Keep track of coordinates before picking properties\r\n if (options.longitudeProperty && options.latitudeProperty) {\r\n coordinates = [_.get(item, options.longitudeProperty), _.get(item, options.latitudeProperty)]\r\n if (options.altitudeProperty && _.has(item, options.altitudeProperty)) {\r\n coordinates.push(_.get(item, options.altitudeProperty))\r\n }\r\n }\r\n if (options.pick) {\r\n item = _.pick(item, options.pick)\r\n }\r\n if (options.omit) {\r\n item = _.omit(item, options.omit)\r\n }\r\n // Item locations are not already in GeoJson feature format so we need to convert\r\n if (options.longitudeProperty && options.latitudeProperty) {\r\n return Object.assign({ type: 'Feature', geometry: { type: 'Point', coordinates }, properties: {} }, item)\r\n } else {\r\n return item\r\n }\r\n })\r\n // Move some data to properties ?\r\n if (options.properties) {\r\n results.forEach(item => {\r\n options.properties.forEach(mapping => {\r\n if (mapping.from) _.set(item, `properties.${mapping.to || mapping.from}`, _.get(item, `${mapping.from}`))\r\n if (mapping.delete) _.unset(item, `${mapping.from}`)\r\n })\r\n })\r\n }\r\n // Copy pagination information so that client can use it anyway\r\n if (_.get(options, 'asFeatureCollection', true)) {\r\n hook.result = Object.assign({\r\n type: 'FeatureCollection',\r\n features: results\r\n }, pagination)\r\n } else {\r\n hook.result = Object.assign({\r\n data: results\r\n }, pagination)\r\n }\r\n }\r\n}\r\n\r\nexport async function aggregateFeaturesQuery (hook) {\r\n const query = hook.params.query\r\n const service = hook.service\r\n if (!query) return\r\n // Perform aggregation\r\n if (query.$aggregate) {\r\n const collection = service.Model\r\n const featureId = (service.options ? service.options.featureId : '')\r\n const featureIdType = (service.options ? service.options.featureIdType : 'string')\r\n const ids = typeof query.$groupBy === 'string' // Group by matching ID(s), ie single ID or array of field to create a compound ID\r\n ? { [query.$groupBy]: '$properties.' + query.$groupBy }\r\n // Aggregated in an accumulator to avoid conflict with feature properties\r\n : query.$groupBy.reduce((object, id) => Object.assign(object, { [id]: '$properties.' + id }), {})\r\n const groupBy = { _id: ids }\r\n let keys = _.keys(ids)\r\n // Do we only keep first or last available time ?\r\n const singleTime = (_.toNumber(query.$limit) === 1)\r\n if (singleTime) {\r\n // When single time no aggregation is performed at all so we only have raw features\r\n keys = keys.map(key => 'properties.' + key)\r\n // In this case no need to aggregate on each element we simply keep the first feature\r\n // BUG: according to https://jira.mongodb.org/browse/SERVER-9507 MongoDB is not yet\r\n // able to optimize this kind of operations to avoid full index scan\r\n // For now we should restrict it to short time range\r\n Object.assign(groupBy, { feature: { $first: '$$ROOT' } })\r\n } else {\r\n Object.assign(groupBy, {\r\n time: { $push: '$time' }, // Keep track of all times\r\n type: { $last: '$type' }, // type is assumed similar for all results, keep last\r\n properties: { $last: '$properties' } // non-aggregated properties are assumed similar for all results, keep last\r\n })\r\n // Check if we aggregate geometry or simply properties\r\n if (!query.$aggregate.includes('geometry')) {\r\n Object.assign(groupBy, {\r\n geometry: { $last: '$geometry' } // geometry is assumed similar for all results, keep last\r\n })\r\n }\r\n }\r\n // The query contains the match stage except options relevent to the aggregation pipeline\r\n const match = _.omit(query, ['$groupBy', '$aggregate', '$geoNear', '$sort', '$limit', '$skip'])\r\n const aggregateOptions = {}\r\n // Check for any required type conversion (eg HTTP requests)\r\n if (featureId && _.has(match, 'properties.' + featureId)) {\r\n if (featureIdType === 'number') _.set(match, 'properties.' + featureId, _.toNumber(_.get(match, 'properties.' + featureId)))\r\n // Check if we could provide a hint to the aggregation when targeting feature ID\r\n // Indeed, in that case, we define the appropriate index\r\n aggregateOptions.hint = { ['properties.' + featureId]: 1 }\r\n }\r\n // Ensure we do not mix results with/without relevant element values\r\n // by separately querying each element then merging\r\n let aggregatedResults\r\n await Promise.all(query.$aggregate.map(async element => {\r\n const isGeometry = (element === 'geometry')\r\n // Geometry is a root property while others are feature properties\r\n const prefix = (isGeometry ? '' : 'properties.')\r\n const pipeline = []\r\n // Check for geometry stage\r\n if (query.$geoNear) {\r\n pipeline.push({ $geoNear: query.$geoNear })\r\n }\r\n // Find matching features only\r\n pipeline.push({ $match: Object.assign({ [prefix + element]: { $exists: true } }, match) })\r\n // Ensure they are ordered by increasing time by default\r\n pipeline.push({ $sort: query.$sort || { time: 1 } })\r\n // Keep track of all feature values\r\n if (singleTime) {\r\n pipeline.push({ $group: groupBy })\r\n pipeline.push({ $replaceRoot: { newRoot: '$feature' } })\r\n } else {\r\n pipeline.push({ $group: Object.assign({ [element]: { $push: '$' + prefix + element } }, groupBy) })\r\n }\r\n debug(`Aggregating ${element} element for features`)\r\n pipeline.forEach(stage => {\r\n _.forOwn(stage, (value, key) => debug('Stage', key, value))\r\n })\r\n const elementResults = await collection.aggregate(pipeline, aggregateOptions).toArray()\r\n debug(`Generated ${elementResults.length} feature(s) for ${element} element`)\r\n // Rearrange data so that we get ordered arrays indexed by element\r\n elementResults.forEach(result => {\r\n result.time = { [element]: result.time }\r\n if (!singleTime && !isGeometry) {\r\n // Set back the element values as properties because we aggregated in an accumulator\r\n // to avoid conflict with non-aggregated feature properties\r\n _.set(result, prefix + element, _.get(result, element))\r\n // Delete accumulator\r\n _.unset(result, element)\r\n }\r\n })\r\n // Now merge with previous element results\r\n if (!aggregatedResults) {\r\n aggregatedResults = elementResults\r\n } else {\r\n elementResults.forEach(result => {\r\n const resultKeys = _.pick(result, keys)\r\n const previousResult = aggregatedResults.find(aggregatedResult => {\r\n const aggregatedResultKeys = _.pick(aggregatedResult, keys)\r\n return _.isEqual(aggregatedResultKeys, resultKeys)\r\n })\r\n // Merge with previous matching feature if any\r\n if (previousResult) {\r\n Object.assign(previousResult.time, result.time)\r\n _.set(previousResult, prefix + element, _.get(result, prefix + element))\r\n } else {\r\n aggregatedResults.push(result)\r\n }\r\n })\r\n }\r\n }))\r\n delete query.$groupBy\r\n delete query.$aggregate\r\n delete query.$geoNear\r\n // Set result to avoid service DB call\r\n hook.result = aggregatedResults\r\n }\r\n return hook\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../../map/api/hooks/hooks.query.js"],"names":["hook","query","params","service","$aggregate","collection","Model","featureId","options","featureIdType","ids","$groupBy","reduce","object","id","Object","assign","groupBy","_id","keys","_","singleTime","toNumber","$limit","map","key","feature","$first","time","$push","runTime","type","$last","properties","includes","geometry","match","omit","aggregateOptions","has","set","get","hint","aggregatedResults","Promise","all","element","isGeometry","prefix","pipeline","$geoNear","push","$match","$exists","$sort","$group","$replaceRoot","newRoot","debug","forEach","forOwn","stage","value","elementResults","aggregate","toArray","length","result","unset","resultKeys","pick","previousResult","find","aggregatedResultKeys","aggregatedResult","isEqual","aggregateFeaturesQuery","marshallGeometryQuery","marshallSpatialQuery","asGeoJson","isNil","centerLon","longitude","centerLat","latitude","distance","near","coordinates","maxDistance","distanceField","spherical","$geoWithin","$centerSphere","south","north","west","east","geometryQuery","$geoIntersects","$geometry","geoJson","force","$distinct","$aggregation","longitudeProperty","latitudeProperty","altitudeProperty","geometryProperty","results","dataPath","isPaginated","data","pagination","filter","item","Array","isArray","geometries","mapping","from","to","delete","features"],"mappings":"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","file":"hooks.query.js","sourcesContent":["import _ from 'lodash'\r\nimport { marshallGeometry } from '../marshall'\r\nimport makeDebug from 'debug'\r\n\r\nconst debug = makeDebug('kdk:map:query:hooks')\r\n\r\nexport function marshallGeometryQuery (hook) {\r\n const query = hook.params.query\r\n if (_.isNil(query)) return\r\n const geometry = query.geometry\r\n if (_.isNil(geometry)) return\r\n marshallGeometry(geometry)\r\n}\r\n\r\nexport function marshallSpatialQuery (hook) {\r\n const query = hook.params.query\r\n if (query) {\r\n if (!_.isNil(query.geometry)) marshallGeometry(query.geometry)\r\n // Shortcut for proximity query\r\n if ((!_.isNil(query.centerLon) || !_.isNil(query.longitude)) &&\r\n (!_.isNil(query.centerLat) || !_.isNil(query.latitude)) && !_.isNil(query.distance)) {\r\n const longitude = (_.isNil(query.centerLon) ? _.toNumber(query.longitude) : _.toNumber(query.centerLon))\r\n const latitude = (_.isNil(query.centerLat) ? _.toNumber(query.latitude) : _.toNumber(query.centerLat))\r\n const distance = _.toNumber(query.distance)\r\n // Transform to MongoDB spatial request\r\n delete query.centerLon\r\n delete query.longitude\r\n delete query.centerLat\r\n delete query.latitude\r\n delete query.distance\r\n // Aggregation requires a specific operator\r\n if (query.$aggregate) {\r\n query.$geoNear = {\r\n near: { type: 'Point', coordinates: [longitude, latitude] },\r\n maxDistance: distance,\r\n distanceField: 'distance',\r\n spherical: true\r\n }\r\n } else {\r\n /* We switched from $near to $geoWithin due to https://github.com/kalisio/kdk/issues/345\r\n query.geometry = {\r\n $near: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n },\r\n $maxDistance: distance\r\n }\r\n }\r\n */\r\n query.geometry = {\r\n $geoWithin: {\r\n $centerSphere: [[longitude, latitude], distance / 6378137.0] // Earth radius as in radians\r\n }\r\n }\r\n }\r\n }\r\n // Shortcut for bbox query\r\n if (!_.isNil(query.south) && !_.isNil(query.north) && !_.isNil(query.west) && !_.isNil(query.east)) {\r\n const south = _.toNumber(query.south)\r\n const north = _.toNumber(query.north)\r\n const west = _.toNumber(query.west)\r\n const east = _.toNumber(query.east)\r\n // Transform to MongoDB spatial request\r\n delete query.south\r\n delete query.north\r\n delete query.west\r\n delete query.east\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Polygon',\r\n coordinates: [ // BBox as a polygon\r\n [[west, south], [east, south], [east, north], [west, north], [west, south]] // Closing point\r\n ]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n // Shortcut for location query\r\n if (!_.isNil(query.longitude) && !_.isNil(query.latitude)) {\r\n const longitude = _.toNumber(query.longitude)\r\n const latitude = _.toNumber(query.latitude)\r\n // Transform to MongoDB spatial request\r\n delete query.longitude\r\n delete query.latitude\r\n const geometryQuery = {\r\n $geoIntersects: {\r\n $geometry: {\r\n type: 'Point',\r\n coordinates: [longitude, latitude]\r\n }\r\n }\r\n }\r\n query.geometry = geometryQuery\r\n }\r\n if (query.geoJson) {\r\n delete query.geoJson\r\n hook.params.asGeoJson = true\r\n }\r\n }\r\n}\r\n\r\nexport function asGeoJson (options = {}) {\r\n return function (hook) {\r\n const params = hook.params\r\n const query = params.query\r\n if (!options.force && !params.asGeoJson) return\r\n if (query.$distinct || query.$aggregation) return // Not applicable in this case\r\n const longitudeProperty = (options.longitudeProperty || 'longitude')\r\n const latitudeProperty = (options.latitudeProperty || 'latitude')\r\n const altitudeProperty = (options.altitudeProperty || 'altitude')\r\n const geometryProperty = (options.geometryProperty || 'geometry')\r\n let results = _.get(hook, options.dataPath || 'result')\r\n // Already as GeoJson ?\r\n if (results.type === 'FeatureCollection') return\r\n const isPaginated = !_.isNil(results.data)\r\n const pagination = (isPaginated ? _.pick(results, ['total', 'skip', 'limit']) : {})\r\n results = (isPaginated ? results.data : results)\r\n results = results\r\n .filter(item => {\r\n // Check if item is not already in GeoJson feature format and we can convert if required\r\n return (_.has(item, longitudeProperty) && _.has(item, latitudeProperty)) ||\r\n // When performing feature aggregation on geometries the result can be an array\r\n Array.isArray(_.get(item, geometryProperty)) ||\r\n // Check for a geometry property (previously provided or already transformed item)\r\n (_.has(item, geometryProperty + '.type') && _.has(item, geometryProperty + '.coordinates'))\r\n })\r\n .map(item => {\r\n let coordinates\r\n // Keep track of coordinates before picking properties\r\n if (_.has(item, longitudeProperty) && _.has(item, latitudeProperty)) {\r\n coordinates = [_.get(item, longitudeProperty), _.get(item, latitudeProperty)]\r\n if (_.has(item, altitudeProperty)) {\r\n coordinates.push(_.get(item, altitudeProperty))\r\n }\r\n }\r\n if (options.pick) {\r\n item = _.pick(item, options.pick)\r\n }\r\n if (options.omit) {\r\n item = _.omit(item, options.omit)\r\n }\r\n // Item locations are already in GeoJson format\r\n if (_.has(item, geometryProperty + '.type') && _.has(item, geometryProperty + '.coordinates')) {\r\n return Object.assign({\r\n type: 'Feature',\r\n geometry: _.get(item, geometryProperty),\r\n properties: {}\r\n }, _.omit(item, [geometryProperty]))\r\n } else if (Array.isArray(_.get(item, geometryProperty))) {\r\n return Object.assign({\r\n type: 'Feature',\r\n geometry: { type: 'GeometryCollection', geometries: _.get(item, geometryProperty) },\r\n properties: {}\r\n }, _.omit(item, [geometryProperty]))\r\n } else if (coordinates) {\r\n // Item locations are not already in GeoJson feature format so we need to convert\r\n return Object.assign({\r\n type: 'Feature',\r\n geometry: { type: 'Point', coordinates },\r\n properties: {}\r\n }, _.omit(item, [longitudeProperty, latitudeProperty]))\r\n }\r\n })\r\n // Move some data to properties ?\r\n if (options.properties) {\r\n results.forEach(item => {\r\n options.properties.forEach(mapping => {\r\n if (mapping.from) _.set(item, `properties.${mapping.to || mapping.from}`, _.get(item, `${mapping.from}`))\r\n if (mapping.delete) _.unset(item, `${mapping.from}`)\r\n })\r\n })\r\n }\r\n // Copy pagination information if any so that client can use it anyway\r\n if (_.get(options, 'asFeatureCollection', true)) {\r\n _.set(hook, options.dataPath || 'result', Object.assign({\r\n type: 'FeatureCollection',\r\n features: results\r\n }, pagination)) // If no pagination this merged object will be empty\r\n } else if (isPaginated) {\r\n _.set(hook, options.dataPath || 'result', Object.assign({\r\n data: results\r\n }, pagination))\r\n } else {\r\n _.set(hook, options.dataPath || 'result', results)\r\n }\r\n }\r\n}\r\n\r\nexport async function aggregateFeaturesQuery (hook) {\r\n const query = hook.params.query\r\n const service = hook.service\r\n if (!query) return\r\n // Perform aggregation\r\n if (query.$aggregate) {\r\n const collection = service.Model\r\n const featureId = (service.options ? service.options.featureId : '')\r\n const featureIdType = (service.options ? service.options.featureIdType : 'string')\r\n const ids = typeof query.$groupBy === 'string' // Group by matching ID(s), ie single ID or array of field to create a compound ID\r\n ? { [query.$groupBy]: '$properties.' + query.$groupBy }\r\n // Aggregated in an accumulator to avoid conflict with feature properties\r\n : query.$groupBy.reduce((object, id) => Object.assign(object, { [id]: '$properties.' + id }), {})\r\n const groupBy = { _id: ids }\r\n let keys = _.keys(ids)\r\n // Do we only keep first or last available time ?\r\n const singleTime = (_.toNumber(query.$limit) === 1)\r\n if (singleTime) {\r\n // When single time no aggregation is performed at all so we only have raw features\r\n keys = keys.map(key => 'properties.' + key)\r\n // In this case no need to aggregate on each element we simply keep the first feature\r\n // BUG: according to https://jira.mongodb.org/browse/SERVER-9507 MongoDB is not yet\r\n // able to optimize this kind of operations to avoid full index scan\r\n // For now we should restrict it to short time range\r\n Object.assign(groupBy, { feature: { $first: '$$ROOT' } })\r\n } else {\r\n Object.assign(groupBy, {\r\n time: { $push: '$time' }, // Keep track of all times\r\n runTime: { $push: '$runTime' }, // Keep track of all run times\r\n type: { $last: '$type' }, // type is assumed similar for all results, keep last\r\n properties: { $last: '$properties' } // non-aggregated properties are assumed similar for all results, keep last\r\n })\r\n // Check if we aggregate geometry or simply properties\r\n if (!query.$aggregate.includes('geometry')) {\r\n Object.assign(groupBy, {\r\n geometry: { $last: '$geometry' } // geometry is assumed similar for all results, keep last\r\n })\r\n }\r\n }\r\n // The query contains the match stage except options relevent to the aggregation pipeline\r\n const match = _.omit(query, ['$groupBy', '$aggregate', '$geoNear', '$sort', '$limit', '$skip'])\r\n const aggregateOptions = {}\r\n // Check for any required type conversion (eg HTTP requests)\r\n if (featureId && _.has(match, 'properties.' + featureId)) {\r\n if (featureIdType === 'number') _.set(match, 'properties.' + featureId, _.toNumber(_.get(match, 'properties.' + featureId)))\r\n // Check if we could provide a hint to the aggregation when targeting feature ID\r\n // Indeed, in that case, we define the appropriate index\r\n aggregateOptions.hint = { ['properties.' + featureId]: 1 }\r\n }\r\n // Ensure we do not mix results with/without relevant element values\r\n // by separately querying each element then merging\r\n let aggregatedResults\r\n await Promise.all(query.$aggregate.map(async element => {\r\n const isGeometry = (element === 'geometry')\r\n // Geometry is a root property while others are feature properties\r\n const prefix = (isGeometry ? '' : 'properties.')\r\n const pipeline = []\r\n // Check for geometry stage\r\n if (query.$geoNear) {\r\n pipeline.push({ $geoNear: query.$geoNear })\r\n }\r\n // Find matching features only\r\n pipeline.push({ $match: Object.assign({ [prefix + element]: { $exists: true } }, match) })\r\n // Ensure they are ordered by increasing time by default and most recent forecast first\r\n pipeline.push({ $sort: Object.assign({ time: 1, runTime: -1 }, query.$sort) })\r\n // Keep track of all feature values\r\n if (singleTime) {\r\n pipeline.push({ $group: groupBy })\r\n pipeline.push({ $replaceRoot: { newRoot: '$feature' } })\r\n } else {\r\n pipeline.push({ $group: Object.assign({ [element]: { $push: '$' + prefix + element } }, groupBy) })\r\n }\r\n debug(`Aggregating ${element} element for features`)\r\n pipeline.forEach(stage => {\r\n _.forOwn(stage, (value, key) => debug('Stage', key, value))\r\n })\r\n const elementResults = await collection.aggregate(pipeline, aggregateOptions).toArray()\r\n debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults)\r\n // Rearrange data so that we get ordered arrays indexed by element\r\n elementResults.forEach(result => {\r\n result.time = { [element]: result.time }\r\n if (result.runTime) result.runTime = { [element]: result.runTime }\r\n if (!singleTime && !isGeometry) {\r\n // Set back the element values as properties because we aggregated in an accumulator\r\n // to avoid conflict with non-aggregated feature properties\r\n _.set(result, prefix + element, _.get(result, element))\r\n // Delete accumulator\r\n _.unset(result, element)\r\n }\r\n })\r\n // Now merge with previous element results\r\n if (!aggregatedResults) {\r\n aggregatedResults = elementResults\r\n } else {\r\n elementResults.forEach(result => {\r\n const resultKeys = _.pick(result, keys)\r\n const previousResult = aggregatedResults.find(aggregatedResult => {\r\n const aggregatedResultKeys = _.pick(aggregatedResult, keys)\r\n return _.isEqual(aggregatedResultKeys, resultKeys)\r\n })\r\n // Merge with previous matching feature if any\r\n if (previousResult) {\r\n Object.assign(previousResult.time, result.time)\r\n if (result.runTime) {\r\n if (previousResult.runTime) Object.assign(previousResult.runTime, result.runTime)\r\n else previousResult.runTime = { [element]: result.runTime }\r\n }\r\n _.set(previousResult, prefix + element, _.get(result, prefix + element))\r\n } else {\r\n aggregatedResults.push(result)\r\n }\r\n })\r\n }\r\n }))\r\n delete query.$groupBy\r\n delete query.$aggregate\r\n delete query.$geoNear\r\n // Set result to avoid service DB call\r\n hook.result = aggregatedResults\r\n }\r\n return hook\r\n}\r\n"]}
@@ -13,7 +13,7 @@ function simplifyResult(hook) {
13
13
  module.exports = {
14
14
  before: {
15
15
  all: [_api.hooks.marshallTimeQuery, _api.hooks.convertObjectIDs(['layer'])],
16
- find: [_api.hooks.marshallComparisonQuery, _api.hooks.marshallSortQuery, _hooks.marshallSpatialQuery, _api.hooks.distinct, _hooks.aggregateFeaturesQuery],
16
+ find: [_api.hooks.marshallComparisonQuery, _api.hooks.marshallSortQuery, _hooks.marshallSpatialQuery, _api.hooks.distinct, _hooks.aggregateFeaturesQuery, _api.hooks.aggregationQuery],
17
17
  get: [],
18
18
  create: [_api.hooks.processTimes(['time'])],
19
19
  update: [_api.hooks.processTimes(['time'])],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../map/api/services/features/features.hooks.js"],"names":["simplifyResult","hook","Array","isArray","result","map","item","_id","module","exports","before","all","coreHooks","marshallTimeQuery","convertObjectIDs","find","marshallComparisonQuery","marshallSortQuery","marshallSpatialQuery","distinct","aggregateFeaturesQuery","get","create","processTimes","update","patch","remove","after","unprocessTimes","force","skipEvents","error"],"mappings":";;AAAA;;AACA;;AAEA,SAASA,cAAT,CAAyBC,IAAzB,EAA+B;AAC7B;AACA,MAAIC,MAAMC,OAAN,CAAcF,KAAKG,MAAnB,CAAJ,EAAgCH,KAAKG,MAAL,GAAcH,KAAKG,MAAL,CAAYC,GAAZ,CAAgBC,SAAS,EAAEC,KAAKD,KAAKC,GAAZ,EAAT,CAAhB,CAAd;AAChC,SAAON,IAAP;AACD;;AAEDO,OAAOC,OAAP,GAAiB;AACfC,UAAQ;AACNC,SAAK,CAACC,WAAUC,iBAAX,EAA8BD,WAAUE,gBAAV,CAA2B,CAAC,OAAD,CAA3B,CAA9B,CADC;AAENC,UAAM,CAACH,WAAUI,uBAAX,EAAoCJ,WAAUK,iBAA9C,EAAiEC,2BAAjE,EACJN,WAAUO,QADN,EACgBC,6BADhB,CAFA;AAINC,SAAK,EAJC;AAKNC,YAAQ,CAACV,WAAUW,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CALF;AAMNC,YAAQ,CAACZ,WAAUW,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CANF;AAONE,WAAO,CAACb,WAAUW,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CAPD;AAQNG,YAAQ,CAACd,WAAUI,uBAAX,EAAoCE,2BAApC;AARF,GADO;;AAYfS,SAAO;AACLhB,SAAK,CAACC,WAAUgB,cAAV,CAAyB,CAAC,MAAD,CAAzB,CAAD,CADA;AAELb,UAAM,CAAC,sBAAU,EAAEc,OAAO,IAAT,EAAV,CAAD,CAFD;AAGLR,SAAK,EAHA;AAIL;AACAC,YAAQ,CAACtB,cAAD,EAAiBY,WAAUkB,UAA3B,CALH;AAMLN,YAAQ,CAACxB,cAAD,EAAiBY,WAAUkB,UAA3B,CANH;AAOLL,WAAO,CAACzB,cAAD,EAAiBY,WAAUkB,UAA3B,CAPF;AAQLJ,YAAQ,CAAC1B,cAAD,EAAiBY,WAAUkB,UAA3B;AARH,GAZQ;;AAuBfC,SAAO;AACLpB,SAAK,EADA;AAELI,UAAM,EAFD;AAGLM,SAAK,EAHA;AAILC,YAAQ,EAJH;AAKLE,YAAQ,EALH;AAMLC,WAAO,EANF;AAOLC,YAAQ;AAPH;AAvBQ,CAAjB","file":"features.hooks.js","sourcesContent":["import { hooks as coreHooks } from '../../../../core/api'\r\nimport { marshallSpatialQuery, aggregateFeaturesQuery, asGeoJson } from '../../hooks'\r\n\r\nfunction simplifyResult (hook) {\r\n // Only keep track of object IDs so that caller can at least get them if required\r\n if (Array.isArray(hook.result)) hook.result = hook.result.map(item => ({ _id: item._id }))\r\n return hook\r\n}\r\n\r\nmodule.exports = {\r\n before: {\r\n all: [coreHooks.marshallTimeQuery, coreHooks.convertObjectIDs(['layer'])],\r\n find: [coreHooks.marshallComparisonQuery, coreHooks.marshallSortQuery, marshallSpatialQuery,\r\n coreHooks.distinct, aggregateFeaturesQuery],\r\n get: [],\r\n create: [coreHooks.processTimes(['time'])],\r\n update: [coreHooks.processTimes(['time'])],\r\n patch: [coreHooks.processTimes(['time'])],\r\n remove: [coreHooks.marshallComparisonQuery, marshallSpatialQuery]\r\n },\r\n\r\n after: {\r\n all: [coreHooks.unprocessTimes(['time'])],\r\n find: [asGeoJson({ force: true })],\r\n get: [],\r\n // Avoid emitting events and full result on feature edition because we usually proceed with big batches\r\n create: [simplifyResult, coreHooks.skipEvents],\r\n update: [simplifyResult, coreHooks.skipEvents],\r\n patch: [simplifyResult, coreHooks.skipEvents],\r\n remove: [simplifyResult, coreHooks.skipEvents]\r\n },\r\n\r\n error: {\r\n all: [],\r\n find: [],\r\n get: [],\r\n create: [],\r\n update: [],\r\n patch: [],\r\n remove: []\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../../../map/api/services/features/features.hooks.js"],"names":["simplifyResult","hook","Array","isArray","result","map","item","_id","module","exports","before","all","coreHooks","marshallTimeQuery","convertObjectIDs","find","marshallComparisonQuery","marshallSortQuery","marshallSpatialQuery","distinct","aggregateFeaturesQuery","aggregationQuery","get","create","processTimes","update","patch","remove","after","unprocessTimes","force","skipEvents","error"],"mappings":";;AAAA;;AACA;;AAEA,SAASA,cAAT,CAAyBC,IAAzB,EAA+B;AAC7B;AACA,MAAIC,MAAMC,OAAN,CAAcF,KAAKG,MAAnB,CAAJ,EAAgCH,KAAKG,MAAL,GAAcH,KAAKG,MAAL,CAAYC,GAAZ,CAAgBC,SAAS,EAAEC,KAAKD,KAAKC,GAAZ,EAAT,CAAhB,CAAd;AAChC,SAAON,IAAP;AACD;;AAEDO,OAAOC,OAAP,GAAiB;AACfC,UAAQ;AACNC,SAAK,CAACC,WAAUC,iBAAX,EAA8BD,WAAUE,gBAAV,CAA2B,CAAC,OAAD,CAA3B,CAA9B,CADC;AAENC,UAAM,CAACH,WAAUI,uBAAX,EAAoCJ,WAAUK,iBAA9C,EAAiEC,2BAAjE,EACJN,WAAUO,QADN,EACgBC,6BADhB,EACwCR,WAAUS,gBADlD,CAFA;AAINC,SAAK,EAJC;AAKNC,YAAQ,CAACX,WAAUY,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CALF;AAMNC,YAAQ,CAACb,WAAUY,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CANF;AAONE,WAAO,CAACd,WAAUY,YAAV,CAAuB,CAAC,MAAD,CAAvB,CAAD,CAPD;AAQNG,YAAQ,CAACf,WAAUI,uBAAX,EAAoCE,2BAApC;AARF,GADO;;AAYfU,SAAO;AACLjB,SAAK,CAACC,WAAUiB,cAAV,CAAyB,CAAC,MAAD,CAAzB,CAAD,CADA;AAELd,UAAM,CAAC,sBAAU,EAAEe,OAAO,IAAT,EAAV,CAAD,CAFD;AAGLR,SAAK,EAHA;AAIL;AACAC,YAAQ,CAACvB,cAAD,EAAiBY,WAAUmB,UAA3B,CALH;AAMLN,YAAQ,CAACzB,cAAD,EAAiBY,WAAUmB,UAA3B,CANH;AAOLL,WAAO,CAAC1B,cAAD,EAAiBY,WAAUmB,UAA3B,CAPF;AAQLJ,YAAQ,CAAC3B,cAAD,EAAiBY,WAAUmB,UAA3B;AARH,GAZQ;;AAuBfC,SAAO;AACLrB,SAAK,EADA;AAELI,UAAM,EAFD;AAGLO,SAAK,EAHA;AAILC,YAAQ,EAJH;AAKLE,YAAQ,EALH;AAMLC,WAAO,EANF;AAOLC,YAAQ;AAPH;AAvBQ,CAAjB","file":"features.hooks.js","sourcesContent":["import { hooks as coreHooks } from '../../../../core/api'\r\nimport { marshallSpatialQuery, aggregateFeaturesQuery, asGeoJson } from '../../hooks'\r\n\r\nfunction simplifyResult (hook) {\r\n // Only keep track of object IDs so that caller can at least get them if required\r\n if (Array.isArray(hook.result)) hook.result = hook.result.map(item => ({ _id: item._id }))\r\n return hook\r\n}\r\n\r\nmodule.exports = {\r\n before: {\r\n all: [coreHooks.marshallTimeQuery, coreHooks.convertObjectIDs(['layer'])],\r\n find: [coreHooks.marshallComparisonQuery, coreHooks.marshallSortQuery, marshallSpatialQuery,\r\n coreHooks.distinct, aggregateFeaturesQuery, coreHooks.aggregationQuery],\r\n get: [],\r\n create: [coreHooks.processTimes(['time'])],\r\n update: [coreHooks.processTimes(['time'])],\r\n patch: [coreHooks.processTimes(['time'])],\r\n remove: [coreHooks.marshallComparisonQuery, marshallSpatialQuery]\r\n },\r\n\r\n after: {\r\n all: [coreHooks.unprocessTimes(['time'])],\r\n find: [asGeoJson({ force: true })],\r\n get: [],\r\n // Avoid emitting events and full result on feature edition because we usually proceed with big batches\r\n create: [simplifyResult, coreHooks.skipEvents],\r\n update: [simplifyResult, coreHooks.skipEvents],\r\n patch: [simplifyResult, coreHooks.skipEvents],\r\n remove: [simplifyResult, coreHooks.skipEvents]\r\n },\r\n\r\n error: {\r\n all: [],\r\n find: [],\r\n get: [],\r\n create: [],\r\n update: [],\r\n patch: [],\r\n remove: []\r\n }\r\n}\r\n"]}
@@ -0,0 +1,156 @@
1
+ <template>
2
+ <div class="q-pl-sm q-pr-xs row justify-center items-center no-wrap q-gutter-x-xs">
3
+ <q-select
4
+ v-model="resolution"
5
+ :options="getResolutions()"
6
+ dense
7
+ borderless>
8
+ <template v-slot:option="scope">
9
+ <q-item v-bind="scope.itemProps" v-on="scope.itemEvents">
10
+ <q-item-section>
11
+ <q-item-label v-html="scope.opt.label" />
12
+ </q-item-section>
13
+ <q-item-section side>
14
+ <q-item-label caption>{{ scope.opt.description }}</q-item-label>
15
+ </q-item-section>
16
+ </q-item>
17
+ </template>
18
+ </q-select>
19
+ <q-input
20
+ v-model.number="width"
21
+ type="number"
22
+ min="256" max="4000"
23
+ mask="(#)###"
24
+ borderless
25
+ dense
26
+ input-class="text-center"
27
+ style="max-width: 54px" />
28
+ <span>x</span>
29
+ <q-input
30
+ v-model.number="height"
31
+ type="number"
32
+ min="256" max="4000"
33
+ mask="(#)###"
34
+ borderless
35
+ dense
36
+ input-class="text-center"
37
+ style="max-width: 54px" />
38
+ <k-action
39
+ id="capture-button"
40
+ icon="las la-camera"
41
+ tooltip="KCaptureToolbar.CAPTURE_ACTION"
42
+ :handler="() => this.capture()" />
43
+ </div>
44
+ </template>
45
+
46
+ <script>
47
+ import _ from 'lodash'
48
+ import { Events, Time } from '../../../core/client'
49
+ import { exportFile } from 'quasar'
50
+
51
+ export default {
52
+ name: 'k-capture-toolbar',
53
+ inject: ['kActivity'],
54
+ data () {
55
+ return {
56
+ width: 1280,
57
+ height: 720,
58
+ resolution: undefined
59
+ }
60
+ },
61
+ watch: {
62
+ resolution: {
63
+ immediate: true,
64
+ handler (value) {
65
+ if (!value) this.resolution = this.getResolutions()[1]
66
+ else {
67
+ const size = _.split(this.resolution.value, 'x')
68
+ this.width = size[0]
69
+ this.height = size[1]
70
+ }
71
+ }
72
+ },
73
+ width: {
74
+ handler (value) {
75
+ if (value < 256) this.width = 256
76
+ if (value > 4000) this.width = 4000
77
+ }
78
+ },
79
+ height: {
80
+ handler (value) {
81
+ if (value < 256) this.height = 256
82
+ if (value > 4000) this.height = 4000
83
+ }
84
+ }
85
+ },
86
+ methods: {
87
+ getResolutions () {
88
+ return [
89
+ { label: this.$t('KCaptureToolbar.SD_LABEL'), description: this.$t('KCaptureToolbar.SD_DESCRIPTION'), value: '640x480' },
90
+ { label: this.$t('KCaptureToolbar.HD_LABEL'), description: this.$t('KCaptureToolbar.HD_DESCRIPTION'), value: '1280x720' },
91
+ { label: this.$t('KCaptureToolbar.FHD_LABEL'), description: this.$t('KCaptureToolbar.FHD_DESCRIPTION'), value: '1920x1080' },
92
+ { label: this.$t('KCaptureToolbar.QHD_LABEL'), description: this.$t('KCaptureToolbar.QHD_DESCRIPTION'), value: '2560x1440' },
93
+ { label: this.$t('KCaptureToolbar.2K_LABEL'), description: this.$t('KCaptureToolbar.2K_DESCRIPTION'), value: '2048x1080' },
94
+ { label: this.$t('KCaptureToolbar.4K_LABEL'), description: this.$t('KCaptureToolbar.4K_DESCRIPTION'), value: '3840x2160' }
95
+ ]
96
+ },
97
+ async capture () {
98
+ // Retrieve the layers
99
+ const layers = []
100
+ const contextLayers = this.kActivity.getContextParameters('layers').layers
101
+ _.forEach(contextLayers, layer => {
102
+ const isVisibleByDefaut = _.get(this.kActivity.layers[layer], 'leaflet.isVisible', false)
103
+ if (!isVisibleByDefaut) layers.push(layer)
104
+ })
105
+ // Retrieve the extension
106
+ const bbox = this.kActivity.getContextParameters('view')
107
+ // Setup the request url options
108
+ const endpoint = this.$config('gateway') + '/capture'
109
+ const options = {
110
+ method: 'POST',
111
+ mode: 'cors',
112
+ body: JSON.stringify({
113
+ activity: this.kActivity.is3D() ? 'globe' : 'map',
114
+ layers,
115
+ bbox: [bbox.west, bbox.south, bbox.east, bbox.north],
116
+ size: { width: +this.width, height: +this.height },
117
+ time: Time.getCurrentTime().toISOString()
118
+ }),
119
+ headers: {
120
+ 'Content-Type': 'application/json'
121
+ }
122
+ }
123
+ // Add the Authorization header if jwt is defined
124
+ const jwt = this.$api.get('storage').getItem(this.$config('gatewayJwt'))
125
+ if (jwt) options.headers.Authorization = 'Bearer ' + jwt
126
+ // Perform the request
127
+ let dismiss = null
128
+ try {
129
+ dismiss = this.$q.notify({
130
+ group: 'capture',
131
+ icon: 'las la-hourglass-half',
132
+ message: this.$t('KCaptureToolbar.CAPTURING_VIEW'),
133
+ color: 'primary',
134
+ timeout: 0,
135
+ spinner: true
136
+ })
137
+ const response = await fetch(endpoint, options)
138
+ dismiss()
139
+ if (response.ok) {
140
+ const arrayBuffer = await response.arrayBuffer()
141
+ exportFile('capture.png', new Uint8Array(arrayBuffer))
142
+ } else {
143
+ Events.$emit('error', { message: this.$t('errors.' + response.status) })
144
+ }
145
+ } catch (error) {
146
+ // Network error
147
+ dismiss()
148
+ Events.$emit('error', { message: this.$t('errors.NETWORK_ERROR') })
149
+ }
150
+ }
151
+ },
152
+ beforeCreate () {
153
+ this.$options.components['k-action'] = this.$load('frame/KAction')
154
+ }
155
+ }
156
+ </script>