@kalisio/kdk 1.3.5 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (535) hide show
  1. package/.nyc_output/2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json +1 -0
  2. package/.nyc_output/{0b8aa700-8daa-49ce-85e7-a8f8965d55f0.json → 2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json} +0 -0
  3. package/.nyc_output/{20df4355-911a-4b16-a8ab-d3392e9f0a7f.json → 81d21e46-766a-46bc-b1b7-143ca577347a.json} +0 -0
  4. package/.nyc_output/a762cb58-70dc-4d39-ab69-928635affa98.json +1 -0
  5. package/.nyc_output/{257af0bb-96c3-465a-b5ef-a1df60078d5f.json → aaf3ebbb-f895-4d7b-9255-bc5dee832570.json} +0 -0
  6. package/.nyc_output/{284aebfa-23fd-425f-9d72-e4b8904dc224.json → dbeb2602-0ac2-4e66-978b-0d29548359ca.json} +0 -0
  7. package/.nyc_output/{5cbee06e-be6e-468a-bd78-4793ee785fe4.json → e47d1e4c-2fff-4dcb-908f-d3081162547c.json} +0 -0
  8. package/.nyc_output/processinfo/{2bece194-92f7-4971-a688-10604044a7fa.json → 2c5b7c8e-81db-4d2c-a7a4-02dc640d301f.json} +1 -1
  9. package/.nyc_output/processinfo/2e74ca23-8cf0-4161-9536-f71c2a1a74bb.json +1 -0
  10. package/.nyc_output/processinfo/81d21e46-766a-46bc-b1b7-143ca577347a.json +1 -0
  11. package/.nyc_output/processinfo/a762cb58-70dc-4d39-ab69-928635affa98.json +1 -0
  12. package/.nyc_output/processinfo/aaf3ebbb-f895-4d7b-9255-bc5dee832570.json +1 -0
  13. package/.nyc_output/processinfo/dbeb2602-0ac2-4e66-978b-0d29548359ca.json +1 -0
  14. package/.nyc_output/processinfo/e47d1e4c-2fff-4dcb-908f-d3081162547c.json +1 -0
  15. package/.nyc_output/processinfo/index.json +1 -1
  16. package/CHANGELOG.md +189 -67
  17. package/README.md +1 -1
  18. package/coverage/core/api/application.js.html +145 -145
  19. package/coverage/core/api/authentication.js.html +37 -37
  20. package/coverage/core/api/db.js.html +74 -74
  21. package/coverage/core/api/hooks/hooks.account.js.html +15 -15
  22. package/coverage/core/api/hooks/hooks.authentication.js.html +16 -16
  23. package/coverage/core/api/hooks/hooks.authorisations.js.html +112 -121
  24. package/coverage/core/api/hooks/hooks.devices.js.html +5 -5
  25. package/coverage/core/api/hooks/hooks.groups.js.html +3 -3
  26. package/coverage/core/api/hooks/hooks.logger.js.html +7 -7
  27. package/coverage/core/api/hooks/hooks.model.js.html +149 -149
  28. package/coverage/core/api/hooks/hooks.organisations.js.html +13 -61
  29. package/coverage/core/api/hooks/hooks.pusher.js.html +7 -7
  30. package/coverage/core/api/hooks/hooks.query.js.html +68 -32
  31. package/coverage/core/api/hooks/hooks.service.js.html +15 -15
  32. package/coverage/core/api/hooks/hooks.storage.js.html +5 -5
  33. package/coverage/core/api/hooks/hooks.tags.js.html +7 -7
  34. package/coverage/core/api/hooks/hooks.users.js.html +111 -63
  35. package/coverage/core/api/hooks/index.html +72 -72
  36. package/coverage/core/api/hooks/index.js.html +15 -15
  37. package/coverage/core/api/index.html +35 -35
  38. package/coverage/core/api/index.js.html +13 -13
  39. package/coverage/core/api/marshall.js.html +81 -81
  40. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  41. package/coverage/core/api/models/index.html +1 -1
  42. package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
  43. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  44. package/coverage/core/api/models/users.model.mongodb.js.html +7 -7
  45. package/coverage/core/api/oauth2-handler.js.html +3 -3
  46. package/coverage/core/api/oauth2-verifier.js.html +5 -5
  47. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  48. package/coverage/core/api/services/account/account.service.js.html +34 -34
  49. package/coverage/core/api/services/account/index.html +17 -17
  50. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +3 -3
  51. package/coverage/core/api/services/authorisations/authorisations.service.js.html +40 -37
  52. package/coverage/core/api/services/authorisations/index.html +17 -17
  53. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  54. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  55. package/coverage/core/api/services/databases/index.html +1 -1
  56. package/coverage/core/api/services/devices/devices.hooks.js.html +1 -1
  57. package/coverage/core/api/services/devices/devices.service.js.html +1 -1
  58. package/coverage/core/api/services/devices/index.html +1 -1
  59. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  60. package/coverage/core/api/services/groups/index.html +1 -1
  61. package/coverage/core/api/services/index.html +5 -5
  62. package/coverage/core/api/services/index.js.html +40 -40
  63. package/coverage/core/api/services/mailer/index.html +1 -1
  64. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  65. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  66. package/coverage/core/api/services/organisations/index.html +1 -1
  67. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  68. package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
  69. package/coverage/core/api/services/pusher/index.html +1 -1
  70. package/coverage/core/api/services/pusher/pusher.channels.js.html +1 -1
  71. package/coverage/core/api/services/pusher/pusher.hooks.js.html +1 -1
  72. package/coverage/core/api/services/pusher/pusher.service.js.html +1 -1
  73. package/coverage/core/api/services/storage/index.html +1 -1
  74. package/coverage/core/api/services/storage/storage.hooks.js.html +4 -4
  75. package/coverage/core/api/services/tags/index.html +1 -1
  76. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  77. package/coverage/core/api/services/users/index.html +1 -1
  78. package/coverage/core/api/services/users/users.hooks.js.html +12 -12
  79. package/coverage/core/common/index.html +32 -32
  80. package/coverage/core/common/index.js.html +27 -27
  81. package/coverage/core/common/permissions.js.html +135 -75
  82. package/coverage/index.html +157 -157
  83. package/coverage/lcov-report/core/api/application.js.html +145 -145
  84. package/coverage/lcov-report/core/api/authentication.js.html +37 -37
  85. package/coverage/lcov-report/core/api/db.js.html +74 -74
  86. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +15 -15
  87. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +16 -16
  88. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +112 -121
  89. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +5 -5
  90. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +3 -3
  91. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +7 -7
  92. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +149 -149
  93. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +13 -61
  94. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +7 -7
  95. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +68 -32
  96. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +15 -15
  97. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +5 -5
  98. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +7 -7
  99. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +111 -63
  100. package/coverage/lcov-report/core/api/hooks/index.html +72 -72
  101. package/coverage/lcov-report/core/api/hooks/index.js.html +15 -15
  102. package/coverage/lcov-report/core/api/index.html +35 -35
  103. package/coverage/lcov-report/core/api/index.js.html +13 -13
  104. package/coverage/lcov-report/core/api/marshall.js.html +81 -81
  105. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  106. package/coverage/lcov-report/core/api/models/index.html +1 -1
  107. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
  108. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  109. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +7 -7
  110. package/coverage/lcov-report/core/api/oauth2-handler.js.html +3 -3
  111. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +5 -5
  112. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  113. package/coverage/lcov-report/core/api/services/account/account.service.js.html +34 -34
  114. package/coverage/lcov-report/core/api/services/account/index.html +17 -17
  115. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +3 -3
  116. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +40 -37
  117. package/coverage/lcov-report/core/api/services/authorisations/index.html +17 -17
  118. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  119. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  120. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  121. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +1 -1
  122. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +1 -1
  123. package/coverage/lcov-report/core/api/services/devices/index.html +1 -1
  124. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  125. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  126. package/coverage/lcov-report/core/api/services/index.html +5 -5
  127. package/coverage/lcov-report/core/api/services/index.js.html +40 -40
  128. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  129. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  130. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  131. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  132. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  133. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
  134. package/coverage/lcov-report/core/api/services/pusher/index.html +1 -1
  135. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +1 -1
  136. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +1 -1
  137. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +1 -1
  138. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  139. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +4 -4
  140. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  141. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  142. package/coverage/lcov-report/core/api/services/users/index.html +1 -1
  143. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +12 -12
  144. package/coverage/lcov-report/core/common/index.html +32 -32
  145. package/coverage/lcov-report/core/common/index.js.html +27 -27
  146. package/coverage/lcov-report/core/common/permissions.js.html +135 -75
  147. package/coverage/lcov-report/index.html +157 -157
  148. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +55 -55
  149. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +337 -274
  150. package/coverage/lcov-report/map/api/hooks/index.html +43 -43
  151. package/coverage/lcov-report/map/api/hooks/index.js.html +12 -12
  152. package/coverage/lcov-report/map/api/index.html +31 -31
  153. package/coverage/lcov-report/map/api/index.js.html +24 -24
  154. package/coverage/lcov-report/map/api/marshall.js.html +39 -39
  155. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +20 -20
  156. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +22 -22
  157. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +24 -24
  158. package/coverage/lcov-report/map/api/models/index.html +43 -43
  159. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +21 -21
  160. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +156 -156
  161. package/coverage/lcov-report/map/api/services/alerts/index.html +30 -30
  162. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +19 -19
  163. package/coverage/lcov-report/map/api/services/catalog/index.html +17 -17
  164. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  165. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  166. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +20 -20
  167. package/coverage/lcov-report/map/api/services/features/index.html +21 -21
  168. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +8 -8
  169. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +99 -99
  170. package/coverage/lcov-report/map/api/services/geocoder/index.html +28 -28
  171. package/coverage/lcov-report/map/api/services/index.html +21 -21
  172. package/coverage/lcov-report/map/api/services/index.js.html +71 -71
  173. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
  174. package/coverage/lcov-report/map/common/errors.js.html +9 -9
  175. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +120 -120
  176. package/coverage/lcov-report/map/common/grid.js.html +268 -268
  177. package/coverage/lcov-report/map/common/index.html +149 -149
  178. package/coverage/lcov-report/map/common/index.js.html +31 -31
  179. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +71 -71
  180. package/coverage/lcov-report/map/common/moment-utils.js.html +14 -14
  181. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +280 -280
  182. package/coverage/lcov-report/map/common/opendap-utils.js.html +220 -220
  183. package/coverage/lcov-report/map/common/permissions.js.html +21 -21
  184. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +51 -51
  185. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  186. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +99 -99
  187. package/coverage/lcov-report/map/common/wcs-utils.js.html +66 -66
  188. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +196 -196
  189. package/coverage/lcov-report/map/common/wfs-utils.js.html +8 -5
  190. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  191. package/coverage/lcov-report/map/common/wmts-utils.js.html +71 -11
  192. package/coverage/lcov.info +3588 -3659
  193. package/coverage/map/api/hooks/hooks.catalog.js.html +55 -55
  194. package/coverage/map/api/hooks/hooks.query.js.html +337 -274
  195. package/coverage/map/api/hooks/index.html +43 -43
  196. package/coverage/map/api/hooks/index.js.html +12 -12
  197. package/coverage/map/api/index.html +31 -31
  198. package/coverage/map/api/index.js.html +24 -24
  199. package/coverage/map/api/marshall.js.html +39 -39
  200. package/coverage/map/api/models/alerts.model.mongodb.js.html +20 -20
  201. package/coverage/map/api/models/catalog.model.mongodb.js.html +22 -22
  202. package/coverage/map/api/models/features.model.mongodb.js.html +24 -24
  203. package/coverage/map/api/models/index.html +43 -43
  204. package/coverage/map/api/services/alerts/alerts.hooks.js.html +21 -21
  205. package/coverage/map/api/services/alerts/alerts.service.js.html +156 -156
  206. package/coverage/map/api/services/alerts/index.html +30 -30
  207. package/coverage/map/api/services/catalog/catalog.hooks.js.html +19 -19
  208. package/coverage/map/api/services/catalog/index.html +17 -17
  209. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  210. package/coverage/map/api/services/daptiles/index.html +1 -1
  211. package/coverage/map/api/services/features/features.hooks.js.html +20 -20
  212. package/coverage/map/api/services/features/index.html +21 -21
  213. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +8 -8
  214. package/coverage/map/api/services/geocoder/geocoder.service.js.html +99 -99
  215. package/coverage/map/api/services/geocoder/index.html +28 -28
  216. package/coverage/map/api/services/index.html +21 -21
  217. package/coverage/map/api/services/index.js.html +71 -71
  218. package/coverage/map/common/dynamic-grid-source.js.html +68 -68
  219. package/coverage/map/common/errors.js.html +9 -9
  220. package/coverage/map/common/geotiff-grid-source.js.html +120 -120
  221. package/coverage/map/common/grid.js.html +268 -268
  222. package/coverage/map/common/index.html +149 -149
  223. package/coverage/map/common/index.js.html +31 -31
  224. package/coverage/map/common/meteo-model-grid-source.js.html +71 -71
  225. package/coverage/map/common/moment-utils.js.html +14 -14
  226. package/coverage/map/common/opendap-grid-source.js.html +280 -280
  227. package/coverage/map/common/opendap-utils.js.html +220 -220
  228. package/coverage/map/common/permissions.js.html +21 -21
  229. package/coverage/map/common/time-based-grid-source.js.html +51 -51
  230. package/coverage/map/common/tms-utils.js.html +1 -1
  231. package/coverage/map/common/wcs-grid-source.js.html +99 -99
  232. package/coverage/map/common/wcs-utils.js.html +66 -66
  233. package/coverage/map/common/weacast-grid-source.js.html +196 -196
  234. package/coverage/map/common/wfs-utils.js.html +8 -5
  235. package/coverage/map/common/wms-utils.js.html +1 -1
  236. package/coverage/map/common/wmts-utils.js.html +71 -11
  237. package/extras/icons/kanban.png +0 -0
  238. package/extras/testcafe/page-models/map/catalog.js +2 -2
  239. package/extras/tours/core/add-member.js +10 -1
  240. package/extras/tours/core/{tag-member.js → edit-member-tags.js} +4 -3
  241. package/extras/tours/core/groups.js +8 -2
  242. package/extras/tours/core/members.js +11 -21
  243. package/extras/tours/core/tags.js +7 -1
  244. package/extras/tours/map/catalog-categories.js +4 -4
  245. package/extras/tours/map/catalog-panel.js +16 -16
  246. package/extras/tours/map/favorite-views.js +3 -3
  247. package/lib/core/api/hooks/hooks.authorisations.js +149 -140
  248. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  249. package/lib/core/api/hooks/hooks.organisations.js +1 -23
  250. package/lib/core/api/hooks/hooks.organisations.js.map +1 -1
  251. package/lib/core/api/hooks/hooks.query.js +22 -0
  252. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  253. package/lib/core/api/hooks/hooks.users.js +34 -18
  254. package/lib/core/api/hooks/hooks.users.js.map +1 -1
  255. package/lib/core/api/services/authorisations/authorisations.service.js +34 -25
  256. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  257. package/lib/core/client/api.js +1 -0
  258. package/lib/core/client/api.js.map +1 -1
  259. package/lib/core/client/components/account/KAccountDZ.vue +3 -4
  260. package/lib/core/client/components/account/KAccountDevices.vue +5 -6
  261. package/lib/core/client/components/account/KDeviceCard.vue +2 -1
  262. package/lib/core/client/components/account/KIdentityPanel.vue +1 -7
  263. package/lib/core/client/components/collection/KBoard.vue +26 -155
  264. package/lib/core/client/components/collection/KCard.vue +144 -42
  265. package/lib/core/client/components/collection/KCardSection.vue +52 -0
  266. package/lib/core/client/components/collection/KColumn.vue +181 -0
  267. package/lib/core/client/components/collection/KGrid.vue +13 -18
  268. package/lib/core/client/components/collection/KHistory.vue +61 -89
  269. package/lib/core/client/components/collection/KHistoryEntry.vue +90 -66
  270. package/lib/core/client/components/collection/KItem.vue +21 -2
  271. package/lib/core/client/components/collection/KList.vue +9 -12
  272. package/lib/core/client/components/collection/KTable.vue +33 -39
  273. package/lib/core/client/components/collection/index.js +6 -1
  274. package/lib/core/client/components/collection/index.js.map +1 -1
  275. package/lib/core/client/components/editor/KEditor.vue +0 -6
  276. package/lib/core/client/components/editor/KModalEditor.vue +4 -4
  277. package/lib/core/client/components/editor/KSettingsEditor.vue +49 -0
  278. package/lib/core/client/components/form/KAttachmentField.vue +10 -10
  279. package/lib/core/client/components/form/KChipsField.vue +28 -23
  280. package/lib/core/client/components/form/KColorField.vue +30 -25
  281. package/lib/core/client/components/form/KForm.vue +0 -12
  282. package/lib/core/client/components/form/KIconField.vue +1 -0
  283. package/lib/core/client/components/form/KItemField.vue +8 -4
  284. package/lib/core/client/components/form/KRoleField.vue +56 -0
  285. package/lib/core/client/components/form/KSelectField.vue +16 -1
  286. package/lib/core/client/components/form/KView.vue +5 -14
  287. package/lib/core/client/components/frame/KAction.vue +18 -12
  288. package/lib/core/client/components/frame/KAvatar.vue +3 -3
  289. package/lib/core/client/components/frame/KChart.vue +60 -0
  290. package/lib/core/client/components/frame/KChipsPane.vue +80 -0
  291. package/lib/core/client/components/frame/KContent.vue +1 -1
  292. package/lib/core/client/components/frame/KModal.vue +30 -44
  293. package/lib/core/client/components/frame/KPanel.vue +1 -1
  294. package/lib/core/client/components/frame/{KMenu.vue → KPopupAction.vue} +6 -7
  295. package/lib/core/client/components/frame/KSpot.vue +31 -0
  296. package/lib/core/client/components/frame/KStamp.vue +62 -0
  297. package/lib/core/client/components/frame/index.js +56 -1
  298. package/lib/core/client/components/frame/index.js.map +1 -1
  299. package/lib/core/client/components/input/KColorChooser.vue +16 -8
  300. package/lib/core/client/components/input/KIconChooser.vue +2 -1
  301. package/lib/core/client/components/input/KUploader.vue +14 -5
  302. package/lib/core/client/components/layout/KAbout.vue +9 -3
  303. package/lib/core/client/components/layout/KFab.vue +1 -1
  304. package/lib/core/client/components/layout/KPage.vue +44 -19
  305. package/lib/core/client/components/layout/KTour.vue +2 -2
  306. package/lib/core/client/components/layout/KWelcome.vue +13 -12
  307. package/lib/core/client/components/layout/KWindow.vue +1 -1
  308. package/lib/core/client/components/media/KImageViewer.vue +9 -7
  309. package/lib/core/client/components/media/KMediaBrowser.vue +12 -8
  310. package/lib/core/client/components/menu/KMenu.vue +103 -0
  311. package/lib/core/client/components/team/KAddMember.vue +17 -9
  312. package/lib/core/client/components/team/KChangeRole.vue +5 -7
  313. package/lib/core/client/components/team/KGroupCard.vue +34 -51
  314. package/lib/core/client/components/team/KGroupsActivity.vue +9 -2
  315. package/lib/core/client/components/team/KJoinGroup.vue +5 -7
  316. package/lib/core/client/components/team/KMemberCard.vue +104 -63
  317. package/lib/core/client/components/team/KMembersActivity.vue +9 -2
  318. package/lib/core/client/components/team/KOrganisationsActivity.vue +8 -1
  319. package/lib/core/client/components/team/KTagCard.vue +26 -26
  320. package/lib/core/client/components/team/KTagsActivity.vue +9 -2
  321. package/lib/core/client/components/time/KTimeRange.vue +144 -0
  322. package/lib/core/client/components/viewer/KModalViewer.vue +6 -0
  323. package/lib/core/client/components/viewer/KViewer.vue +0 -6
  324. package/lib/core/client/i18n/core_en.json +133 -93
  325. package/lib/core/client/i18n/core_fr.json +56 -16
  326. package/lib/core/client/index.js +28 -14
  327. package/lib/core/client/index.js.map +1 -1
  328. package/lib/core/client/mixins/mixin.authorisation.js +28 -18
  329. package/lib/core/client/mixins/mixin.authorisation.js.map +1 -1
  330. package/lib/core/client/mixins/mixin.base-collection.js +57 -9
  331. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  332. package/lib/core/client/mixins/mixin.base-context.js +1 -1
  333. package/lib/core/client/mixins/mixin.base-context.js.map +1 -1
  334. package/lib/core/client/mixins/mixin.base-editor.js +26 -16
  335. package/lib/core/client/mixins/mixin.base-editor.js.map +1 -1
  336. package/lib/core/client/mixins/mixin.base-field.js +0 -4
  337. package/lib/core/client/mixins/mixin.base-field.js.map +1 -1
  338. package/lib/core/client/mixins/mixin.base-item.js +29 -14
  339. package/lib/core/client/mixins/mixin.base-item.js.map +1 -1
  340. package/lib/core/client/mixins/mixin.base-viewer.js +0 -2
  341. package/lib/core/client/mixins/mixin.base-viewer.js.map +1 -1
  342. package/lib/core/client/mixins/mixin.object-proxy.js +17 -3
  343. package/lib/core/client/mixins/mixin.object-proxy.js.map +1 -1
  344. package/lib/core/client/mixins/mixin.schema-proxy.js +31 -0
  345. package/lib/core/client/mixins/mixin.schema-proxy.js.map +1 -1
  346. package/lib/core/client/mixins/mixin.service.js +5 -33
  347. package/lib/core/client/mixins/mixin.service.js.map +1 -1
  348. package/lib/core/client/services/index.js +23 -0
  349. package/lib/core/client/services/index.js.map +1 -1
  350. package/lib/core/client/services/local-settings.service.js +4 -0
  351. package/lib/core/client/services/local-settings.service.js.map +1 -1
  352. package/lib/core/client/time.js +131 -0
  353. package/lib/core/client/time.js.map +1 -0
  354. package/lib/core/common/permissions.js +65 -23
  355. package/lib/core/common/permissions.js.map +1 -1
  356. package/lib/core/common/schemas/groups.create.json +1 -1
  357. package/lib/core/common/schemas/groups.update.json +1 -1
  358. package/lib/core/common/schemas/organisations.create.json +1 -1
  359. package/lib/core/common/schemas/organisations.update.json +2 -2
  360. package/lib/core/common/schemas/settings.update.json +139 -0
  361. package/lib/core/common/schemas/tags.update.json +9 -1
  362. package/lib/map/api/hooks/hooks.query.js +48 -27
  363. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  364. package/lib/map/api/services/features/features.hooks.js +1 -1
  365. package/lib/map/api/services/features/features.hooks.js.map +1 -1
  366. package/lib/map/client/components/KColorLegend.vue +25 -23
  367. package/lib/map/client/components/KFavoriteViews.vue +71 -35
  368. package/lib/map/client/components/KFeaturesChart.vue +11 -9
  369. package/lib/map/client/components/KFeaturesFilter.vue +15 -7
  370. package/lib/map/client/components/KFeaturesTable.vue +27 -2
  371. package/lib/map/client/components/KLayerEditionToolbar.vue +43 -0
  372. package/lib/map/client/components/KLayerStyleEditor.vue +10 -4
  373. package/lib/map/client/components/KLayerStyleForm.vue +14 -11
  374. package/lib/map/client/components/KLocationInput.vue +126 -65
  375. package/lib/map/client/components/KLocationMap.vue +199 -84
  376. package/lib/map/client/components/KPositionIndicator.vue +1 -0
  377. package/lib/map/client/components/KTimeline.vue +41 -36
  378. package/lib/map/client/components/KUrlLegend.vue +21 -19
  379. package/lib/map/client/components/catalog/KBaseLayersSelector.vue +105 -0
  380. package/lib/map/client/components/catalog/KCatalog.vue +14 -2
  381. package/lib/map/client/components/catalog/KConnectLayer.vue +31 -11
  382. package/lib/map/client/components/catalog/KCreateLayer.vue +37 -14
  383. package/lib/map/client/components/catalog/KImportLayer.vue +28 -8
  384. package/lib/map/client/components/catalog/KLayerCategories.vue +86 -62
  385. package/lib/map/client/components/catalog/KLayersSelector.vue +42 -42
  386. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
  387. package/lib/map/client/components/form/KLocationField.vue +1 -1
  388. package/lib/map/client/components/form/KOwsLayerField.vue +21 -2
  389. package/lib/map/client/components/form/KOwsServiceField.vue +1 -0
  390. package/lib/map/client/components/widget/KInformationBox.vue +10 -16
  391. package/lib/map/client/components/widget/KMapillaryViewer.vue +59 -49
  392. package/lib/map/client/components/widget/KTimeSeries.vue +39 -29
  393. package/lib/map/client/i18n/map_en.json +65 -17
  394. package/lib/map/client/i18n/map_fr.json +67 -20
  395. package/lib/map/client/init.js +18 -6
  396. package/lib/map/client/init.js.map +1 -1
  397. package/lib/map/client/leaflet/GSMaPLayer.js +4 -9
  398. package/lib/map/client/leaflet/GSMaPLayer.js.map +1 -1
  399. package/lib/map/client/leaflet/GradientPath.js.map +1 -1
  400. package/lib/map/client/leaflet/MaskLayer.js +64 -0
  401. package/lib/map/client/leaflet/MaskLayer.js.map +1 -0
  402. package/lib/map/client/mixins/globe/mixin.base-globe.js +4 -1
  403. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  404. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -9
  405. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  406. package/lib/map/client/mixins/index.js +8 -13
  407. package/lib/map/client/mixins/index.js.map +1 -1
  408. package/lib/map/client/mixins/map/mixin.base-map.js +30 -6
  409. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  410. package/lib/map/client/mixins/map/mixin.canvas-layers.js +274 -51
  411. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  412. package/lib/map/client/mixins/map/mixin.edit-layers.js +218 -121
  413. package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
  414. package/lib/map/client/mixins/map/mixin.file-layers.js +25 -18
  415. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  416. package/lib/map/client/mixins/map/mixin.geojson-layers.js +18 -10
  417. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  418. package/lib/map/client/mixins/map/mixin.georaster-layers.js +7 -4
  419. package/lib/map/client/mixins/map/mixin.georaster-layers.js.map +1 -1
  420. package/lib/map/client/mixins/map/mixin.gsmap-layers.js +3 -3
  421. package/lib/map/client/mixins/map/mixin.gsmap-layers.js.map +1 -1
  422. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +8 -10
  423. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  424. package/lib/map/client/mixins/map/mixin.mapillary-layers.js +25 -40
  425. package/lib/map/client/mixins/map/mixin.mapillary-layers.js.map +1 -1
  426. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +5 -3
  427. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
  428. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +5 -3
  429. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
  430. package/lib/map/client/mixins/mixin.activity.js +60 -68
  431. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  432. package/lib/map/client/mixins/mixin.feature-selection.js +8 -10
  433. package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
  434. package/lib/map/client/mixins/mixin.feature-service.js +7 -5
  435. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  436. package/lib/map/client/mixins/mixin.weacast.js +6 -4
  437. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  438. package/lib/map/client/pixi-utils.js +9 -0
  439. package/lib/map/client/pixi-utils.js.map +1 -1
  440. package/lib/map/client/utils.js +50 -0
  441. package/lib/map/client/utils.js.map +1 -1
  442. package/lib/map/common/wfs-utils.js +1 -1
  443. package/lib/map/common/wfs-utils.js.map +1 -1
  444. package/lib/map/common/wmts-utils.js +31 -7
  445. package/lib/map/common/wmts-utils.js.map +1 -1
  446. package/lib/test/client/core/account.js +100 -0
  447. package/lib/test/client/core/account.js.map +1 -0
  448. package/lib/test/client/core/api.js +400 -0
  449. package/lib/test/client/core/api.js.map +1 -0
  450. package/lib/test/client/core/collection.js +109 -0
  451. package/lib/test/client/core/collection.js.map +1 -0
  452. package/lib/test/client/core/index.js +90 -0
  453. package/lib/test/client/core/index.js.map +1 -0
  454. package/lib/test/client/core/layout.js +221 -0
  455. package/lib/test/client/core/layout.js.map +1 -0
  456. package/lib/test/client/core/runner.js +204 -0
  457. package/lib/test/client/core/runner.js.map +1 -0
  458. package/lib/test/client/core/screens.js +68 -0
  459. package/lib/test/client/core/screens.js.map +1 -0
  460. package/lib/test/client/core/utils.js +304 -0
  461. package/lib/test/client/core/utils.js.map +1 -0
  462. package/lib/test/client/index.js +20 -0
  463. package/lib/test/client/index.js.map +1 -0
  464. package/lib/test/client/map/catalog.js +191 -0
  465. package/lib/test/client/map/catalog.js.map +1 -0
  466. package/lib/test/client/map/controls.js +54 -0
  467. package/lib/test/client/map/controls.js.map +1 -0
  468. package/lib/test/client/map/index.js +30 -0
  469. package/lib/test/client/map/index.js.map +1 -0
  470. package/package.json +17 -9
  471. package/test.client.js +1 -0
  472. package/tests/core/test-log-2021-07-15.log +71 -0
  473. package/tests/core/test-log-2021-09-02.log +47 -0
  474. package/tests/map/test-log-%DATE%.logYYYY-07-DD +12 -0
  475. package/tests/map/test-log-%DATE%.logYYYY-09-DD +6 -0
  476. package/tests/map/test-log-2021-07-12.log +12 -0
  477. package/tests/map/test-log-2021-07-15.log +5 -0
  478. package/tests/map/test-log-2021-09-02.log +3 -0
  479. package/.nyc_output/11cd93d8-69cb-405c-98a3-d249ea35b6da.json +0 -1
  480. package/.nyc_output/2bece194-92f7-4971-a688-10604044a7fa.json +0 -1
  481. package/.nyc_output/5ddee33e-b658-4c8e-a247-54f575ac67e8.json +0 -1
  482. package/.nyc_output/78760ae4-555f-4d9c-a6a1-acf5e2f0fe45.json +0 -1
  483. package/.nyc_output/d0bb2559-084e-4c92-b9e6-29a9abd41f7c.json +0 -1
  484. package/.nyc_output/processinfo/0b8aa700-8daa-49ce-85e7-a8f8965d55f0.json +0 -1
  485. package/.nyc_output/processinfo/11cd93d8-69cb-405c-98a3-d249ea35b6da.json +0 -1
  486. package/.nyc_output/processinfo/20df4355-911a-4b16-a8ab-d3392e9f0a7f.json +0 -1
  487. package/.nyc_output/processinfo/257af0bb-96c3-465a-b5ef-a1df60078d5f.json +0 -1
  488. package/.nyc_output/processinfo/284aebfa-23fd-425f-9d72-e4b8904dc224.json +0 -1
  489. package/.nyc_output/processinfo/5cbee06e-be6e-468a-bd78-4793ee785fe4.json +0 -1
  490. package/.nyc_output/processinfo/5ddee33e-b658-4c8e-a247-54f575ac67e8.json +0 -1
  491. package/.nyc_output/processinfo/78760ae4-555f-4d9c-a6a1-acf5e2f0fe45.json +0 -1
  492. package/.nyc_output/processinfo/d0bb2559-084e-4c92-b9e6-29a9abd41f7c.json +0 -1
  493. package/lib/core/client/components/frame/KLabel.vue +0 -56
  494. package/lib/core/client/components/team/KTagsPane.vue +0 -35
  495. package/lib/map/client/leaflet/TiledMapillaryLayer.js +0 -137
  496. package/lib/map/client/leaflet/TiledMapillaryLayer.js.map +0 -1
  497. package/lib/map/client/mixins/mixin.time.js +0 -73
  498. package/lib/map/client/mixins/mixin.time.js.map +0 -1
  499. package/tests/core/account.test.js +0 -415
  500. package/tests/core/client.test.js.skip +0 -37
  501. package/tests/core/config/default.js +0 -97
  502. package/tests/core/config/email-templates/confirmInvitation/html.ejs +0 -18
  503. package/tests/core/config/email-templates/identityChange/html.ejs +0 -12
  504. package/tests/core/config/email-templates/newDevice/html.ejs +0 -7
  505. package/tests/core/config/email-templates/passwordChange/html.ejs +0 -5
  506. package/tests/core/config/email-templates/resendVerifySignup/html.ejs +0 -10
  507. package/tests/core/config/email-templates/resetPwd/html.ejs +0 -5
  508. package/tests/core/config/email-templates/sendResetPwd/html.ejs +0 -8
  509. package/tests/core/config/email-templates/verifySignup/html.ejs +0 -3
  510. package/tests/core/data/10k_most_common_passwords.txt +0 -10000
  511. package/tests/core/data/logo.png +0 -0
  512. package/tests/core/hooks.test.js +0 -175
  513. package/tests/core/index.test.js +0 -418
  514. package/tests/core/notifications.test.js +0 -465
  515. package/tests/core/storage.test.js +0 -134
  516. package/tests/core/team.test.js +0 -610
  517. package/tests/core/utils.js +0 -59
  518. package/tests/map/alerts.test.js +0 -554
  519. package/tests/map/config/default.js +0 -112
  520. package/tests/map/config/layers.json +0 -37
  521. package/tests/map/daptiles.test.js +0 -41
  522. package/tests/map/data/DescribeCoverage.xml +0 -55
  523. package/tests/map/data/GetCoverage.tif +0 -0
  524. package/tests/map/data/adsb.observations.json +0 -132
  525. package/tests/map/data/dataset.grb.das +0 -55
  526. package/tests/map/data/dataset.grb.dds +0 -17
  527. package/tests/map/data/dataset.grb.dods +0 -0
  528. package/tests/map/data/lat_lon_bounds.grb.dods +0 -0
  529. package/tests/map/data/subdataset.grb.dods +0 -0
  530. package/tests/map/data/vigicrues.observations.json +0 -47042
  531. package/tests/map/data/vigicrues.stations.json +0 -15422
  532. package/tests/map/data/zones.json +0 -1228
  533. package/tests/map/grid-sources.test.js +0 -304
  534. package/tests/map/hooks.test.js +0 -96
  535. package/tests/map/index.test.js +0 -333
