@kalisio/kdk 2.6.3 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/core/api/application.js +2 -4
  2. package/core/api/authentication.js +2 -3
  3. package/core/api/db.js +10 -2
  4. package/core/api/hooks/hooks.authorisations.js +4 -2
  5. package/core/api/hooks/hooks.push.js +6 -2
  6. package/core/api/hooks/hooks.query.js +29 -12
  7. package/core/api/hooks/hooks.users.js +30 -17
  8. package/core/api/models/configurations.model.mongodb.js +4 -0
  9. package/core/api/services/authorisations/authorisations.service.js +1 -1
  10. package/core/api/services/configurations/configurations.hooks.js +33 -0
  11. package/core/api/services/index.js +41 -7
  12. package/core/api/services/messages/messages.hooks.js +9 -3
  13. package/core/client/api.js +14 -1
  14. package/core/client/capabilities.js +1 -6
  15. package/core/client/components/KAvatar.vue +24 -20
  16. package/core/client/components/account/KProfile.vue +10 -71
  17. package/core/client/components/account/index.js +0 -2
  18. package/core/client/components/app/KSettings.vue +1 -0
  19. package/core/client/components/collection/KBoard.vue +4 -3
  20. package/core/client/components/collection/KCardSection.vue +1 -0
  21. package/core/client/components/collection/KGrid.vue +2 -0
  22. package/core/client/components/collection/KTable.vue +5 -1
  23. package/core/client/components/collection/KTimeLine.vue +9 -1
  24. package/core/client/components/collection/index.js +0 -2
  25. package/core/client/components/form/KChipsField.vue +2 -1
  26. package/core/client/components/form/KEmailField.vue +1 -0
  27. package/core/client/components/form/KFileField.vue +22 -1
  28. package/core/client/components/form/KForm.vue +2 -0
  29. package/core/client/components/form/KItemField.vue +1 -0
  30. package/core/client/components/form/KNumberField.vue +1 -0
  31. package/core/client/components/form/KPasswordField.vue +1 -0
  32. package/core/client/components/form/KPhoneField.vue +1 -0
  33. package/core/client/components/form/KPropertyItemField.vue +1 -0
  34. package/core/client/components/form/KResolutionField.vue +1 -0
  35. package/core/client/components/form/KSelectField.vue +31 -0
  36. package/core/client/components/form/KTagField.vue +1 -0
  37. package/core/client/components/form/KTextField.vue +1 -0
  38. package/core/client/components/form/KTokenField.vue +1 -0
  39. package/core/client/components/form/KUnitField.vue +1 -0
  40. package/core/client/components/form/KUrlField.vue +1 -0
  41. package/core/client/components/graphics/KIcon.vue +3 -4
  42. package/core/client/components/layout/KPage.vue +1 -0
  43. package/core/client/components/layout/KWindow.vue +6 -3
  44. package/core/client/components/messages/KMessageComposer.vue +2 -1
  45. package/core/client/components/messages/KMessagesTimeLine.vue +1 -1
  46. package/core/client/components/time/KDate.vue +1 -2
  47. package/core/client/components/time/KDateTime.vue +11 -11
  48. package/core/client/components/time/KTime.vue +1 -1
  49. package/core/client/composables/collection.js +33 -8
  50. package/core/client/composables/errors.js +1 -1
  51. package/core/client/composables/layout.js +9 -9
  52. package/core/client/configurations.js +50 -0
  53. package/core/client/exporter.js +1 -1
  54. package/core/client/i18n/core_en.json +6 -39
  55. package/core/client/i18n/core_fr.json +6 -39
  56. package/core/client/index.js +2 -0
  57. package/core/client/layout.js +8 -8
  58. package/core/client/mixins/mixin.base-activity.js +5 -2
  59. package/core/client/mixins/mixin.base-field.js +3 -3
  60. package/core/client/search.js +2 -1
  61. package/core/client/utils/utils.collection.js +8 -8
  62. package/core/client/utils/utils.items.js +4 -0
  63. package/core/client/utils/utils.push.js +3 -3
  64. package/core/client/utils/utils.session.js +7 -5
  65. package/core/client/utils/utils.shapes.js +38 -7
  66. package/core/client/utils/utils.time.js +21 -22
  67. package/core/common/schemas/users.update-profile.json +3 -2
  68. package/coverage/core/api/application.js.html +1 -1
  69. package/coverage/core/api/authentication.js.html +1 -1
  70. package/coverage/core/api/db.js.html +1 -1
  71. package/coverage/core/api/hooks/hooks.authentication.js.html +1 -1
  72. package/coverage/core/api/hooks/hooks.authorisations.js.html +1 -1
  73. package/coverage/core/api/hooks/hooks.logger.js.html +1 -1
  74. package/coverage/core/api/hooks/hooks.model.js.html +1 -1
  75. package/coverage/core/api/hooks/hooks.push.js.html +22 -10
  76. package/coverage/core/api/hooks/hooks.query.js.html +33 -6
  77. package/coverage/core/api/hooks/hooks.schemas.js.html +1 -1
  78. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  79. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  80. package/coverage/core/api/hooks/hooks.tags.js.html +1 -1
  81. package/coverage/core/api/hooks/hooks.users.js.html +4 -4
  82. package/coverage/core/api/hooks/index.html +23 -23
  83. package/coverage/core/api/hooks/index.js.html +1 -1
  84. package/coverage/core/api/index.html +1 -1
  85. package/coverage/core/api/index.js.html +1 -1
  86. package/coverage/core/api/marshall.js.html +1 -1
  87. package/coverage/core/api/models/configurations.model.mongodb.js.html +1 -1
  88. package/coverage/core/api/models/index.html +1 -1
  89. package/coverage/core/api/models/messages.model.mongodb.js.html +1 -1
  90. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  91. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  92. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  93. package/coverage/core/api/services/account/account.service.js.html +1 -1
  94. package/coverage/core/api/services/account/index.html +1 -1
  95. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  96. package/coverage/core/api/services/authorisations/authorisations.service.js.html +1 -1
  97. package/coverage/core/api/services/authorisations/index.html +1 -1
  98. package/coverage/core/api/services/configurations/configurations.hooks.js.html +1 -1
  99. package/coverage/core/api/services/configurations/index.html +1 -1
  100. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  101. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  102. package/coverage/core/api/services/databases/index.html +1 -1
  103. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  104. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  105. package/coverage/core/api/services/import-export/index.html +1 -1
  106. package/coverage/core/api/services/index.html +1 -1
  107. package/coverage/core/api/services/index.js.html +1 -1
  108. package/coverage/core/api/services/mailer/index.html +1 -1
  109. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  110. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  111. package/coverage/core/api/services/messages/index.html +1 -1
  112. package/coverage/core/api/services/messages/messages.hooks.js.html +1 -1
  113. package/coverage/core/api/services/push/index.html +1 -1
  114. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  115. package/coverage/core/api/services/push/push.service.js.html +1 -1
  116. package/coverage/core/api/services/storage/index.html +1 -1
  117. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  118. package/coverage/core/api/services/storage/storage.service.js.html +1 -1
  119. package/coverage/core/api/services/tags/index.html +1 -1
  120. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  121. package/coverage/core/api/services/users/index.html +1 -1
  122. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  123. package/coverage/core/api/services/users/users.service.js.html +1 -1
  124. package/coverage/core/common/errors.js.html +1 -1
  125. package/coverage/core/common/index.html +1 -1
  126. package/coverage/core/common/index.js.html +1 -1
  127. package/coverage/core/common/permissions.js.html +1 -1
  128. package/coverage/core/common/schema.js.html +1 -1
  129. package/coverage/core/common/utils.js.html +1 -1
  130. package/coverage/core/common/utils.offline.js.html +1 -1
  131. package/coverage/index.html +17 -17
  132. package/coverage/lcov-report/core/api/application.js.html +1 -1
  133. package/coverage/lcov-report/core/api/authentication.js.html +1 -1
  134. package/coverage/lcov-report/core/api/db.js.html +1 -1
  135. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +1 -1
  136. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1 -1
  137. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +1 -1
  138. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +1 -1
  139. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +22 -10
  140. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +33 -6
  141. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +1 -1
  142. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  143. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  144. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +1 -1
  145. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +4 -4
  146. package/coverage/lcov-report/core/api/hooks/index.html +23 -23
  147. package/coverage/lcov-report/core/api/hooks/index.js.html +1 -1
  148. package/coverage/lcov-report/core/api/index.html +1 -1
  149. package/coverage/lcov-report/core/api/index.js.html +1 -1
  150. package/coverage/lcov-report/core/api/marshall.js.html +1 -1
  151. package/coverage/lcov-report/core/api/models/configurations.model.mongodb.js.html +1 -1
  152. package/coverage/lcov-report/core/api/models/index.html +1 -1
  153. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +1 -1
  154. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  155. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  156. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  157. package/coverage/lcov-report/core/api/services/account/account.service.js.html +1 -1
  158. package/coverage/lcov-report/core/api/services/account/index.html +1 -1
  159. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  160. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +1 -1
  161. package/coverage/lcov-report/core/api/services/authorisations/index.html +1 -1
  162. package/coverage/lcov-report/core/api/services/configurations/configurations.hooks.js.html +1 -1
  163. package/coverage/lcov-report/core/api/services/configurations/index.html +1 -1
  164. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  165. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  166. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  167. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  168. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  169. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  170. package/coverage/lcov-report/core/api/services/index.html +1 -1
  171. package/coverage/lcov-report/core/api/services/index.js.html +1 -1
  172. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  173. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  174. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  175. package/coverage/lcov-report/core/api/services/messages/index.html +1 -1
  176. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +1 -1
  177. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  178. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  179. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  180. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  181. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  182. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +1 -1
  183. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  184. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  185. package/coverage/lcov-report/core/api/services/users/index.html +1 -1
  186. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  187. package/coverage/lcov-report/core/api/services/users/users.service.js.html +1 -1
  188. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  189. package/coverage/lcov-report/core/common/index.html +1 -1
  190. package/coverage/lcov-report/core/common/index.js.html +1 -1
  191. package/coverage/lcov-report/core/common/permissions.js.html +1 -1
  192. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  193. package/coverage/lcov-report/core/common/utils.js.html +1 -1
  194. package/coverage/lcov-report/core/common/utils.offline.js.html +1 -1
  195. package/coverage/lcov-report/index.html +17 -17
  196. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  197. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  198. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +184 -4
  199. package/coverage/lcov-report/map/api/hooks/index.html +5 -5
  200. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  201. package/coverage/lcov-report/map/api/index.html +1 -1
  202. package/coverage/lcov-report/map/api/index.js.html +1 -1
  203. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  204. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  205. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  206. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  207. package/coverage/lcov-report/map/api/models/index.html +1 -1
  208. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  209. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +1 -1
  210. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  211. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  212. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  213. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  214. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  215. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  216. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  217. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +1 -1
  218. package/coverage/lcov-report/map/api/services/features/features.service.js.html +1 -1
  219. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  220. package/coverage/lcov-report/map/api/services/index.html +1 -1
  221. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  222. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  223. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  224. package/coverage/lcov-report/map/api/services/styles/index.html +1 -1
  225. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +1 -1
  226. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  227. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  228. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  229. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  230. package/coverage/lcov-report/map/common/index.html +1 -1
  231. package/coverage/lcov-report/map/common/index.js.html +1 -1
  232. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  233. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  234. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  235. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  236. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  237. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  238. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  239. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  240. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  241. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  242. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  243. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  244. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  245. package/coverage/lcov.info +358 -280
  246. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  247. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  248. package/coverage/map/api/hooks/hooks.query.js.html +184 -4
  249. package/coverage/map/api/hooks/index.html +5 -5
  250. package/coverage/map/api/hooks/index.js.html +1 -1
  251. package/coverage/map/api/index.html +1 -1
  252. package/coverage/map/api/index.js.html +1 -1
  253. package/coverage/map/api/marshall.js.html +1 -1
  254. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  255. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  256. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  257. package/coverage/map/api/models/index.html +1 -1
  258. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  259. package/coverage/map/api/models/styles.model.mongodb.js.html +1 -1
  260. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  261. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  262. package/coverage/map/api/services/alerts/index.html +1 -1
  263. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  264. package/coverage/map/api/services/catalog/index.html +1 -1
  265. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  266. package/coverage/map/api/services/daptiles/index.html +1 -1
  267. package/coverage/map/api/services/features/features.hooks.js.html +1 -1
  268. package/coverage/map/api/services/features/features.service.js.html +1 -1
  269. package/coverage/map/api/services/features/index.html +1 -1
  270. package/coverage/map/api/services/index.html +1 -1
  271. package/coverage/map/api/services/index.js.html +1 -1
  272. package/coverage/map/api/services/projects/index.html +1 -1
  273. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  274. package/coverage/map/api/services/styles/index.html +1 -1
  275. package/coverage/map/api/services/styles/styles.hooks.js.html +1 -1
  276. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  277. package/coverage/map/common/errors.js.html +1 -1
  278. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  279. package/coverage/map/common/grid.js.html +1 -1
  280. package/coverage/map/common/index.html +1 -1
  281. package/coverage/map/common/index.js.html +1 -1
  282. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  283. package/coverage/map/common/moment-utils.js.html +1 -1
  284. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  285. package/coverage/map/common/opendap-utils.js.html +1 -1
  286. package/coverage/map/common/permissions.js.html +1 -1
  287. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  288. package/coverage/map/common/tms-utils.js.html +1 -1
  289. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  290. package/coverage/map/common/wcs-utils.js.html +1 -1
  291. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  292. package/coverage/map/common/wfs-utils.js.html +1 -1
  293. package/coverage/map/common/wms-utils.js.html +1 -1
  294. package/coverage/map/common/wmts-utils.js.html +1 -1
  295. package/coverage/tmp/coverage-1028514-1773134124472-0.json +1 -0
  296. package/coverage/tmp/coverage-1028526-1773134124448-0.json +1 -0
  297. package/coverage/tmp/coverage-1028537-1773134124431-0.json +1 -0
  298. package/coverage/tmp/coverage-1028549-1773134124401-0.json +1 -0
  299. package/coverage/tmp/{coverage-222566-1765963609278-0.json → coverage-1028556-1773134124353-0.json} +1 -1
  300. package/extras/configs/widgets.top.js +3 -3
  301. package/extras/tests/core/collection.mjs +2 -9
  302. package/map/api/hooks/hooks.catalog.js +18 -4
  303. package/map/api/services/catalog/catalog.hooks.js +3 -0
  304. package/map/api/services/features/features.hooks.js +3 -1
  305. package/map/api/services/index.js +2 -6
  306. package/map/api/services/styles/styles.hooks.js +6 -1
  307. package/map/client/components/KFeatureActionButton.vue +9 -3
  308. package/map/client/components/KFeaturesFilterManager.vue +5 -5
  309. package/map/client/components/KFilterCondition.vue +17 -10
  310. package/map/client/components/KLayerEditor.vue +49 -39
  311. package/map/client/components/KMeasureTool.vue +7 -1
  312. package/map/client/components/KTimezoneMap.vue +29 -9
  313. package/map/client/components/catalog/KLayersPanel.vue +26 -16
  314. package/map/client/components/catalog/KLayersSelector.vue +13 -2
  315. package/map/client/components/catalog/KViewsPanel.vue +5 -4
  316. package/map/client/components/form/KSelectLayersField.vue +28 -17
  317. package/map/client/components/form/KSelectViewsField.vue +18 -9
  318. package/map/client/components/form/KTimezoneField.vue +1 -2
  319. package/map/client/components/legend/KVariablesLegend.vue +10 -1
  320. package/map/client/components/location/KLocationCardSection.vue +7 -2
  321. package/map/client/components/location/KLocationMap.vue +31 -7
  322. package/map/client/components/selection/KSelectedLayerFeatures.vue +2 -2
  323. package/map/client/components/stickies/KZoomControl.vue +1 -1
  324. package/map/client/components/styles/KStyleManager.vue +4 -1
  325. package/map/client/components/widget/KTimeSeries.vue +174 -497
  326. package/map/client/components/widget/KTimeSeriesSelector.vue +72 -0
  327. package/map/client/components/widget/KTimeSeriesToolbar.vue +83 -0
  328. package/map/client/composables/catalog.js +6 -10
  329. package/map/client/composables/highlight.js +12 -9
  330. package/map/client/composables/project.js +1 -1
  331. package/map/client/composables/selection.js +8 -7
  332. package/map/client/composables/weather.js +9 -2
  333. package/map/client/geolocation.js +8 -5
  334. package/map/client/i18n/map_en.json +10 -8
  335. package/map/client/i18n/map_fr.json +9 -7
  336. package/map/client/leaflet/TiledFeatureLayer.js +85 -82
  337. package/map/client/leaflet/utils/utils.geojson.js +3 -3
  338. package/map/client/mixins/globe/mixin.base-globe.js +15 -6
  339. package/map/client/mixins/globe/mixin.geojson-layers.js +27 -18
  340. package/map/client/mixins/map/mixin.edit-layers.js +9 -1
  341. package/map/client/mixins/map/mixin.pmtiles-layers.js +118 -29
  342. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +12 -5
  343. package/map/client/mixins/map/mixin.tiled-wind-layers.js +19 -10
  344. package/map/client/mixins/mixin.activity.js +23 -30
  345. package/map/client/mixins/mixin.feature-selection.js +41 -5
  346. package/map/client/planets.js +1 -1
  347. package/map/client/readers/reader.kml.js +2 -3
  348. package/map/client/utils/utils.catalog.js +36 -10
  349. package/map/client/utils/utils.layers.js +39 -8
  350. package/map/client/utils/utils.project.js +4 -0
  351. package/map/client/utils/utils.style.js +37 -7
  352. package/map/client/utils/utils.time-series.js +215 -6
  353. package/map/common/schemas/catalog.update.json +1 -1
  354. package/map/common/weacast-grid-source.js +1 -1
  355. package/package.json +3 -3
  356. package/scripts/kash/CHANGELOG.md +0 -4
  357. package/scripts/kash/README.md +0 -9
  358. package/scripts/kash/kash.sh +45 -40
  359. package/scripts/kash/scripts/run_tests.sh +1 -4
  360. package/test/api/core/authentication.test.js +9 -4
  361. package/test/api/core/config/default.cjs +1 -0
  362. package/test/api/core/hooks.test.js +6 -0
  363. package/test/api/core/index.test.js +43 -18
  364. package/test/api/core/push.test.js +8 -8
  365. package/test/api/core/test-log-2026-03-10.log +60 -0
  366. package/test/api/core/users.test.js +384 -0
  367. package/test/api/map/grid-sources.test.js +1 -1
  368. package/test/api/map/test-log-2026-03-10.log +56 -0
  369. package/vite/package.json +11 -2
  370. package/vite/test/core/composables.test.js +77 -0
  371. package/vite/vitest.config.js +13 -0
  372. package/vite/yarn.lock +1096 -18
  373. package/client/css/core.variables.scss +0 -72
  374. package/client/i18n/core_en.json +0 -744
  375. package/client/i18n/core_fr.json +0 -744
  376. package/client/i18n/map_en.json +0 -800
  377. package/client/i18n/map_fr.json +0 -800
  378. package/client/kdk.client.css +0 -47
  379. package/client/kdk.client.js +0 -41097
  380. package/client/kdk.client.map.css +0 -47
  381. package/client/kdk.client.map.js +0 -38182
  382. package/client/kdk.client.map.min.css +0 -1
  383. package/client/kdk.client.map.min.js +0 -27032
  384. package/client/kdk.client.min.css +0 -1
  385. package/client/kdk.client.min.js +0 -29074
  386. package/client/schemas/capture.create.json +0 -132
  387. package/client/schemas/catalog.update.json +0 -44
  388. package/client/schemas/messages.update.json +0 -16
  389. package/client/schemas/projects.create.json +0 -52
  390. package/client/schemas/projects.update.json +0 -52
  391. package/client/schemas/settings.update.json +0 -286
  392. package/client/schemas/tags.update.json +0 -35
  393. package/client/schemas/users.update-profile.json +0 -34
  394. package/core/client/components/account/KAccount.vue +0 -68
  395. package/core/client/components/account/KDeleteAccountManager.vue +0 -62
  396. package/core/client/components/account/KEmailManager.vue +0 -128
  397. package/core/client/components/account/KPasswordManager.vue +0 -90
  398. package/core/client/components/account/KVerifyEmailManager.vue +0 -105
  399. package/core/client/components/collection/KColumn.vue +0 -227
  400. package/core/client/components/collection/KHistory.vue +0 -113
  401. package/core/client/components/collection/KHistoryEntry.vue +0 -109
  402. package/coverage/tmp/coverage-222524-1765963609350-0.json +0 -1
  403. package/coverage/tmp/coverage-222536-1765963609335-0.json +0 -1
  404. package/coverage/tmp/coverage-222547-1765963609324-0.json +0 -1
  405. package/coverage/tmp/coverage-222559-1765963609309-0.json +0 -1
  406. package/scripts/kash/LICENSE +0 -21
  407. package/test/api/core/test-log-2025-07-31.log +0 -15
  408. package/test/api/core/test-log-2025-10-03.log +0 -18
  409. package/test/api/core/test-log-2025-11-10.log +0 -0
  410. package/test/api/core/test-log-2025-11-12.log +0 -117
  411. package/test/api/core/test-log-2025-11-27.log +0 -0
  412. package/test/api/core/test-log-2025-11-28.log +0 -17
  413. package/test/api/core/test-log-2025-12-09.log +0 -148
  414. package/test/api/core/test-log-2025-12-17.log +0 -58
  415. package/test/api/core/test-log-2026-01-29.log +0 -17
  416. package/test/api/map/test-log-2025-07-23.log +0 -1
  417. package/test/api/map/test-log-2025-11-28.log +0 -33
  418. package/test/api/map/test-log-2025-12-10.log +0 -2
  419. package/test/api/map/test-log-2026-01-06.log +0 -26