@@ -14,30 +14,40 @@ var _permissions = require('../../common/permissions');
14
14
 
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
16
 
17
+ 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"); }); }; }
18
+
17
19
  const authorisationMixin = {
18
20
  methods: {
19
21
  updateAbilities() {
20
- const user = _store.Store.get('user');
21
- let abilities;
22
- if (user) {
23
- abilities = (0, _permissions.defineAbilities)(user);
24
- _store.Store.set('user.abilities', abilities);
25
- }
26
- if (abilities) {
27
- _loglevel2.default.debug('New user abilities: ', abilities.rules);
28
- }
29
- return abilities;
22
+ var _this = this;
23
+
24
+ return _asyncToGenerator(function* () {
25
+ const user = _store.Store.get('user');
26
+ let abilities;
27
+ if (user) {
28
+ abilities = yield (0, _permissions.defineAbilities)(user, _this.$api);
29
+ _store.Store.set('user.abilities', abilities);
30
+ }
31
+ if (abilities) {
32
+ _loglevel2.default.debug('New user abilities: ', abilities.rules);
33
+ }
34
+ return abilities;
35
+ })();
30
36
  }
31
37
  },
32
38
  created() {
33
- // Check if abilities are already computed
34
- const abilities = _store.Store.get('user.abilities');
35
- if (!abilities) {
36
- // Otherwise try to compute them
37
- this.updateAbilities();
38
- }
39
- // Whenever the user is updated, update abilities as well
40
- this.$events.$on('user-changed', this.updateAbilities);
39
+ var _this2 = this;
40
+
41
+ return _asyncToGenerator(function* () {
42
+ // Check if abilities are already computed
43
+ const abilities = _store.Store.get('user.abilities');
44
+ if (!abilities) {
45
+ // Otherwise try to compute them
46
+ yield _this2.updateAbilities();
47
+ }
48
+ // Whenever the user is updated, update abilities as well
49
+ _this2.$events.$on('user-changed', _this2.updateAbilities);
50
+ })();
41
51
  },
42
52
  beforeDestroy() {
43
53
  this.$events.$off('user-changed', this.updateAbilities);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/mixins/mixin.authorisation.js"],"names":["authorisationMixin","methods","updateAbilities","user","Store","get","abilities","set","logger","debug","rules","created","$events","$on","beforeDestroy","$off"],"mappings":";;;;;;AAAA;;;;AACA;;AACA;;;;AAEA,MAAMA,qBAAqB;AACzBC,WAAS;AACPC,sBAAmB;AACjB,YAAMC,OAAOC,aAAMC,GAAN,CAAU,MAAV,CAAb;AACA,UAAIC,SAAJ;AACA,UAAIH,IAAJ,EAAU;AACRG,oBAAY,kCAAgBH,IAAhB,CAAZ;AACAC,qBAAMG,GAAN,CAAU,gBAAV,EAA4BD,SAA5B;AACD;AACD,UAAIA,SAAJ,EAAe;AACbE,2BAAOC,KAAP,CAAa,sBAAb,EAAqCH,UAAUI,KAA/C;AACD;AACD,aAAOJ,SAAP;AACD;AAZM,GADgB;AAezBK,YAAW;AACT;AACA,UAAML,YAAYF,aAAMC,GAAN,CAAU,gBAAV,CAAlB;AACA,QAAI,CAACC,SAAL,EAAgB;AACd;AACA,WAAKJ,eAAL;AACD;AACD;AACA,SAAKU,OAAL,CAAaC,GAAb,CAAiB,cAAjB,EAAiC,KAAKX,eAAtC;AACD,GAxBwB;AAyBzBY,kBAAiB;AACf,SAAKF,OAAL,CAAaG,IAAb,CAAkB,cAAlB,EAAkC,KAAKb,eAAvC;AACD;AA3BwB,CAA3B;;kBA8BeF,kB","file":"mixin.authorisation.js","sourcesContent":["import logger from 'loglevel'\r\nimport { Store } from '../store'\r\nimport { defineAbilities } from '../../common/permissions'\r\n\r\nconst authorisationMixin = {\r\n methods: {\r\n updateAbilities () {\r\n const user = Store.get('user')\r\n let abilities\r\n if (user) {\r\n abilities = defineAbilities(user)\r\n Store.set('user.abilities', abilities)\r\n }\r\n if (abilities) {\r\n logger.debug('New user abilities: ', abilities.rules)\r\n }\r\n return abilities\r\n }\r\n },\r\n created () {\r\n // Check if abilities are already computed\r\n const abilities = Store.get('user.abilities')\r\n if (!abilities) {\r\n // Otherwise try to compute them\r\n this.updateAbilities()\r\n }\r\n // Whenever the user is updated, update abilities as well\r\n this.$events.$on('user-changed', this.updateAbilities)\r\n },\r\n beforeDestroy () {\r\n this.$events.$off('user-changed', this.updateAbilities)\r\n }\r\n}\r\n\r\nexport default authorisationMixin\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/mixins/mixin.authorisation.js"],"names":["authorisationMixin","methods","updateAbilities","user","Store","get","abilities","$api","set","logger","debug","rules","created","$events","$on","beforeDestroy","$off"],"mappings":";;;;;;AAAA;;;;AACA;;AACA;;;;;;AAEA,MAAMA,qBAAqB;AACzBC,WAAS;AACDC,mBAAN,GAAyB;AAAA;;AAAA;AACvB,cAAMC,OAAOC,aAAMC,GAAN,CAAU,MAAV,CAAb;AACA,YAAIC,SAAJ;AACA,YAAIH,IAAJ,EAAU;AACRG,sBAAY,MAAM,kCAAgBH,IAAhB,EAAsB,MAAKI,IAA3B,CAAlB;AACAH,uBAAMI,GAAN,CAAU,gBAAV,EAA4BF,SAA5B;AACD;AACD,YAAIA,SAAJ,EAAe;AACbG,6BAAOC,KAAP,CAAa,sBAAb,EAAqCJ,UAAUK,KAA/C;AACD;AACD,eAAOL,SAAP;AAVuB;AAWxB;AAZM,GADgB;AAenBM,SAAN,GAAiB;AAAA;;AAAA;AACf;AACA,YAAMN,YAAYF,aAAMC,GAAN,CAAU,gBAAV,CAAlB;AACA,UAAI,CAACC,SAAL,EAAgB;AACd;AACA,cAAM,OAAKJ,eAAL,EAAN;AACD;AACD;AACA,aAAKW,OAAL,CAAaC,GAAb,CAAiB,cAAjB,EAAiC,OAAKZ,eAAtC;AARe;AAShB,GAxBwB;AAyBzBa,kBAAiB;AACf,SAAKF,OAAL,CAAaG,IAAb,CAAkB,cAAlB,EAAkC,KAAKd,eAAvC;AACD;AA3BwB,CAA3B;;kBA8BeF,kB","file":"mixin.authorisation.js","sourcesContent":["import logger from 'loglevel'\r\nimport { Store } from '../store'\r\nimport { defineAbilities } from '../../common/permissions'\r\n\r\nconst authorisationMixin = {\r\n methods: {\r\n async updateAbilities () {\r\n const user = Store.get('user')\r\n let abilities\r\n if (user) {\r\n abilities = await defineAbilities(user, this.$api)\r\n Store.set('user.abilities', abilities)\r\n }\r\n if (abilities) {\r\n logger.debug('New user abilities: ', abilities.rules)\r\n }\r\n return abilities\r\n }\r\n },\r\n async created () {\r\n // Check if abilities are already computed\r\n const abilities = Store.get('user.abilities')\r\n if (!abilities) {\r\n // Otherwise try to compute them\r\n await this.updateAbilities()\r\n }\r\n // Whenever the user is updated, update abilities as well\r\n this.$events.$on('user-changed', this.updateAbilities)\r\n },\r\n beforeDestroy () {\r\n this.$events.$off('user-changed', this.updateAbilities)\r\n }\r\n}\r\n\r\nexport default authorisationMixin\r\n"]}
@@ -24,6 +24,11 @@ const baseCollectionMixin = {
24
24
  appendItems: {
25
25
  type: Boolean,
26
26
  default: false
27
+ },
28
+ // Only invoke refresh at most once per every refreshThrottle milliseconds
29
+ refreshThrottle: {
30
+ type: Number,
31
+ default: 500
27
32
  }
28
33
  },
29
34
  computed: {
@@ -42,18 +47,25 @@ const baseCollectionMixin = {
42
47
  subscribe(query) {
43
48
  // Remove previous listener if any
44
49
  this.unsubscribe();
45
- this.itemListener = this.loadService().watch({ listStrategy: this.listStrategy || 'always' }).find({ query }).subscribe(response => {
50
+ this.itemListener = this.getService().watch({ listStrategy: this.listStrategy || 'always' }).find({ query }).subscribe(response => {
46
51
  // Manage GeoJson features collection as well
47
52
  if (response.type === 'FeatureCollection') {
48
53
  this.items = response.features;
49
54
  } else if (this.appendItems) {
50
- // Ensure there is no duplicates when appending
51
- this.items = _lodash2.default.unionBy(this.items, response.data, '_id');
55
+ // Append the response ensuring there is no duplicates
56
+ this.items = _lodash2.default.unionBy(response.data, this.items, '_id');
57
+ // We keep order from the updated list as depending on the sorting criteria a new item might have to be pushed on top of current items
58
+ const sortQuery = _lodash2.default.get(this.getCollectionBaseQuery(), '$sort');
59
+ if (sortQuery) {
60
+ this.items = _lodash2.default.orderBy(this.items, _lodash2.default.keys(sortQuery), _lodash2.default.map(_lodash2.default.values(sortQuery), value => {
61
+ return value > 0 ? 'asc' : 'desc';
62
+ }));
63
+ }
52
64
  } else {
53
65
  this.items = response.data;
54
66
  }
55
67
  this.nbTotalItems = response.total;
56
- this.$emit('collection-refreshed', this.$data);
68
+ this.$emit('collection-refreshed', this.items);
57
69
  }, error => {
58
70
  this.$events.$emit('error', error);
59
71
  });
@@ -81,24 +93,60 @@ const baseCollectionMixin = {
81
93
  };
82
94
  } else return {};
83
95
  },
84
- refreshCollection() {
85
- // Add locale to perform sorting (i.e. collation) correctly w.r.t. user's language
86
- const fullQuery = Object.assign({ $locale: (0, _utils.getLocale)() }, this.getCollectionBaseQuery(), this.getCollectionFilterQuery(), this.getCollectionPaginationQuery());
87
- // Find the desired items
88
- this.subscribe(fullQuery);
96
+ resetCollection() {
97
+ // Reset pagination and start again refreshing the collection
98
+ this.items = [];
99
+ this.currentPage = 1;
100
+ this.refreshCollection();
89
101
  },
90
102
  onPageChanged() {
91
103
  this.refreshCollection();
92
104
  },
105
+ onItemToggled(item, toggled) {
106
+ this.$emit('toggle-changed', item, toggled);
107
+ },
93
108
  onItemSelected(item, section) {
94
109
  this.$emit('selection-changed', item, section);
95
110
  },
96
111
  onItemsSelected(items) {
97
112
  this.$emit('selection-changed', items);
113
+ },
114
+ onItemsUpdated(items) {
115
+ // When we append items some items of the previous pages might have been updated.
116
+ // In this case we need to reset the full collection as Rx only tracks changes on the current page
117
+ let updatedItems = Array.isArray(items) ? items : [items];
118
+ // We keep order from the updated list as depending on the sorting criteria a new item might have to be pushed on top of current items
119
+ updatedItems = _lodash2.default.intersectionWith(this.items, updatedItems, (item1, item2) => item1._id.toString() === item2._id.toString());
120
+ if (updatedItems.length > 0) this.resetCollection();
121
+ }
122
+ },
123
+ created() {
124
+ // Avoid initiating too much request as the same time, this might be the case
125
+ // when async UI components update simultaneously the base/filter query
126
+ // see https://github.com/kalisio/kdk/issues/432
127
+ const refreshCollection = () => {
128
+ // Add locale to perform sorting (i.e. collation) correctly w.r.t. user's language
129
+ const fullQuery = Object.assign({ $locale: (0, _utils.getLocale)() }, this.getCollectionBaseQuery(), this.getCollectionFilterQuery(), this.getCollectionPaginationQuery());
130
+ // Find the desired items
131
+ this.subscribe(fullQuery);
132
+ };
133
+ this.refreshCollection = _lodash2.default.throttle(refreshCollection, this.refreshThrottle, { leading: false });
134
+
135
+ if (this.appendItems) {
136
+ const service = this.getService();
137
+ service.on('patched', this.onItemsUpdated);
138
+ service.on('updated', this.onItemsUpdated);
139
+ service.on('removed', this.onItemsUpdated);
98
140
  }
99
141
  },
100
142
  beforeDestroy() {
101
143
  this.unsubscribe();
144
+ if (this.appendItems) {
145
+ const service = this.getService();
146
+ service.off('patched', this.onItemsUpdated);
147
+ service.off('updated', this.onItemsUpdated);
148
+ service.off('removed', this.onItemsUpdated);
149
+ }
102
150
  }
103
151
  };
104
152
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/mixins/mixin.base-collection.js"],"names":["baseCollectionMixin","props","nbItemsPerPage","type","Number","default","appendItems","Boolean","computed","nbPages","Math","ceil","nbTotalItems","data","items","currentPage","methods","subscribe","query","unsubscribe","itemListener","loadService","watch","listStrategy","find","response","features","_","unionBy","total","$emit","$data","error","$events","getCollectionBaseQuery","getCollectionFilterQuery","getCollectionPaginationQuery","$limit","$skip","refreshCollection","fullQuery","Object","assign","$locale","onPageChanged","onItemSelected","item","section","onItemsSelected","beforeDestroy"],"mappings":";;;;;;AAAA;;;;AACA;;;;AAEA,MAAMA,sBAAsB;AAC1BC,SAAO;AACL;AACA;AACAC,oBAAgB;AACdC,YAAMC,MADQ;AAEdC,eAAS;AAFK,KAHX;AAOL;AACAC,iBAAa;AACXH,YAAMI,OADK;AAEXF,eAAS;AAFE;AARR,GADmB;AAc1BG,YAAU;AACRC,cAAW;AACT,aAAQ,KAAKP,cAAL,GAAsB,CAAtB,GAA0BQ,KAAKC,IAAL,CAAU,KAAKC,YAAL,GAAoB,KAAKV,cAAnC,CAA1B,GAA+E,CAAvF;AACD;AAHO,GAdgB;AAmB1BW,SAAQ;AACN,WAAO;AACLC,aAAO,EADF;AAELF,oBAAc,CAFT;AAGLG,mBAAa;AAHR,KAAP;AAKD,GAzByB;AA0B1BC,WAAS;AACPC,cAAWC,KAAX,EAAkB;AAChB;AACA,WAAKC,WAAL;AACA,WAAKC,YAAL,GAAoB,KAAKC,WAAL,GAAmBC,KAAnB,CAAyB,EAAEC,cAAc,KAAKA,YAAL,IAAqB,QAArC,EAAzB,EACjBC,IADiB,CACZ,EAAEN,KAAF,EADY,EAEjBD,SAFiB,CAEPQ,YAAY;AACrB;AACA,YAAIA,SAAStB,IAAT,KAAkB,mBAAtB,EAA2C;AACzC,eAAKW,KAAL,GAAaW,SAASC,QAAtB;AACD,SAFD,MAEO,IAAI,KAAKpB,WAAT,EAAsB;AAC3B;AACA,eAAKQ,KAAL,GAAaa,iBAAEC,OAAF,CAAU,KAAKd,KAAf,EAAsBW,SAASZ,IAA/B,EAAqC,KAArC,CAAb;AACD,SAHM,MAGA;AACL,eAAKC,KAAL,GAAaW,SAASZ,IAAtB;AACD;AACD,aAAKD,YAAL,GAAoBa,SAASI,KAA7B;AACA,aAAKC,KAAL,CAAW,sBAAX,EAAmC,KAAKC,KAAxC;AACD,OAdiB,EAcfC,SAAS;AACV,aAAKC,OAAL,CAAaH,KAAb,CAAmB,OAAnB,EAA4BE,KAA5B;AACD,OAhBiB,CAApB;AAiBD,KArBM;AAsBPb,kBAAe;AACb,UAAI,KAAKC,YAAT,EAAuB;AACrB,aAAKA,YAAL,CAAkBD,WAAlB;AACA,aAAKC,YAAL,GAAoB,IAApB;AACD;AACF,KA3BM;AA4BPc,6BAA0B;AACxB;AACA,aAAO,EAAP;AACD,KA/BM;AAgCPC,+BAA4B;AAC1B;AACA,aAAO,EAAP;AACD,KAnCM;AAoCPC,mCAAgC;AAC9B;AACA,UAAI,KAAKlC,cAAL,GAAsB,CAA1B,EAA6B;AAC3B,eAAO;AACLmC,kBAAQ,KAAKnC,cADR;AAELoC,iBAAO,CAAC,KAAKvB,WAAL,GAAmB,CAApB,IAAyB,KAAKb;AAFhC,SAAP;AAID,OALD,MAKO,OAAO,EAAP;AACR,KA5CM;AA6CPqC,wBAAqB;AACnB;AACA,YAAMC,YAAYC,OAAOC,MAAP,CAAc,EAAEC,SAAS,uBAAX,EAAd,EAChB,KAAKT,sBAAL,EADgB,EAEhB,KAAKC,wBAAL,EAFgB,EAGhB,KAAKC,4BAAL,EAHgB,CAAlB;AAIA;AACA,WAAKnB,SAAL,CAAeuB,SAAf;AACD,KArDM;AAsDPI,oBAAiB;AACf,WAAKL,iBAAL;AACD,KAxDM;AAyDPM,mBAAgBC,IAAhB,EAAsBC,OAAtB,EAA+B;AAC7B,WAAKjB,KAAL,CAAW,mBAAX,EAAgCgB,IAAhC,EAAsCC,OAAtC;AACD,KA3DM;AA4DPC,oBAAiBlC,KAAjB,EAAwB;AACtB,WAAKgB,KAAL,CAAW,mBAAX,EAAgChB,KAAhC;AACD;AA9DM,GA1BiB;AA0F1BmC,kBAAiB;AACf,SAAK9B,WAAL;AACD;AA5FyB,CAA5B;;kBA+FenB,mB","file":"mixin.base-collection.js","sourcesContent":["import _ from 'lodash'\r\nimport { getLocale } from '../utils'\r\n\r\nconst baseCollectionMixin = {\r\n props: {\r\n // This value can be overriden in activities if they want to manage pagination by themselves\r\n // nbItemsPerPage = 0 means that the client does not handle pagination and server defaults will be used\r\n nbItemsPerPage: {\r\n type: Number,\r\n default: 12\r\n },\r\n // This value indicate if items of each page replace or are appended to previous ones\r\n appendItems: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n computed: {\r\n nbPages () {\r\n return (this.nbItemsPerPage > 0 ? Math.ceil(this.nbTotalItems / this.nbItemsPerPage) : 1)\r\n }\r\n },\r\n data () {\r\n return {\r\n items: [],\r\n nbTotalItems: 0,\r\n currentPage: 1\r\n }\r\n },\r\n methods: {\r\n subscribe (query) {\r\n // Remove previous listener if any\r\n this.unsubscribe()\r\n this.itemListener = this.loadService().watch({ listStrategy: this.listStrategy || 'always' })\r\n .find({ query })\r\n .subscribe(response => {\r\n // Manage GeoJson features collection as well\r\n if (response.type === 'FeatureCollection') {\r\n this.items = response.features\r\n } else if (this.appendItems) {\r\n // Ensure there is no duplicates when appending\r\n this.items = _.unionBy(this.items, response.data, '_id')\r\n } else {\r\n this.items = response.data\r\n }\r\n this.nbTotalItems = response.total\r\n this.$emit('collection-refreshed', this.$data)\r\n }, error => {\r\n this.$events.$emit('error', error)\r\n })\r\n },\r\n unsubscribe () {\r\n if (this.itemListener) {\r\n this.itemListener.unsubscribe()\r\n this.itemListener = null\r\n }\r\n },\r\n getCollectionBaseQuery () {\r\n // This method should be overriden in collections\r\n return {}\r\n },\r\n getCollectionFilterQuery () {\r\n // This method should be overriden in collections\r\n return {}\r\n },\r\n getCollectionPaginationQuery () {\r\n // This method can be overriden in collections\r\n if (this.nbItemsPerPage > 0) {\r\n return {\r\n $limit: this.nbItemsPerPage,\r\n $skip: (this.currentPage - 1) * this.nbItemsPerPage\r\n }\r\n } else return {}\r\n },\r\n refreshCollection () {\r\n // Add locale to perform sorting (i.e. collation) correctly w.r.t. user's language\r\n const fullQuery = Object.assign({ $locale: getLocale() },\r\n this.getCollectionBaseQuery(),\r\n this.getCollectionFilterQuery(),\r\n this.getCollectionPaginationQuery())\r\n // Find the desired items\r\n this.subscribe(fullQuery)\r\n },\r\n onPageChanged () {\r\n this.refreshCollection()\r\n },\r\n onItemSelected (item, section) {\r\n this.$emit('selection-changed', item, section)\r\n },\r\n onItemsSelected (items) {\r\n this.$emit('selection-changed', items)\r\n }\r\n },\r\n beforeDestroy () {\r\n this.unsubscribe()\r\n }\r\n}\r\n\r\nexport default baseCollectionMixin\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/mixins/mixin.base-collection.js"],"names":["baseCollectionMixin","props","nbItemsPerPage","type","Number","default","appendItems","Boolean","refreshThrottle","computed","nbPages","Math","ceil","nbTotalItems","data","items","currentPage","methods","subscribe","query","unsubscribe","itemListener","getService","watch","listStrategy","find","response","features","_","unionBy","sortQuery","get","getCollectionBaseQuery","orderBy","keys","map","values","value","total","$emit","error","$events","getCollectionFilterQuery","getCollectionPaginationQuery","$limit","$skip","resetCollection","refreshCollection","onPageChanged","onItemToggled","item","toggled","onItemSelected","section","onItemsSelected","onItemsUpdated","updatedItems","Array","isArray","intersectionWith","item1","item2","_id","toString","length","created","fullQuery","Object","assign","$locale","throttle","leading","service","on","beforeDestroy","off"],"mappings":"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","file":"mixin.base-collection.js","sourcesContent":["import _ from 'lodash'\r\nimport { getLocale } from '../utils'\r\n\r\nconst baseCollectionMixin = {\r\n props: {\r\n // This value can be overriden in activities if they want to manage pagination by themselves\r\n // nbItemsPerPage = 0 means that the client does not handle pagination and server defaults will be used\r\n nbItemsPerPage: {\r\n type: Number,\r\n default: 12\r\n },\r\n // This value indicate if items of each page replace or are appended to previous ones\r\n appendItems: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // Only invoke refresh at most once per every refreshThrottle milliseconds\r\n refreshThrottle: {\r\n type: Number,\r\n default: 500\r\n }\r\n },\r\n computed: {\r\n nbPages () {\r\n return (this.nbItemsPerPage > 0 ? Math.ceil(this.nbTotalItems / this.nbItemsPerPage) : 1)\r\n }\r\n },\r\n data () {\r\n return {\r\n items: [],\r\n nbTotalItems: 0,\r\n currentPage: 1\r\n }\r\n },\r\n methods: {\r\n subscribe (query) {\r\n // Remove previous listener if any\r\n this.unsubscribe()\r\n this.itemListener = this.getService().watch({ listStrategy: this.listStrategy || 'always' })\r\n .find({ query })\r\n .subscribe(response => {\r\n // Manage GeoJson features collection as well\r\n if (response.type === 'FeatureCollection') {\r\n this.items = response.features\r\n } else if (this.appendItems) {\r\n // Append the response ensuring there is no duplicates\r\n this.items = _.unionBy(response.data, this.items, '_id')\r\n // We keep order from the updated list as depending on the sorting criteria a new item might have to be pushed on top of current items\r\n const sortQuery = _.get(this.getCollectionBaseQuery(), '$sort')\r\n if (sortQuery) {\r\n this.items = _.orderBy(this.items, _.keys(sortQuery), _.map(_.values(sortQuery), value => { return value > 0 ? 'asc' : 'desc' }))\r\n }\r\n } else {\r\n this.items = response.data\r\n }\r\n this.nbTotalItems = response.total\r\n this.$emit('collection-refreshed', this.items)\r\n }, error => {\r\n this.$events.$emit('error', error)\r\n })\r\n },\r\n unsubscribe () {\r\n if (this.itemListener) {\r\n this.itemListener.unsubscribe()\r\n this.itemListener = null\r\n }\r\n },\r\n getCollectionBaseQuery () {\r\n // This method should be overriden in collections\r\n return {}\r\n },\r\n getCollectionFilterQuery () {\r\n // This method should be overriden in collections\r\n return {}\r\n },\r\n getCollectionPaginationQuery () {\r\n // This method can be overriden in collections\r\n if (this.nbItemsPerPage > 0) {\r\n return {\r\n $limit: this.nbItemsPerPage,\r\n $skip: (this.currentPage - 1) * this.nbItemsPerPage\r\n }\r\n } else return {}\r\n },\r\n resetCollection () {\r\n // Reset pagination and start again refreshing the collection\r\n this.items = []\r\n this.currentPage = 1\r\n this.refreshCollection()\r\n },\r\n onPageChanged () {\r\n this.refreshCollection()\r\n },\r\n onItemToggled (item, toggled) {\r\n this.$emit('toggle-changed', item, toggled)\r\n },\r\n onItemSelected (item, section) {\r\n this.$emit('selection-changed', item, section)\r\n },\r\n onItemsSelected (items) {\r\n this.$emit('selection-changed', items)\r\n },\r\n onItemsUpdated (items) {\r\n // When we append items some items of the previous pages might have been updated.\r\n // In this case we need to reset the full collection as Rx only tracks changes on the current page\r\n let updatedItems = (Array.isArray(items) ? items : [items])\r\n // We keep order from the updated list as depending on the sorting criteria a new item might have to be pushed on top of current items\r\n updatedItems = _.intersectionWith(this.items, updatedItems, (item1, item2) => (item1._id.toString() === item2._id.toString()))\r\n if (updatedItems.length > 0) this.resetCollection()\r\n }\r\n },\r\n created () {\r\n // Avoid initiating too much request as the same time, this might be the case\r\n // when async UI components update simultaneously the base/filter query\r\n // see https://github.com/kalisio/kdk/issues/432\r\n const refreshCollection = () => {\r\n // Add locale to perform sorting (i.e. collation) correctly w.r.t. user's language\r\n const fullQuery = Object.assign({ $locale: getLocale() },\r\n this.getCollectionBaseQuery(),\r\n this.getCollectionFilterQuery(),\r\n this.getCollectionPaginationQuery())\r\n // Find the desired items\r\n this.subscribe(fullQuery)\r\n }\r\n this.refreshCollection = _.throttle(refreshCollection, this.refreshThrottle, { leading: false })\r\n\r\n if (this.appendItems) {\r\n const service = this.getService()\r\n service.on('patched', this.onItemsUpdated)\r\n service.on('updated', this.onItemsUpdated)\r\n service.on('removed', this.onItemsUpdated)\r\n }\r\n },\r\n beforeDestroy () {\r\n this.unsubscribe()\r\n if (this.appendItems) {\r\n const service = this.getService()\r\n service.off('patched', this.onItemsUpdated)\r\n service.off('updated', this.onItemsUpdated)\r\n service.off('removed', this.onItemsUpdated)\r\n }\r\n }\r\n}\r\n\r\nexport default baseCollectionMixin\r\n"]}
@@ -19,7 +19,7 @@ const baseContextMixin = {
19
19
  };
20
20
  },
21
21
  watch: {
22
- '$route'(to, from) {
22
+ $route(to, from) {
23
23
  // React to route changes but reusing the same component as this one is generic
24
24
  this.refreshContext();
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/mixins/mixin.base-context.js"],"names":["baseContextMixin","props","contextId","type","String","default","data","contextLoaded","watch","to","from","refreshContext","methods","clearContext","$store","set","setContext","context","get","_id","service","created","$api","getService","$config","beforeDestroy"],"mappings":";;;;;;;;AAAA,MAAMA,mBAAmB;AACvBC,SAAO;AACLC,eAAW;AACTC,YAAMC,MADG;AAETC,eAAS;AAFA;AADN,GADgB;AAOvBC,SAAQ;AACN,WAAO;AACLC,qBAAe;AADV,KAAP;AAGD,GAXsB;AAYvBC,SAAO;AACL,aAAUC,EAAV,EAAcC,IAAd,EAAoB;AAClB;AACA,WAAKC,cAAL;AACD;AAJI,GAZgB;AAkBvBC,WAAS;AACPC,mBAAgB;AACd,WAAKC,MAAL,CAAYC,GAAZ,CAAgB,SAAhB,EAA2B,IAA3B;AACA,WAAKR,aAAL,GAAqB,KAArB;AACD,KAJM;AAKPS,eAAYC,OAAZ,EAAqB;AACnB;AACA,WAAKH,MAAL,CAAYC,GAAZ,CAAgB,SAAhB,EAA2BE,OAA3B;AACA,WAAKV,aAAL,GAAqB,IAArB;AACD,KATM;AAUDI,kBAAN,GAAwB;AAAA;;AAAA;AACtB,YAAI,MAAKT,SAAT,EAAoB;AAClB;AACA,cAAIe,UAAU,MAAKH,MAAL,CAAYI,GAAZ,CAAgB,SAAhB,CAAd;AACA,cAAID,WAAWA,QAAQE,GAAR,KAAgB,MAAKjB,SAApC,EAA+C;AAC7C;AACD;AACD;AACA,gBAAKW,YAAL;AACA;AACAI,oBAAU,MAAM,MAAKG,OAAL,CAAaF,GAAb,CAAiB,MAAKhB,SAAtB,CAAhB;AACA,gBAAKc,UAAL,CAAgBC,OAAhB;AACD,SAXD,MAWO;AACL,gBAAKJ,YAAL;AACD;AAdqB;AAevB;AAzBM,GAlBc;AA6CvBQ,YAAW;AACT,SAAKD,OAAL,GAAe,KAAKE,IAAL,CAAUC,UAAV,CAAqB,KAAKC,OAAL,CAAa,iBAAb,CAArB,CAAf;AACA;AACA,SAAKb,cAAL;AACD,GAjDsB;AAkDvBc,kBAAiB;AACf,SAAKZ,YAAL;AACD;AApDsB,CAAzB;;kBAuDeb,gB","file":"mixin.base-context.js","sourcesContent":["const baseContextMixin = {\r\n props: {\r\n contextId: {\r\n type: String,\r\n default: ''\r\n }\r\n },\r\n data () {\r\n return {\r\n contextLoaded: false\r\n }\r\n },\r\n watch: {\r\n '$route' (to, from) {\r\n // React to route changes but reusing the same component as this one is generic\r\n this.refreshContext()\r\n }\r\n },\r\n methods: {\r\n clearContext () {\r\n this.$store.set('context', null)\r\n this.contextLoaded = false\r\n },\r\n setContext (context) {\r\n // Set context in store so that contextual services are aware of it\r\n this.$store.set('context', context)\r\n this.contextLoaded = true\r\n },\r\n async refreshContext () {\r\n if (this.contextId) {\r\n // Context already set ?\r\n let context = this.$store.get('context')\r\n if (context && context._id === this.contextId) {\r\n return\r\n }\r\n // Otherwise clear so that underlying components will be destroyed\r\n this.clearContext()\r\n // Then update the context\r\n context = await this.service.get(this.contextId)\r\n this.setContext(context)\r\n } else {\r\n this.clearContext()\r\n }\r\n }\r\n },\r\n created () {\r\n this.service = this.$api.getService(this.$config('context.service'))\r\n // Register the context\r\n this.refreshContext()\r\n },\r\n beforeDestroy () {\r\n this.clearContext()\r\n }\r\n}\r\n\r\nexport default baseContextMixin\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/mixins/mixin.base-context.js"],"names":["baseContextMixin","props","contextId","type","String","default","data","contextLoaded","watch","$route","to","from","refreshContext","methods","clearContext","$store","set","setContext","context","get","_id","service","created","$api","getService","$config","beforeDestroy"],"mappings":";;;;;;;;AAAA,MAAMA,mBAAmB;AACvBC,SAAO;AACLC,eAAW;AACTC,YAAMC,MADG;AAETC,eAAS;AAFA;AADN,GADgB;AAOvBC,SAAQ;AACN,WAAO;AACLC,qBAAe;AADV,KAAP;AAGD,GAXsB;AAYvBC,SAAO;AACLC,WAAQC,EAAR,EAAYC,IAAZ,EAAkB;AAChB;AACA,WAAKC,cAAL;AACD;AAJI,GAZgB;AAkBvBC,WAAS;AACPC,mBAAgB;AACd,WAAKC,MAAL,CAAYC,GAAZ,CAAgB,SAAhB,EAA2B,IAA3B;AACA,WAAKT,aAAL,GAAqB,KAArB;AACD,KAJM;AAKPU,eAAYC,OAAZ,EAAqB;AACnB;AACA,WAAKH,MAAL,CAAYC,GAAZ,CAAgB,SAAhB,EAA2BE,OAA3B;AACA,WAAKX,aAAL,GAAqB,IAArB;AACD,KATM;AAUDK,kBAAN,GAAwB;AAAA;;AAAA;AACtB,YAAI,MAAKV,SAAT,EAAoB;AAClB;AACA,cAAIgB,UAAU,MAAKH,MAAL,CAAYI,GAAZ,CAAgB,SAAhB,CAAd;AACA,cAAID,WAAWA,QAAQE,GAAR,KAAgB,MAAKlB,SAApC,EAA+C;AAC7C;AACD;AACD;AACA,gBAAKY,YAAL;AACA;AACAI,oBAAU,MAAM,MAAKG,OAAL,CAAaF,GAAb,CAAiB,MAAKjB,SAAtB,CAAhB;AACA,gBAAKe,UAAL,CAAgBC,OAAhB;AACD,SAXD,MAWO;AACL,gBAAKJ,YAAL;AACD;AAdqB;AAevB;AAzBM,GAlBc;AA6CvBQ,YAAW;AACT,SAAKD,OAAL,GAAe,KAAKE,IAAL,CAAUC,UAAV,CAAqB,KAAKC,OAAL,CAAa,iBAAb,CAArB,CAAf;AACA;AACA,SAAKb,cAAL;AACD,GAjDsB;AAkDvBc,kBAAiB;AACf,SAAKZ,YAAL;AACD;AApDsB,CAAzB;;kBAuDed,gB","file":"mixin.base-context.js","sourcesContent":["const baseContextMixin = {\r\n props: {\r\n contextId: {\r\n type: String,\r\n default: ''\r\n }\r\n },\r\n data () {\r\n return {\r\n contextLoaded: false\r\n }\r\n },\r\n watch: {\r\n $route (to, from) {\r\n // React to route changes but reusing the same component as this one is generic\r\n this.refreshContext()\r\n }\r\n },\r\n methods: {\r\n clearContext () {\r\n this.$store.set('context', null)\r\n this.contextLoaded = false\r\n },\r\n setContext (context) {\r\n // Set context in store so that contextual services are aware of it\r\n this.$store.set('context', context)\r\n this.contextLoaded = true\r\n },\r\n async refreshContext () {\r\n if (this.contextId) {\r\n // Context already set ?\r\n let context = this.$store.get('context')\r\n if (context && context._id === this.contextId) {\r\n return\r\n }\r\n // Otherwise clear so that underlying components will be destroyed\r\n this.clearContext()\r\n // Then update the context\r\n context = await this.service.get(this.contextId)\r\n this.setContext(context)\r\n } else {\r\n this.clearContext()\r\n }\r\n }\r\n },\r\n created () {\r\n this.service = this.$api.getService(this.$config('context.service'))\r\n // Register the context\r\n this.refreshContext()\r\n },\r\n beforeDestroy () {\r\n this.clearContext()\r\n }\r\n}\r\n\r\nexport default baseContextMixin\r\n"]}
@@ -22,15 +22,15 @@ function baseEditorMixin(formRefs) {
22
22
  props: {
23
23
  baseObject: {
24
24
  type: Object,
25
- default: function () {
26
- return {};
27
- }
25
+ default: () => {}
28
26
  },
29
27
  baseQuery: {
30
28
  type: Object,
31
- default: function () {
32
- return {};
33
- }
29
+ default: () => {}
30
+ },
31
+ schemaName: {
32
+ type: String,
33
+ default: undefined
34
34
  },
35
35
  clearButton: {
36
36
  type: String,
@@ -83,7 +83,7 @@ function baseEditorMixin(formRefs) {
83
83
  if (form.loadRefs().isFulfilled()) {
84
84
  if (this.getObject()) {
85
85
  if (this.perspective !== '') {
86
- form.fill(this.getObject()[this.perspective]);
86
+ form.fill(_lodash2.default.get(this.getObject(), this.perspective));
87
87
  } else {
88
88
  form.fill(this.getObject());
89
89
  }
@@ -183,7 +183,11 @@ function baseEditorMixin(formRefs) {
183
183
  const object = {};
184
184
  const baseObject = this.getObject() || this.baseObject;
185
185
  if (this.perspective !== '') {
186
- Object.assign(object, _lodash2.default.get(baseObject, this.perspective));
186
+ if (this.perspectiveAsObject) {
187
+ Object.assign(object, _lodash2.default.get(baseObject, this.perspective));
188
+ } else {
189
+ _lodash2.default.set(object, this.perspective, _lodash2.default.get(baseObject, this.perspective));
190
+ }
187
191
  // Keep track of ID as it is used to know if we update or create
188
192
  if (baseObject._id) object._id = baseObject._id;
189
193
  } else {
@@ -195,14 +199,18 @@ function baseEditorMixin(formRefs) {
195
199
  // Start from default query
196
200
  const query = {};
197
201
  Object.assign(query, this.baseQuery);
198
- if (this.getMode() === 'update' && this.perspective !== '') {
202
+ if (this.getMode() === 'update' && this.perspective && this.perspectiveAsObject) {
199
203
  Object.assign(query, { $select: ['_id', this.perspective] });
200
204
  }
201
205
  return query;
202
206
  },
203
207
  getSchemaName() {
208
+ if (this.schemaName) return this.schemaName;
209
+ // Can be provided as route metadata
210
+ let schemaName = _lodash2.default.get(this.$route, 'meta.schemaName');
211
+ if (schemaName) return schemaName;
204
212
  // When used with a service by default use the same name for schema as for service
205
- let schemaName = this.service + (this.objectId ? '.update' : '.create');
213
+ schemaName = this.service + (this.objectId ? '.update' : '.create');
206
214
  if (this.perspective) {
207
215
  schemaName += '-' + this.perspective;
208
216
  }
@@ -244,18 +252,22 @@ function baseEditorMixin(formRefs) {
244
252
  // Editing mode => patch the item
245
253
  if (_this3.perspective !== '') {
246
254
  const data = {};
247
- data[_this3.perspective] = _lodash2.default.omit(object, ['_id']);
248
- const response = yield _this3.servicePatch(_this3.objectId, data, { query });
255
+ if (_this3.perspectiveAsObject) {
256
+ _lodash2.default.set(data, _this3.perspective, _lodash2.default.omit(object, ['_id']));
257
+ } else {
258
+ _lodash2.default.set(data, _this3.perspective, _lodash2.default.get(object, _this3.perspective));
259
+ }
260
+ const response = yield _this3.getService().patch(_this3.objectId, data, { query });
249
261
  // Keep track of ID as it is used to know if we update or create
250
262
  if (object._id) response._id = object._id;
251
263
  onServiceResponse(response);
252
264
  } else {
253
- const response = yield _this3.servicePatch(_this3.objectId, object, { query });
265
+ const response = yield _this3.getService().patch(_this3.objectId, object, { query });
254
266
  onServiceResponse(response);
255
267
  }
256
268
  } else if (_this3.getMode() === 'create') {
257
269
  // Creation mode => create the item
258
- const response = yield _this3.serviceCreate(object, { query });
270
+ const response = yield _this3.getService().create(object, { query });
259
271
  onServiceResponse(response);
260
272
  } else {
261
273
  _loglevel2.default.warn('Invalid editor mode');
@@ -272,8 +284,6 @@ function baseEditorMixin(formRefs) {
272
284
  var _this4 = this;
273
285
 
274
286
  return _asyncToGenerator(function* () {
275
- // When the service is available
276
- yield _this4.loadService();
277
287
  // We can then load the schema/object and local refs in parallel
278
288
  yield Promise.all([_this4.loadSchema(_this4.getSchemaName()), _this4.loadObject(), _this4.loadRefs()]);
279
289
  // We finally build the forms then fill it
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/mixins/mixin.base-editor.js"],"names":["baseEditorMixin","formRefs","props","baseObject","type","Object","default","baseQuery","clearButton","String","resetButton","computed","editorTitle","getSchema","schemaTitle","title","$t","object","getObject","interpolation","escapeValue","data","applyButton","applyInProgress","methods","getMode","objectId","setFormDisabled","formName","disabled","forEach","name","form","$refs","loadRefs","isFulfilled","isDisabled","logger","warn","fillEditor","perspective","fill","clear","reset","validateForms","isValid","result","validate","applyForms","isApplied","i","length","apply","error","submittedForms","submitted","getBaseObject","assign","_","get","_id","getBaseQuery","query","$select","getSchemaName","schemaName","service","getService","onServiceResponse","response","$emit","omit","servicePatch","serviceCreate","refresh","loadService","Promise","all","loadSchema","loadObject","map","build"],"mappings":"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","file":"mixin.base-editor.js","sourcesContent":["import logger from 'loglevel'\r\nimport _ from 'lodash'\r\n\r\nexport default function baseEditorMixin (formRefs) {\r\n return {\r\n props: {\r\n baseObject: {\r\n type: Object,\r\n default: function () {\r\n return {}\r\n }\r\n },\r\n baseQuery: {\r\n type: Object,\r\n default: function () {\r\n return {}\r\n }\r\n },\r\n clearButton: {\r\n type: String,\r\n default: ''\r\n },\r\n resetButton: {\r\n type: String,\r\n default: ''\r\n }\r\n },\r\n computed: {\r\n editorTitle () {\r\n // Retuns the schema title\r\n if (this.getSchema()) {\r\n const schemaTitle = this.getSchema().title\r\n return this.$t(schemaTitle, { object: this.getObject(), interpolation: { escapeValue: false } })\r\n }\r\n return ''\r\n }\r\n },\r\n data () {\r\n return {\r\n applyButton: '',\r\n applyInProgress: false\r\n }\r\n },\r\n methods: {\r\n getMode () {\r\n if (this.objectId) return 'update'\r\n return 'create'\r\n },\r\n // Disabled forms will not be applied\r\n setFormDisabled (formName, disabled) {\r\n // Iterate over forms\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (name === formName) {\r\n if (form.loadRefs().isFulfilled()) {\r\n form.isDisabled = disabled\r\n } else {\r\n logger.warn(`Trying to disable in the editor a non-ready form named ${name}`)\r\n }\r\n }\r\n })\r\n },\r\n fillEditor () {\r\n // Iterate over forms\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (form.loadRefs().isFulfilled()) {\r\n if (this.getObject()) {\r\n if (this.perspective !== '') {\r\n form.fill(this.getObject()[this.perspective])\r\n } else {\r\n form.fill(this.getObject())\r\n }\r\n } else {\r\n form.clear()\r\n }\r\n } else {\r\n logger.warn(`Trying to fill the editor with a non-ready form named ${name}`)\r\n }\r\n })\r\n // Update button accordingly\r\n if (this.getMode() === 'update') {\r\n this.applyButton = this.$t('UPDATE')\r\n } else {\r\n this.applyButton = this.$t('CREATE')\r\n }\r\n },\r\n clear () {\r\n // Iterate over forms\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (form.loadRefs().isFulfilled()) {\r\n form.clear()\r\n } else {\r\n logger.warn(`Trying to clear the editor with a non-ready form named ${name}`)\r\n }\r\n })\r\n },\r\n reset () {\r\n this.fillEditor()\r\n },\r\n validateForms () {\r\n // Iterate over forms for validation\r\n let isValid = true\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (form.loadRefs().isFulfilled()) {\r\n if (!form.isDisabled) {\r\n const result = form.validate()\r\n if (!result.isValid) {\r\n isValid = false\r\n }\r\n }\r\n } else {\r\n logger.warn(`Trying to apply the editor with a non-ready form named ${name}`)\r\n isValid = false\r\n }\r\n })\r\n return isValid\r\n },\r\n async applyForms (object) {\r\n // Apply each form\r\n let isApplied = true\r\n for (let i = 0; i < formRefs.length; i++) {\r\n const name = formRefs[i]\r\n const form = this.$refs[name]\r\n if (!form.isDisabled) {\r\n try {\r\n await form.apply(object)\r\n } catch (error) {\r\n isApplied = false\r\n break\r\n }\r\n }\r\n }\r\n return isApplied\r\n },\r\n async submittedForms (object) {\r\n // Apply each form\r\n let isApplied = true\r\n for (let i = 0; i < formRefs.length; i++) {\r\n const name = formRefs[i]\r\n const form = this.$refs[name]\r\n if (!form.isDisabled) {\r\n try {\r\n await form.submitted(object)\r\n } catch (error) {\r\n isApplied = false\r\n break\r\n }\r\n }\r\n }\r\n return isApplied\r\n },\r\n getBaseObject () {\r\n // Start from default object or input base object\r\n // This is used to keep track of existing or additional \"hidden\" or \"internal\" properties\r\n // in addition to the ones edited throught the form\r\n const object = {}\r\n const baseObject = this.getObject() || this.baseObject\r\n if (this.perspective !== '') {\r\n Object.assign(object, _.get(baseObject, this.perspective))\r\n // Keep track of ID as it is used to know if we update or create\r\n if (baseObject._id) object._id = baseObject._id\r\n } else {\r\n Object.assign(object, baseObject)\r\n }\r\n return object\r\n },\r\n getBaseQuery () {\r\n // Start from default query\r\n const query = {}\r\n Object.assign(query, this.baseQuery)\r\n if ((this.getMode() === 'update') && (this.perspective !== '')) {\r\n Object.assign(query, { $select: ['_id', this.perspective] })\r\n }\r\n return query\r\n },\r\n getSchemaName () {\r\n // When used with a service by default use the same name for schema as for service\r\n let schemaName = this.service + (this.objectId ? '.update' : '.create')\r\n if (this.perspective) {\r\n schemaName += ('-' + this.perspective)\r\n }\r\n return schemaName\r\n },\r\n async apply () {\r\n let isValid = this.validateForms()\r\n // Now the form is validated apply it to the target object\r\n const object = this.getBaseObject()\r\n\r\n if (isValid) {\r\n isValid = await this.applyForms(object)\r\n } else {\r\n // Stop here if invalid or not applied correctly\r\n return\r\n }\r\n\r\n if (this.getService()) {\r\n // Small helper to avoid repeating too much similar code\r\n const onServiceResponse = async (response) => {\r\n await this.submittedForms(response)\r\n this.$emit('applied', response)\r\n }\r\n\r\n const query = this.getBaseQuery(object)\r\n this.applyInProgress = true\r\n // Update the item\r\n try {\r\n if (this.getMode() === 'update') {\r\n // Editing mode => patch the item\r\n if (this.perspective !== '') {\r\n const data = {}\r\n data[this.perspective] = _.omit(object, ['_id'])\r\n const response = await this.servicePatch(this.objectId, data, { query })\r\n // Keep track of ID as it is used to know if we update or create\r\n if (object._id) response._id = object._id\r\n onServiceResponse(response)\r\n } else {\r\n const response = await this.servicePatch(this.objectId, object, { query })\r\n onServiceResponse(response)\r\n }\r\n } else if (this.getMode() === 'create') {\r\n // Creation mode => create the item\r\n const response = await this.serviceCreate(object, { query })\r\n onServiceResponse(response)\r\n } else {\r\n logger.warn('Invalid editor mode')\r\n }\r\n } catch (error) {\r\n // User error message on operation should be raised by error hook, otherwise this is more a coding error\r\n logger.error(error)\r\n }\r\n this.applyInProgress = false\r\n }\r\n },\r\n async refresh () {\r\n // When the service is available\r\n await this.loadService()\r\n // We can then load the schema/object and local refs in parallel\r\n await Promise.all([\r\n this.loadSchema(this.getSchemaName()),\r\n this.loadObject(),\r\n this.loadRefs()\r\n ])\r\n // We finally build the forms then fill it\r\n await Promise.all(formRefs.map(name => this.$refs[name].build()))\r\n this.fillEditor()\r\n this.$emit('editor-ready', this)\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/mixins/mixin.base-editor.js"],"names":["baseEditorMixin","formRefs","props","baseObject","type","Object","default","baseQuery","schemaName","String","undefined","clearButton","resetButton","computed","editorTitle","getSchema","schemaTitle","title","$t","object","getObject","interpolation","escapeValue","data","applyButton","applyInProgress","methods","getMode","objectId","setFormDisabled","formName","disabled","forEach","name","form","$refs","loadRefs","isFulfilled","isDisabled","logger","warn","fillEditor","perspective","fill","_","get","clear","reset","validateForms","isValid","result","validate","applyForms","isApplied","i","length","apply","error","submittedForms","submitted","getBaseObject","perspectiveAsObject","assign","set","_id","getBaseQuery","query","$select","getSchemaName","$route","service","getService","onServiceResponse","response","$emit","omit","patch","create","refresh","Promise","all","loadSchema","loadObject","map","build"],"mappings":"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","file":"mixin.base-editor.js","sourcesContent":["import logger from 'loglevel'\r\nimport _ from 'lodash'\r\n\r\nexport default function baseEditorMixin (formRefs) {\r\n return {\r\n props: {\r\n baseObject: {\r\n type: Object,\r\n default: () => {}\r\n },\r\n baseQuery: {\r\n type: Object,\r\n default: () => {}\r\n },\r\n schemaName: {\r\n type: String,\r\n default: undefined\r\n },\r\n clearButton: {\r\n type: String,\r\n default: ''\r\n },\r\n resetButton: {\r\n type: String,\r\n default: ''\r\n }\r\n },\r\n computed: {\r\n editorTitle () {\r\n // Retuns the schema title\r\n if (this.getSchema()) {\r\n const schemaTitle = this.getSchema().title\r\n return this.$t(schemaTitle, { object: this.getObject(), interpolation: { escapeValue: false } })\r\n }\r\n return ''\r\n }\r\n },\r\n data () {\r\n return {\r\n applyButton: '',\r\n applyInProgress: false\r\n }\r\n },\r\n methods: {\r\n getMode () {\r\n if (this.objectId) return 'update'\r\n return 'create'\r\n },\r\n // Disabled forms will not be applied\r\n setFormDisabled (formName, disabled) {\r\n // Iterate over forms\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (name === formName) {\r\n if (form.loadRefs().isFulfilled()) {\r\n form.isDisabled = disabled\r\n } else {\r\n logger.warn(`Trying to disable in the editor a non-ready form named ${name}`)\r\n }\r\n }\r\n })\r\n },\r\n fillEditor () {\r\n // Iterate over forms\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (form.loadRefs().isFulfilled()) {\r\n if (this.getObject()) {\r\n if (this.perspective !== '') {\r\n form.fill(_.get(this.getObject(), this.perspective))\r\n } else {\r\n form.fill(this.getObject())\r\n }\r\n } else {\r\n form.clear()\r\n }\r\n } else {\r\n logger.warn(`Trying to fill the editor with a non-ready form named ${name}`)\r\n }\r\n })\r\n // Update button accordingly\r\n if (this.getMode() === 'update') {\r\n this.applyButton = this.$t('UPDATE')\r\n } else {\r\n this.applyButton = this.$t('CREATE')\r\n }\r\n },\r\n clear () {\r\n // Iterate over forms\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (form.loadRefs().isFulfilled()) {\r\n form.clear()\r\n } else {\r\n logger.warn(`Trying to clear the editor with a non-ready form named ${name}`)\r\n }\r\n })\r\n },\r\n reset () {\r\n this.fillEditor()\r\n },\r\n validateForms () {\r\n // Iterate over forms for validation\r\n let isValid = true\r\n formRefs.forEach(name => {\r\n const form = this.$refs[name]\r\n if (form.loadRefs().isFulfilled()) {\r\n if (!form.isDisabled) {\r\n const result = form.validate()\r\n if (!result.isValid) {\r\n isValid = false\r\n }\r\n }\r\n } else {\r\n logger.warn(`Trying to apply the editor with a non-ready form named ${name}`)\r\n isValid = false\r\n }\r\n })\r\n return isValid\r\n },\r\n async applyForms (object) {\r\n // Apply each form\r\n let isApplied = true\r\n for (let i = 0; i < formRefs.length; i++) {\r\n const name = formRefs[i]\r\n const form = this.$refs[name]\r\n if (!form.isDisabled) {\r\n try {\r\n await form.apply(object)\r\n } catch (error) {\r\n isApplied = false\r\n break\r\n }\r\n }\r\n }\r\n return isApplied\r\n },\r\n async submittedForms (object) {\r\n // Apply each form\r\n let isApplied = true\r\n for (let i = 0; i < formRefs.length; i++) {\r\n const name = formRefs[i]\r\n const form = this.$refs[name]\r\n if (!form.isDisabled) {\r\n try {\r\n await form.submitted(object)\r\n } catch (error) {\r\n isApplied = false\r\n break\r\n }\r\n }\r\n }\r\n return isApplied\r\n },\r\n getBaseObject () {\r\n // Start from default object or input base object\r\n // This is used to keep track of existing or additional \"hidden\" or \"internal\" properties\r\n // in addition to the ones edited throught the form\r\n const object = {}\r\n const baseObject = this.getObject() || this.baseObject\r\n if (this.perspective !== '') {\r\n if (this.perspectiveAsObject) {\r\n Object.assign(object, _.get(baseObject, this.perspective))\r\n } else {\r\n _.set(object, this.perspective, _.get(baseObject, this.perspective))\r\n }\r\n // Keep track of ID as it is used to know if we update or create\r\n if (baseObject._id) object._id = baseObject._id\r\n } else {\r\n Object.assign(object, baseObject)\r\n }\r\n return object\r\n },\r\n getBaseQuery () {\r\n // Start from default query\r\n const query = {}\r\n Object.assign(query, this.baseQuery)\r\n if ((this.getMode() === 'update') && this.perspective && this.perspectiveAsObject) {\r\n Object.assign(query, { $select: ['_id', this.perspective] })\r\n }\r\n return query\r\n },\r\n getSchemaName () {\r\n if (this.schemaName) return this.schemaName\r\n // Can be provided as route metadata\r\n let schemaName = _.get(this.$route, 'meta.schemaName')\r\n if (schemaName) return schemaName\r\n // When used with a service by default use the same name for schema as for service\r\n schemaName = this.service + (this.objectId ? '.update' : '.create')\r\n if (this.perspective) {\r\n schemaName += ('-' + this.perspective)\r\n }\r\n return schemaName\r\n },\r\n async apply () {\r\n let isValid = this.validateForms()\r\n // Now the form is validated apply it to the target object\r\n const object = this.getBaseObject()\r\n\r\n if (isValid) {\r\n isValid = await this.applyForms(object)\r\n } else {\r\n // Stop here if invalid or not applied correctly\r\n return\r\n }\r\n\r\n if (this.getService()) {\r\n // Small helper to avoid repeating too much similar code\r\n const onServiceResponse = async (response) => {\r\n await this.submittedForms(response)\r\n this.$emit('applied', response)\r\n }\r\n\r\n const query = this.getBaseQuery(object)\r\n this.applyInProgress = true\r\n // Update the item\r\n try {\r\n if (this.getMode() === 'update') {\r\n // Editing mode => patch the item\r\n if (this.perspective !== '') {\r\n const data = {}\r\n if (this.perspectiveAsObject) {\r\n _.set(data, this.perspective, _.omit(object, ['_id']))\r\n } else {\r\n _.set(data, this.perspective, _.get(object, this.perspective))\r\n }\r\n const response = await this.getService().patch(this.objectId, data, { query })\r\n // Keep track of ID as it is used to know if we update or create\r\n if (object._id) response._id = object._id\r\n onServiceResponse(response)\r\n } else {\r\n const response = await this.getService().patch(this.objectId, object, { query })\r\n onServiceResponse(response)\r\n }\r\n } else if (this.getMode() === 'create') {\r\n // Creation mode => create the item\r\n const response = await this.getService().create(object, { query })\r\n onServiceResponse(response)\r\n } else {\r\n logger.warn('Invalid editor mode')\r\n }\r\n } catch (error) {\r\n // User error message on operation should be raised by error hook, otherwise this is more a coding error\r\n logger.error(error)\r\n }\r\n this.applyInProgress = false\r\n }\r\n },\r\n async refresh () {\r\n // We can then load the schema/object and local refs in parallel\r\n await Promise.all([\r\n this.loadSchema(this.getSchemaName()),\r\n this.loadObject(),\r\n this.loadRefs()\r\n ])\r\n // We finally build the forms then fill it\r\n await Promise.all(formRefs.map(name => this.$refs[name].build()))\r\n this.fillEditor()\r\n this.$emit('editor-ready', this)\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -28,10 +28,6 @@ const baseFieldMixin = {
28
28
  type: Boolean,
29
29
  default: false
30
30
  },
31
- display: {
32
- type: Object,
33
- required: true
34
- },
35
31
  readOnly: {
36
32
  type: Boolean,
37
33
  default: false
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../core/client/mixins/mixin.base-field.js"],"names":["baseFieldMixin","props","values","type","Object","default","properties","required","Boolean","display","readOnly","computed","label","_","get","field","$i18n","i18next","exists","$t","helper","hasError","isEmpty","error","errorLabel","disabled","data","model","emptyModel","watch","updateValue","name","clear","methods","value","isNil","fill","isEqual","validate","invalidate","onChanged","$nextTick","$emit","apply","object","set","submitted","created"],"mappings":"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","file":"mixin.base-field.js","sourcesContent":["import _ from 'lodash'\r\n\r\nconst baseFieldMixin = {\r\n props: {\r\n values: {\r\n type: Object,\r\n default: () => { return null }\r\n },\r\n properties: {\r\n type: Object,\r\n required: true\r\n },\r\n required: {\r\n type: Boolean,\r\n default: false\r\n },\r\n display: {\r\n type: Object,\r\n required: true\r\n },\r\n readOnly: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n computed: {\r\n label () {\r\n // Check if we have a translation key or directly the label content\r\n const label = _.get(this.properties.field, 'label', '')\r\n return (this.$i18n.i18next.exists(label) ? this.$t(label) : label)\r\n },\r\n helper () {\r\n // Check if we have a translation key or directly the helper content\r\n const helper = _.get(this.properties.field, 'helper', '')\r\n return (this.$i18n.i18next.exists(helper) ? this.$t(helper) : helper)\r\n },\r\n hasError () {\r\n return !_.isEmpty(this.error)\r\n },\r\n errorLabel () {\r\n // Check for overriden error label\r\n let error = _.get(this.properties.field, 'errorLabel', '')\r\n // If not use default validator error messages\r\n if (!error) error = this.error\r\n // Else check if we have a translation key or directly the error content\r\n return (this.$i18n.i18next.exists(error) ? this.$t(error) : error)\r\n },\r\n disabled () {\r\n return _.get(this.properties.field, 'disabled', false)\r\n }\r\n },\r\n data () {\r\n return {\r\n // The model to used for data binding with the field\r\n model: this.emptyModel(),\r\n // The error message\r\n error: ''\r\n }\r\n },\r\n watch: {\r\n values: function () {\r\n if (this.values) this.updateValue(_.get(this.values, this.properties.name))\r\n else this.clear()\r\n }\r\n },\r\n methods: {\r\n updateValue (value) {\r\n if (_.isNil(value)) this.clear()\r\n else this.fill(value)\r\n },\r\n emptyModel () {\r\n return ''\r\n },\r\n isEmpty () {\r\n return _.isEqual(this.model, this.emptyModel())\r\n },\r\n value () {\r\n return this.model\r\n },\r\n fill (value) {\r\n this.model = value\r\n this.error = ''\r\n },\r\n clear () {\r\n this.fill(_.get(this.properties, 'default', this.emptyModel()))\r\n },\r\n validate () {\r\n this.error = ''\r\n },\r\n invalidate (error) {\r\n this.error = error\r\n },\r\n async onChanged () {\r\n // Tell the form that this field has a new value.\r\n // Consequently the form will validate or invalidate the field\r\n // Warning: This method must be called once the form is mounted\r\n // We need to force a refresh so that the model is correctly updated by Vuejs\r\n await this.$nextTick()\r\n this.$emit('field-changed', this.properties.name, this.model)\r\n },\r\n apply (object, field) {\r\n // To be overloaded if you need to perform specific operations before the form has been submitted\r\n // By default simply set the current value on the given object field to apply the form\r\n _.set(object, field, this.value())\r\n },\r\n submitted (object, field) {\r\n // To be overloaded if you need to perform specific operations after the form has been submitted\r\n }\r\n },\r\n created () {\r\n if (this.values) this.updateValue(_.get(this.values, this.properties.name))\r\n }\r\n}\r\n\r\nexport default baseFieldMixin\r\n"]}
1
+ {"version":3,"sources":["../../../../core/client/mixins/mixin.base-field.js"],"names":["baseFieldMixin","props","values","type","Object","default","properties","required","Boolean","readOnly","computed","label","_","get","field","$i18n","i18next","exists","$t","helper","hasError","isEmpty","error","errorLabel","disabled","data","model","emptyModel","watch","updateValue","name","clear","methods","value","isNil","fill","isEqual","validate","invalidate","onChanged","$nextTick","$emit","apply","object","set","submitted","created"],"mappings":"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","file":"mixin.base-field.js","sourcesContent":["import _ from 'lodash'\r\n\r\nconst baseFieldMixin = {\r\n props: {\r\n values: {\r\n type: Object,\r\n default: () => { return null }\r\n },\r\n properties: {\r\n type: Object,\r\n required: true\r\n },\r\n required: {\r\n type: Boolean,\r\n default: false\r\n },\r\n readOnly: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n computed: {\r\n label () {\r\n // Check if we have a translation key or directly the label content\r\n const label = _.get(this.properties.field, 'label', '')\r\n return (this.$i18n.i18next.exists(label) ? this.$t(label) : label)\r\n },\r\n helper () {\r\n // Check if we have a translation key or directly the helper content\r\n const helper = _.get(this.properties.field, 'helper', '')\r\n return (this.$i18n.i18next.exists(helper) ? this.$t(helper) : helper)\r\n },\r\n hasError () {\r\n return !_.isEmpty(this.error)\r\n },\r\n errorLabel () {\r\n // Check for overriden error label\r\n let error = _.get(this.properties.field, 'errorLabel', '')\r\n // If not use default validator error messages\r\n if (!error) error = this.error\r\n // Else check if we have a translation key or directly the error content\r\n return (this.$i18n.i18next.exists(error) ? this.$t(error) : error)\r\n },\r\n disabled () {\r\n return _.get(this.properties.field, 'disabled', false)\r\n }\r\n },\r\n data () {\r\n return {\r\n // The model to used for data binding with the field\r\n model: this.emptyModel(),\r\n // The error message\r\n error: ''\r\n }\r\n },\r\n watch: {\r\n values: function () {\r\n if (this.values) this.updateValue(_.get(this.values, this.properties.name))\r\n else this.clear()\r\n }\r\n },\r\n methods: {\r\n updateValue (value) {\r\n if (_.isNil(value)) this.clear()\r\n else this.fill(value)\r\n },\r\n emptyModel () {\r\n return ''\r\n },\r\n isEmpty () {\r\n return _.isEqual(this.model, this.emptyModel())\r\n },\r\n value () {\r\n return this.model\r\n },\r\n fill (value) {\r\n this.model = value\r\n this.error = ''\r\n },\r\n clear () {\r\n this.fill(_.get(this.properties, 'default', this.emptyModel()))\r\n },\r\n validate () {\r\n this.error = ''\r\n },\r\n invalidate (error) {\r\n this.error = error\r\n },\r\n async onChanged () {\r\n // Tell the form that this field has a new value.\r\n // Consequently the form will validate or invalidate the field\r\n // Warning: This method must be called once the form is mounted\r\n // We need to force a refresh so that the model is correctly updated by Vuejs\r\n await this.$nextTick()\r\n this.$emit('field-changed', this.properties.name, this.model)\r\n },\r\n apply (object, field) {\r\n // To be overloaded if you need to perform specific operations before the form has been submitted\r\n // By default simply set the current value on the given object field to apply the form\r\n _.set(object, field, this.value())\r\n },\r\n submitted (object, field) {\r\n // To be overloaded if you need to perform specific operations after the form has been submitted\r\n }\r\n },\r\n created () {\r\n if (this.values) this.updateValue(_.get(this.values, this.properties.name))\r\n }\r\n}\r\n\r\nexport default baseFieldMixin\r\n"]}
@@ -60,19 +60,13 @@ exports.default = {
60
60
  },
61
61
  computed: {
62
62
  name() {
63
- return this.getName();
63
+ return _lodash2.default.get(this.item, this.options.nameField || 'name', '');
64
64
  },
65
65
  description() {
66
- return this.getDescription();
66
+ return _lodash2.default.get(this.item, this.options.descriptionField || 'description', '');
67
67
  }
68
68
  },
69
69
  methods: {
70
- getName() {
71
- return _lodash2.default.get(this.item, this.options.nameField || 'name', '');
72
- },
73
- getDescription() {
74
- return _lodash2.default.get(this.item, this.options.descriptionField || 'description', '');
75
- },
76
70
  setActions(actions) {
77
71
  // As context is different for each item we need to clone the global action configuration
78
72
  // otheriwse context will always reference the last processed item
@@ -90,21 +84,42 @@ exports.default = {
90
84
  const actions = this.filteredActions();
91
85
  if (actions && actions.length > 0) this.setActions(actions);else this.clearActions();
92
86
  },
87
+ onItemToggled(toggled) {
88
+ this.$emit('item-toggled', this.item, toggled);
89
+ },
93
90
  onItemSelected(section) {
94
91
  this.$emit('item-selected', this.item, section);
95
92
  },
93
+ canViewItem() {
94
+ return this.$can('read', this.service, this.contextId, this.item);
95
+ },
96
96
  viewItem() {
97
97
  const path = this.$route.fullPath + `/view/${this.item._id}`;
98
98
  this.$router.push(path);
99
99
  },
100
- editItem() {
101
- const path = this.$route.fullPath + `/edit/${this.item._id}`;
102
- this.$router.push(path);
100
+ canEditItem() {
101
+ return this.$can('update', this.service, this.contextId, this.item);
102
+ },
103
+ editItem(scope = undefined, properties = undefined) {
104
+ const route = this.$route;
105
+ let subPath = 'edit/' + this.item._id;
106
+ // Add trailing / if required (as sometimes it might be already present)
107
+ if (!route.path.endsWith('/')) subPath = `/${subPath}`;
108
+ if (scope) {
109
+ if (properties) subPath += `/${properties}`;else subPath += `/${scope}`;
110
+ }
111
+ this.$router.push({
112
+ path: route.path + subPath,
113
+ params: route.params,
114
+ query: route.query
115
+ });
116
+ },
117
+ canRemoveItem() {
118
+ return this.$can('remove', this.service, this.contextId, this.item);
103
119
  },
104
120
  removeItem(prompt) {
105
- if (!['none', 'confirm', 'input'].includes(prompt)) return;
106
121
  if (prompt === 'confirm' || prompt === 'input') {
107
- const name = this.getName();
122
+ const name = this.name;
108
123
  const input = {
109
124
  type: 'text',
110
125
  model: '',
@@ -132,7 +147,7 @@ exports.default = {
132
147
  }
133
148
  },
134
149
  exportItem() {
135
- const name = this.getName();
150
+ const name = this.name;
136
151
  const file = name + '.json';
137
152
  if ((0, _quasar.exportFile)(file, JSON.stringify(this.item))) {
138
153
  this.$toast({ type: 'error', message: this.$t('mixins.baseItem.ITEM_EXPORTED', { name, file }) });