@@ -1,68 +0,0 @@
1
- <template>
2
- <q-card class="q-py-sm no-shadow">
3
- <!-- Sections -->
4
- <q-expansion-item
5
- v-if="isVerified"
6
- :label="$t('KVerifyEmailManager.TITLE')"
7
- group="account"
8
- class="bg-grey-2"
9
- header-class= 'text-red'
10
- id="verify-email-manager"
11
- default-opened
12
- >
13
- <KVerifyEmailManager notifierEmail="email-notifications@kalisio.com" />
14
- </q-expansion-item>
15
- <template v-for="section in sections" :key="section.title">
16
- <q-expansion-item
17
- :label="$tie(section.title)"
18
- group="account"
19
- class="bg-grey-2"
20
- :id="section.id"
21
- >
22
- <component :is="section.instance" v-bind="section" />
23
- </q-expansion-item>
24
- </template>
25
- <!-- Deletion -->
26
- <q-expansion-item
27
- v-if="deletable"
28
- :label="$t('KDeleteAccountManager.TITLE')"
29
- group="account"
30
- class="bg-grey-2"
31
- id="delete-account-manager"
32
- >
33
- <KDeleteAccountManager />
34
- </q-expansion-item>
35
- </q-card>
36
- </template>
37
-
38
- <script setup>
39
- import _ from 'lodash'
40
- import config from 'config'
41
- import { ref, onMounted } from 'vue'
42
- import { Store, utils, Events } from '../..'
43
- import KVerifyEmailManager from './KVerifyEmailManager.vue'
44
- import KDeleteAccountManager from './KDeleteAccountManager.vue'
45
-
46
- // Data
47
- const isVerified = ref(false)
48
- const deletable = ref(true)
49
- const sections = ref([])
50
- const User = Store.get('user')
51
-
52
- // Make store react to external changes to update verify email section
53
- Events.on('user-changed', (path, value) => {
54
- if (_.has(value, 'isVerified')) isVerified.value = !value.isVerified
55
- })
56
-
57
- // Hooks
58
- onMounted(async () => {
59
- deletable.value = _.get(config, 'account.deletable', true)
60
- if (_.has(User, 'isVerified')) isVerified.value = !User.isVerified
61
- const confSections = _.cloneDeep(_.get(config, 'account.sections', []))
62
- for (let i = 0; i < confSections.length; ++i) {
63
- const section = confSections[i]
64
- section.instance = utils.loadComponent(section.component)
65
- }
66
- sections.value = confSections
67
- })
68
- </script>
@@ -1,62 +0,0 @@
1
- <template>
2
- <div class="q-pa-md row justify-between items-center no-wrap bg-white">
3
- <span>{{ $t('KDeleteAccountManager.QUESTION') }}</span>
4
- <KAction
5
- id="delete-account"
6
- label="DELETE"
7
- color="negative"
8
- renderer= 'form-button'
9
- outline
10
- :closePopup="true"
11
- :handler="onDelete"
12
- />
13
- </div>
14
- </template>
15
-
16
- <script setup>
17
- import _ from 'lodash'
18
- import { useRouter } from 'vue-router'
19
- import { Dialog } from 'quasar'
20
- import { Store, i18n, api } from '../..'
21
- import KAction from '../action/KAction.vue'
22
-
23
- // Data
24
- const router = useRouter()
25
- const User = Store.get('user')
26
-
27
- // Function
28
- async function onDelete () {
29
- const name = _.get(User, 'profile.name')
30
- Dialog.create({
31
- title: i18n.t('KDeleteAccountManager.CONFIRMATION_TITLE'),
32
- message: i18n.t('KDeleteAccountManager.CONFIRMATION'),
33
- html: true,
34
- prompt: {
35
- model: '',
36
- type: 'text',
37
- isValid: val => val === name
38
- },
39
- persistent: true,
40
- ok: {
41
- label: i18n.t('OK'),
42
- flat: true
43
- },
44
- cancel: {
45
- label: i18n.t('CANCEL'),
46
- flat: true
47
- }
48
- }).onOk(async (data) => {
49
- try {
50
- await api.getService('users').remove(User._id)
51
- // Redirecting to logout will logout the user but logout an inexsiting user will raise an error
52
- // We prefer to clean the token manually instead
53
- // router.push({ name: 'logout' })
54
- Store.set('user', null)
55
- await api.authentication.removeAccessToken()
56
- router.push({ name: 'login' })
57
- } catch (error) {
58
- throw new Error(`[KDK] Cannot delete ${name} account: ${error}`)
59
- }
60
- })
61
- }
62
- </script>
@@ -1,128 +0,0 @@
1
- <template>
2
- <q-card class="q-pa-md">
3
- <!-- Form -->
4
- <q-card-section>
5
- <KForm
6
- ref="modifyEmailFormRef"
7
- :schema="modifyEmailSchema"
8
- />
9
- </q-card-section>
10
- <!-- Actions -->
11
- <q-card-actions align="right">
12
- <KAction
13
- id="modify-email"
14
- label="APPLY"
15
- renderer="form-button"
16
- outline
17
- :loading="processing"
18
- :handler="apply"
19
- />
20
- </q-card-actions>
21
- <q-dialog v-model="dialog" persistent>
22
- <q-card>
23
- <!-- Form -->
24
- <q-card-section align="center">
25
- <KForm
26
- ref="validateEmailFormRef"
27
- :schema="validateEmailSchema"
28
- />
29
- </q-card-section>
30
- <!-- Actions -->
31
- <q-card-actions align="center">
32
- <KAction
33
- id="validate-email"
34
- label="APPLY"
35
- renderer="form-button"
36
- :loading="processing"
37
- :handler="applyChanges"
38
- />
39
- </q-card-actions>
40
- </q-card>
41
- </q-dialog>
42
- </q-card>
43
- </template>
44
-
45
- <script setup>
46
- import { ref } from 'vue'
47
- import { Notify } from 'quasar'
48
- import { Store, utils, i18n } from '../..'
49
-
50
- // Data
51
- const User = Store.get('user')
52
- const modifyEmailFormRef = ref(null)
53
- const validateEmailFormRef = ref(null)
54
- const dialog = ref(false)
55
- const processing = ref(false)
56
- const modifyEmailSchema = ref({
57
- $schema: 'http://json-schema.org/draft-07/schema#',
58
- $id: 'http://kalisio.xyz/schemas/modify-email-manager#',
59
- title: 'Modify email form',
60
- type: 'object',
61
- properties: {
62
- password: {
63
- type: 'string',
64
- format: 'password',
65
- field: {
66
- component: 'form/KPasswordField',
67
- label: 'KEmailManager.PASSWORD_FIELD_LABEL'
68
- }
69
- },
70
- email: {
71
- type: 'string',
72
- format: 'email',
73
- field: {
74
- component: 'form/KEmailField',
75
- label: 'KEmailManager.EMAIL_FIELD_LABEL'
76
- }
77
- }
78
- },
79
- required: ['email', 'password']
80
- })
81
- const validateEmailSchema = ref({
82
- $schema: 'http://json-schema.org/draft-07/schema#',
83
- $id: 'http://kalisio.xyz/schemas/verify-email-manager#',
84
- title: 'Verify email form',
85
- type: 'object',
86
- properties: {
87
- token: {
88
- type: 'string',
89
- minLength: 6,
90
- maxLength: 6,
91
- tokenLength: 6,
92
- field: {
93
- component: 'form/KTokenField',
94
- label: 'KEmailManager.TOKEN_LABEL'
95
- }
96
- }
97
- },
98
- required: ['token']
99
- })
100
-
101
- // Functions
102
- async function apply () {
103
- const { isValid, values } = modifyEmailFormRef.value.validate()
104
- if (!isValid) return false
105
- try {
106
- processing.value = true
107
- await utils.sendChangeIdentity(User.email, values.email, values.password)
108
- dialog.value = true
109
- processing.value = false
110
- } catch (error) {
111
- processing.value = false
112
- }
113
- }
114
- async function applyChanges () {
115
- const { isValid, values } = validateEmailFormRef.value.validate()
116
- if (!isValid) return
117
- try {
118
- processing.value = true
119
- await utils.verifySignup(values.token, User.email)
120
- processing.value = false
121
- Notify.create({ type: 'positive', message: i18n.t('KEmailManager.EMAIL_CHANGED') })
122
- } catch (error) {
123
- processing.value = false
124
- Notify.create({ type: 'negative', message: i18n.t('KEmailManager.ERROR_MESSAGE') })
125
- }
126
- dialog.value = false
127
- }
128
- </script>
@@ -1,90 +0,0 @@
1
- <template>
2
- <q-card class="q-pa-md">
3
- <!-- Form -->
4
- <q-card-section>
5
- <KForm
6
- ref="formRef"
7
- :schema="schema"
8
- />
9
- </q-card-section>
10
- <!-- Actions -->
11
- <q-card-actions align="right">
12
- <KAction
13
- id="change-password"
14
- label="APPLY"
15
- renderer="form-button"
16
- outline
17
- :loading="processing"
18
- :handler="apply"
19
- />
20
- </q-card-actions>
21
- </q-card>
22
- </template>
23
-
24
- <script setup>
25
- import { ref } from 'vue'
26
- import { Notify } from 'quasar'
27
- import { Store, i18n, utils } from '../..'
28
- import KForm from '../form/KForm.vue'
29
- import KAction from '../action/KAction.vue'
30
-
31
- // Data
32
- const formRef = ref(null)
33
- const User = Store.get('user')
34
- const schema = ref({
35
- $schema: 'http://json-schema.org/draft-07/schema#',
36
- $id: 'http://kalisio.xyz/schemas/password-manager.json#',
37
- title: 'Change Password form',
38
- type: 'object',
39
- properties: {
40
- oldPassword: {
41
- type: 'string',
42
- format: 'password',
43
- field: {
44
- component: 'form/KPasswordField',
45
- label: 'KPasswordManager.OLD_PASSWORD_FIELD_LABEL'
46
- }
47
- },
48
- password: {
49
- type: 'string',
50
- format: 'password',
51
- field: {
52
- component: 'form/KPasswordField',
53
- label: 'KPasswordManager.PASSWORD_FIELD_LABEL'
54
- }
55
- },
56
- confirmPassword: {
57
- type: 'string',
58
- format: 'password',
59
- const: {
60
- $data: '1/password'
61
- },
62
- field: {
63
- component: 'form/KPasswordField',
64
- label: 'KPasswordManager.CONFIRM_PASSWORD_FIELD_LABEL'
65
- }
66
- }
67
- },
68
- required: ['oldPassword', 'password', 'confirmPassword']
69
- })
70
- const processing = ref(false)
71
-
72
- // Functions
73
- async function apply () {
74
- const { isValid, values } = formRef.value.validate()
75
- if (!isValid) return false
76
- try {
77
- processing.value = true
78
- await utils.changePassword(User.email, values.oldPassword, values.password)
79
- processing.value = false
80
- Notify.create({
81
- type: 'positive',
82
- message: i18n.t('KPasswordManager.PASSWORD_CHANGED')
83
- })
84
- } catch (error) {
85
- processing.value = false
86
- return false
87
- }
88
- return true
89
- }
90
- </script>
@@ -1,105 +0,0 @@
1
- <template>
2
- <!-- Helper -->
3
- <q-expansion-item icon="las la-question" :label="$t('KVerifyEmailManager.HELP_LABEL')">
4
- <div class="q-pa-md">
5
- <i18n-t class="text-body2" keypath="KVerifyEmailManager.HELP_TEXT" tag="p" scope="global" />
6
- </div>
7
- </q-expansion-item>
8
- <q-expansion-item icon="las la-question" :label="$t('KVerifyEmailManager.HELP_EMAIL_LABEL')">
9
- <div class="q-pa-md">
10
- <i18n-t class="text-body2" keypath="KVerifyEmailManager.HELP_EMAIL_TEXT" tag="p" scope="global">
11
- <template v-slot:email>
12
- <span class="text-weight-bold">{{ notifierEmail }}</span>
13
- </template>
14
- </i18n-t>
15
- </div>
16
- </q-expansion-item>
17
- <q-card>
18
- <!-- Form -->
19
- <q-card-section>
20
- <KForm
21
- ref="formRef"
22
- :schema="schema"
23
- />
24
- </q-card-section>
25
- <!-- Actions -->
26
- <q-card-actions align="center">
27
- <KAction
28
- id="resend-verify-signup"
29
- label="KVerifyEmailManager.ACTION"
30
- renderer="form-button"
31
- outline
32
- :handler="resendVerifySignup"
33
- />
34
- <KAction
35
- id="verify-email"
36
- label="APPLY"
37
- renderer="form-button"
38
- :loading="processing"
39
- :handler="apply"
40
- />
41
- </q-card-actions>
42
- </q-card>
43
- </template>
44
-
45
- <script setup>
46
- import { ref } from 'vue'
47
- import { Notify } from 'quasar'
48
- import { Store, i18n, utils } from '../..'
49
-
50
- // Props
51
- defineProps({
52
- notifierEmail: {
53
- type: String,
54
- default: true
55
- }
56
- })
57
-
58
- // Data
59
- const User = Store.get('user')
60
- const formRef = ref(null)
61
- const processing = ref(false)
62
- const schema = ref({
63
- $schema: 'http://json-schema.org/draft-07/schema#',
64
- $id: 'http://kalisio.xyz/schemas/verify-email-manager#',
65
- title: 'Verify email form',
66
- type: 'object',
67
- properties: {
68
- token: {
69
- type: 'string',
70
- minLength: 6,
71
- maxLength: 6,
72
- tokenLength: 6,
73
- field: {
74
- component: 'form/KTokenField',
75
- label: 'KVerifyEmailManager.TOKEN_LABEL'
76
- }
77
- }
78
- },
79
- required: ['token']
80
- })
81
-
82
- // Functions
83
- async function apply () {
84
- const { isValid, values } = formRef.value.validate()
85
- if (!isValid) return
86
- try {
87
- processing.value = true
88
- await utils.verifySignup(values.token, User.email)
89
- processing.value = false
90
- Notify.create({
91
- type: 'positive',
92
- message: i18n.t('KVerifyEmailManager.EMAIL_VERIFIED')
93
- })
94
- } catch (error) {
95
- processing.value = false
96
- Notify.create({
97
- type: 'negative',
98
- message: i18n.t('KVerifyEmailManager.ERROR_MESSAGE')
99
- })
100
- }
101
- }
102
- function resendVerifySignup () {
103
- utils.resendVerifySignup(User.email)
104
- }
105
- </script>
@@ -1,227 +0,0 @@
1
- <template>
2
- <div class="column full-width">
3
- <!--
4
- Header
5
- -->
6
- <div class="full-width">
7
- <q-resize-observer @resize="onHeaderResized" />
8
- <KPanel
9
- id="header"
10
- :content="header"
11
- class="no-wrap"
12
- />
13
- </div>
14
- <!--
15
- Items
16
- -->
17
- <div v-if="items.length > 0">
18
- <KScrollArea
19
- ref="scrollAreaRef"
20
- :max-height="scrollHeight"
21
- @scrolled="onScrolled"
22
- >
23
- <div
24
- class="full-width column"
25
- :class="{
26
- 'q-gutter-y-xs': gutter && dense,
27
- 'q-gutter-y-sm': gutter && !dense
28
- }"
29
- :style="{ maxWidth: `${width}px` }"
30
- >
31
- <template v-for="item in items" :key="item._id">
32
- <component
33
- :id="item._id"
34
- :service="service"
35
- :item="item"
36
- :is="rendererComponent"
37
- v-bind="renderer"
38
- @item-selected="onItemSelected"
39
- :class="{
40
- 'q-pr-xs': hasScrollArea && dense,
41
- 'q-pr-sm': hasScrollArea && !dense
42
- }"
43
- />
44
- </template>
45
- </div>
46
- </KScrollArea>
47
- <div
48
- v-if="hasScrollAction"
49
- class="row justify-center"
50
- >
51
- <KAction
52
- id="scroll-action"
53
- icon="las la-angle-double-down"
54
- color="accent"
55
- size="0.8rem"
56
- :handler="scrollDown"
57
- />
58
- </div>
59
- </div>
60
- <div v-else>
61
- <slot name="empty-column">
62
- <div class="row justify-center">
63
- <KStamp
64
- icon="las la-exclamation-circle"
65
- icon-size="1.6rem"
66
- :text="$t('KColumn.EMPTY_COLUMN')"
67
- direction="horizontal"
68
- class="q-pt-lg"
69
- />
70
- </div>
71
- </slot>
72
- </div>
73
- </div>
74
- </template>
75
-
76
- <script setup>
77
- import _ from 'lodash'
78
- import { ref, computed, watch, toRefs, onBeforeMount, onBeforeUnmount } from 'vue'
79
- import { Events } from '../../events.js'
80
- import KAction from '../action/KAction.vue'
81
- import KScrollArea from '../KScrollArea.vue'
82
- import KStamp from '../KStamp.vue'
83
- import { useCollection } from '../../composables'
84
- import { loadComponent } from '../../utils/index.js'
85
-
86
- const emit = defineEmits(['selection-changed', 'collection-refreshed'])
87
-
88
- // Props
89
- const props = defineProps({
90
- name: {
91
- type: String,
92
- default: undefined
93
- },
94
- header: {
95
- type: Array,
96
- default: () => null
97
- },
98
- renderer: {
99
- type: Object,
100
- default: () => {
101
- return {
102
- component: 'collection/KCard'
103
- }
104
- }
105
- },
106
- width: {
107
- type: Number,
108
- default: 200
109
- },
110
- height: {
111
- type: Number,
112
- default: 300
113
- },
114
- gutter: {
115
- type: Boolean,
116
- default: true
117
- },
118
- dense: {
119
- type: Boolean,
120
- default: false
121
- },
122
- service: {
123
- type: String,
124
- required: true
125
- },
126
- baseQuery: {
127
- type: Object,
128
- default: () => {}
129
- },
130
- filterQuery: {
131
- type: Object,
132
- default: () => {}
133
- },
134
- listStrategy: {
135
- type: String,
136
- default: 'smart'
137
- },
138
- nbItemsPerPage: {
139
- type: Number,
140
- default: 12
141
- },
142
- processor: {
143
- type: Function,
144
- default: undefined
145
- }
146
- })
147
-
148
- // Data
149
- const scrollAreaRef = ref(null)
150
- const hasScrollArea = ref(false)
151
- const hasScrollAction = ref(false)
152
- const headerHeight = ref(0)
153
- // Configuration
154
- const scrollOffset = 350
155
- const scrollDuration = 250
156
-
157
- // Computed
158
- const rendererComponent = computed(() => loadComponent(props.renderer.component))
159
- const scrollHeight = computed(() => props.height - headerHeight.value - (hasScrollAction.value ? 24 : 0))
160
-
161
- // Always use append mode for columns
162
- const { items, nbTotalItems, nbPages, currentPage, refreshCollection, resetCollection } =
163
- useCollection(Object.assign({ appendItems: ref(true) }, toRefs(props)))
164
-
165
- // Functions
166
- function onHeaderResized (size) {
167
- headerHeight.value = size.height
168
- }
169
- function onScrolled (info) {
170
- hasScrollArea.value = info.verticalSize > scrollHeight.value
171
- if (items.value.length < nbTotalItems.value) {
172
- if (info.verticalPercentage === 1) {
173
- if (items.value.length === currentPage.value * props.nbItemsPerPage) currentPage.value++
174
- refreshCollection()
175
- hasScrollAction.value = true
176
- } else {
177
- hasScrollAction.value = hasScrollArea.value
178
- }
179
- } else {
180
- if (info.verticalPercentage === 1) {
181
- hasScrollAction.value = false
182
- } else {
183
- hasScrollAction.value = hasScrollArea.value
184
- }
185
- }
186
- }
187
- function scrollDown () {
188
- const position = scrollAreaRef.value.getScrollPosition('vertical')
189
- scrollAreaRef.value.setScrollPosition('vertical', position + scrollOffset, scrollDuration)
190
- }
191
- function onItemSelected (item, section) {
192
- emit('selection-changed', item, section)
193
- }
194
- function onCollectionRefreshed () {
195
- emit('collection-refreshed', items.value)
196
- }
197
-
198
- // Watch
199
- watch(items, () => {
200
- // On reset, reset as well scroll area
201
- if (_.isEmpty(items.value) && scrollAreaRef.value) scrollAreaRef.value.setScrollPosition('vertical', 0)
202
- // Emit events so that embbeding components can be aware of it
203
- onCollectionRefreshed()
204
- })
205
-
206
- // Hooks
207
- onBeforeMount(() => {
208
- refreshCollection()
209
- // Whenever the user abilities are updated, update collection as well
210
- Events.on('user-abilities-changed', resetCollection)
211
- })
212
-
213
- onBeforeUnmount(() => {
214
- Events.off('user-abilities-changed', resetCollection)
215
- })
216
-
217
- // Expose
218
- defineExpose({
219
- name: props.name,
220
- items,
221
- nbTotalItems,
222
- nbPages,
223
- currentPage,
224
- refreshCollection,
225
- resetCollection
226
- })
227
- </script>