@kalisio/kdk 2.3.1 → 2.4.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 (416) hide show
  1. package/.eslintignore +2 -1
  2. package/.github/workflows/main.yaml +3 -3
  3. package/README.md +1 -0
  4. package/core/api/db.js +6 -1
  5. package/core/api/hooks/hooks.model.js +1 -1
  6. package/core/api/hooks/hooks.schemas.js +0 -2
  7. package/core/api/models/messages.model.mongodb.js +13 -0
  8. package/core/api/services/authorisations/authorisations.service.js +13 -4
  9. package/core/api/services/index.js +19 -0
  10. package/core/api/services/messages/messages.hooks.js +38 -0
  11. package/core/client/api.js +7 -32
  12. package/core/client/capabilities.js +2 -2
  13. package/core/client/components/KActivity.vue +29 -6
  14. package/core/client/components/KContent.vue +2 -2
  15. package/core/client/components/KDialog.vue +4 -7
  16. package/core/client/components/KStamp.vue +3 -9
  17. package/core/client/components/KStore.vue +2 -4
  18. package/core/client/components/KTab.vue +95 -0
  19. package/core/client/components/action/KAction.vue +15 -2
  20. package/core/client/components/action/KBugReportAction.vue +4 -2
  21. package/core/client/components/action/KToggleFullscreenAction.vue +25 -0
  22. package/core/client/components/app/KSettings.vue +17 -13
  23. package/core/client/components/chart/KDataTable.vue +6 -9
  24. package/core/client/components/chart/KTimeSeriesChart.vue +74 -56
  25. package/core/client/components/collection/KBoard.vue +22 -33
  26. package/core/client/components/collection/KCard.vue +71 -56
  27. package/core/client/components/collection/KCardSection.vue +20 -10
  28. package/core/client/components/collection/KDescriptionCardSection.vue +47 -0
  29. package/core/client/components/collection/KGrid.vue +234 -54
  30. package/core/client/components/collection/KScrollDown.vue +97 -0
  31. package/core/client/components/collection/KScrollToTop.vue +93 -0
  32. package/core/client/components/collection/KTable.vue +87 -33
  33. package/core/client/components/collection/KTimeLine.vue +406 -0
  34. package/core/client/components/collection/index.js +1 -5
  35. package/core/client/components/document/KDocument.vue +20 -55
  36. package/core/client/components/document/KHtml.vue +17 -7
  37. package/core/client/components/document/KImage.vue +78 -0
  38. package/core/client/components/document/KMarkdown.vue +12 -16
  39. package/core/client/components/document/KPdf.vue +69 -0
  40. package/core/client/components/form/KFileField.vue +2 -2
  41. package/core/client/components/form/KSelectField.vue +2 -1
  42. package/core/client/components/form/KUnitField.vue +3 -1
  43. package/core/client/components/layout/KFab.vue +9 -10
  44. package/core/client/components/layout/KLayout.vue +104 -6
  45. package/core/client/components/layout/KOpener.vue +14 -19
  46. package/core/client/components/layout/KPage.vue +195 -105
  47. package/core/client/components/layout/KWindow.vue +62 -45
  48. package/core/client/components/layout/index.js +0 -2
  49. package/core/client/components/media/KRibbon.vue +95 -0
  50. package/core/client/components/menu/KMenu.vue +4 -4
  51. package/core/client/components/team/KGroupsActivity.vue +25 -27
  52. package/core/client/components/team/KMembersActivity.vue +21 -23
  53. package/core/client/components/team/KOrganisationsActivity.vue +20 -22
  54. package/core/client/components/team/KTagsActivity.vue +21 -23
  55. package/core/client/components/time/KAbsoluteTimeRange.vue +70 -170
  56. package/core/client/composables/activity.js +14 -12
  57. package/core/client/composables/collection.js +3 -1
  58. package/core/client/composables/counter.js +51 -0
  59. package/core/client/composables/index.js +3 -0
  60. package/core/client/composables/layout.js +13 -2
  61. package/core/client/composables/messages.js +15 -0
  62. package/core/client/composables/pwa.js +1 -1
  63. package/core/client/composables/schema.js +6 -6
  64. package/core/client/composables/screen.js +23 -0
  65. package/core/client/directives/index.js +1 -0
  66. package/core/client/directives/v-hover.js +23 -0
  67. package/core/client/document.js +61 -0
  68. package/core/client/exporter.js +1 -1
  69. package/core/client/filter.js +0 -1
  70. package/core/client/guards.js +1 -1
  71. package/core/client/i18n/core_en.json +14 -8
  72. package/core/client/i18n/core_fr.json +15 -9
  73. package/core/client/index.js +9 -3
  74. package/core/client/layout.js +129 -29
  75. package/core/client/local-storage.js +1 -1
  76. package/core/client/mixins/index.js +0 -1
  77. package/core/client/mixins/mixin.base-activity.js +23 -13
  78. package/core/client/mixins/mixin.base-item.js +6 -3
  79. package/core/client/services/index.js +4 -1
  80. package/core/client/services/local-settings.service.js +4 -0
  81. package/core/client/storage.js +1 -1
  82. package/core/client/store.js +1 -1
  83. package/core/client/template-context.js +17 -0
  84. package/core/client/units.js +49 -27
  85. package/core/client/utils/index.js +3 -2
  86. package/core/client/utils/utils.actions.js +4 -0
  87. package/core/client/utils/utils.colors.js +155 -2
  88. package/core/client/utils/utils.items.js +26 -0
  89. package/core/client/utils/utils.math.js +3 -0
  90. package/core/client/utils/utils.platform.js +3 -1
  91. package/core/client/utils/utils.screen.js +82 -0
  92. package/core/client/utils/utils.time.js +0 -1
  93. package/core/common/schemas/settings.update.json +12 -0
  94. package/coverage/core/api/application.js.html +1 -1
  95. package/coverage/core/api/authentication.js.html +1 -1
  96. package/coverage/core/api/db.js.html +51 -36
  97. package/coverage/core/api/hooks/hooks.authentication.js.html +1 -1
  98. package/coverage/core/api/hooks/hooks.authorisations.js.html +1 -1
  99. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  100. package/coverage/core/api/hooks/hooks.logger.js.html +1 -1
  101. package/coverage/core/api/hooks/hooks.model.js.html +2 -2
  102. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  103. package/coverage/core/api/hooks/hooks.push.js.html +1 -1
  104. package/coverage/core/api/hooks/hooks.query.js.html +1 -1
  105. package/coverage/core/api/hooks/hooks.schemas.js.html +6 -12
  106. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  107. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  108. package/coverage/core/api/hooks/hooks.users.js.html +2 -2
  109. package/coverage/core/api/hooks/index.html +10 -10
  110. package/coverage/core/api/hooks/index.js.html +1 -1
  111. package/coverage/core/api/index.html +14 -14
  112. package/coverage/core/api/index.js.html +1 -1
  113. package/coverage/core/api/marshall.js.html +1 -1
  114. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  115. package/coverage/core/api/models/index.html +25 -10
  116. package/coverage/core/api/models/messages.model.mongodb.js.html +121 -0
  117. package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
  118. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  119. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  120. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  121. package/coverage/core/api/services/account/account.service.js.html +1 -1
  122. package/coverage/core/api/services/account/index.html +1 -1
  123. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  124. package/coverage/core/api/services/authorisations/authorisations.service.js.html +43 -16
  125. package/coverage/core/api/services/authorisations/index.html +19 -19
  126. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  127. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  128. package/coverage/core/api/services/databases/index.html +1 -1
  129. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  130. package/coverage/core/api/services/groups/index.html +1 -1
  131. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  132. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  133. package/coverage/core/api/services/import-export/index.html +1 -1
  134. package/coverage/core/api/services/index.html +19 -19
  135. package/coverage/core/api/services/index.js.html +67 -10
  136. package/coverage/core/api/services/mailer/index.html +1 -1
  137. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  138. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  139. package/coverage/core/api/services/messages/index.html +116 -0
  140. package/coverage/core/api/services/messages/messages.hooks.js.html +199 -0
  141. package/coverage/core/api/services/organisations/index.html +1 -1
  142. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  143. package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
  144. package/coverage/core/api/services/push/index.html +1 -1
  145. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  146. package/coverage/core/api/services/push/push.service.js.html +1 -1
  147. package/coverage/core/api/services/storage/index.html +1 -1
  148. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  149. package/coverage/core/api/services/storage/storage.service.js.html +1 -1
  150. package/coverage/core/api/services/tags/index.html +1 -1
  151. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  152. package/coverage/core/api/services/users/index.html +1 -1
  153. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  154. package/coverage/core/api/utils.js.html +1 -1
  155. package/coverage/core/common/errors.js.html +1 -1
  156. package/coverage/core/common/index.html +1 -1
  157. package/coverage/core/common/index.js.html +1 -1
  158. package/coverage/core/common/permissions.js.html +1 -1
  159. package/coverage/core/common/schema.js.html +1 -1
  160. package/coverage/core/common/utils.js.html +1 -1
  161. package/coverage/index.html +69 -54
  162. package/coverage/lcov-report/core/api/application.js.html +1 -1
  163. package/coverage/lcov-report/core/api/authentication.js.html +1 -1
  164. package/coverage/lcov-report/core/api/db.js.html +51 -36
  165. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +1 -1
  166. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1 -1
  167. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  168. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +1 -1
  169. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +2 -2
  170. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  171. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +1 -1
  172. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +1 -1
  173. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +6 -12
  174. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  175. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  176. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +2 -2
  177. package/coverage/lcov-report/core/api/hooks/index.html +10 -10
  178. package/coverage/lcov-report/core/api/hooks/index.js.html +1 -1
  179. package/coverage/lcov-report/core/api/index.html +14 -14
  180. package/coverage/lcov-report/core/api/index.js.html +1 -1
  181. package/coverage/lcov-report/core/api/marshall.js.html +1 -1
  182. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  183. package/coverage/lcov-report/core/api/models/index.html +25 -10
  184. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +121 -0
  185. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
  186. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  187. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  188. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  189. package/coverage/lcov-report/core/api/services/account/account.service.js.html +1 -1
  190. package/coverage/lcov-report/core/api/services/account/index.html +1 -1
  191. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  192. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +43 -16
  193. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  194. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  195. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  196. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  197. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  198. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  199. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  200. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  201. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  202. package/coverage/lcov-report/core/api/services/index.html +19 -19
  203. package/coverage/lcov-report/core/api/services/index.js.html +67 -10
  204. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  205. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  206. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  207. package/coverage/lcov-report/core/api/services/messages/index.html +116 -0
  208. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +199 -0
  209. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  210. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  211. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
  212. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  213. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  214. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  215. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  216. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  217. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +1 -1
  218. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  219. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  220. package/coverage/lcov-report/core/api/services/users/index.html +1 -1
  221. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  222. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  223. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  224. package/coverage/lcov-report/core/common/index.html +1 -1
  225. package/coverage/lcov-report/core/common/index.js.html +1 -1
  226. package/coverage/lcov-report/core/common/permissions.js.html +1 -1
  227. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  228. package/coverage/lcov-report/core/common/utils.js.html +1 -1
  229. package/coverage/lcov-report/index.html +69 -54
  230. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  231. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  232. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1 -1
  233. package/coverage/lcov-report/map/api/hooks/index.html +1 -1
  234. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  235. package/coverage/lcov-report/map/api/index.html +1 -1
  236. package/coverage/lcov-report/map/api/index.js.html +1 -1
  237. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  238. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  239. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  240. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  241. package/coverage/lcov-report/map/api/models/index.html +1 -1
  242. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  243. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  244. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  245. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  246. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +9 -15
  247. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  248. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  249. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  250. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +2 -2
  251. package/coverage/lcov-report/map/api/services/features/features.service.js.html +1 -1
  252. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  253. package/coverage/lcov-report/map/api/services/index.html +1 -1
  254. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  255. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  256. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  257. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  258. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  259. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  260. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  261. package/coverage/lcov-report/map/common/index.html +1 -1
  262. package/coverage/lcov-report/map/common/index.js.html +1 -1
  263. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  264. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  265. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  266. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  267. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  268. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  269. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  270. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  271. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  272. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  273. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  274. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  275. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  276. package/coverage/lcov.info +487 -370
  277. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  278. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  279. package/coverage/map/api/hooks/hooks.query.js.html +1 -1
  280. package/coverage/map/api/hooks/index.html +1 -1
  281. package/coverage/map/api/hooks/index.js.html +1 -1
  282. package/coverage/map/api/index.html +1 -1
  283. package/coverage/map/api/index.js.html +1 -1
  284. package/coverage/map/api/marshall.js.html +1 -1
  285. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  286. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  287. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  288. package/coverage/map/api/models/index.html +1 -1
  289. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  290. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  291. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  292. package/coverage/map/api/services/alerts/index.html +1 -1
  293. package/coverage/map/api/services/catalog/catalog.hooks.js.html +9 -15
  294. package/coverage/map/api/services/catalog/index.html +5 -5
  295. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  296. package/coverage/map/api/services/daptiles/index.html +1 -1
  297. package/coverage/map/api/services/features/features.hooks.js.html +2 -2
  298. package/coverage/map/api/services/features/features.service.js.html +1 -1
  299. package/coverage/map/api/services/features/index.html +1 -1
  300. package/coverage/map/api/services/index.html +1 -1
  301. package/coverage/map/api/services/index.js.html +1 -1
  302. package/coverage/map/api/services/projects/index.html +1 -1
  303. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  304. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  305. package/coverage/map/common/errors.js.html +1 -1
  306. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  307. package/coverage/map/common/grid.js.html +1 -1
  308. package/coverage/map/common/index.html +1 -1
  309. package/coverage/map/common/index.js.html +1 -1
  310. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  311. package/coverage/map/common/moment-utils.js.html +1 -1
  312. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  313. package/coverage/map/common/opendap-utils.js.html +1 -1
  314. package/coverage/map/common/permissions.js.html +1 -1
  315. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  316. package/coverage/map/common/tms-utils.js.html +1 -1
  317. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  318. package/coverage/map/common/wcs-utils.js.html +1 -1
  319. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  320. package/coverage/map/common/wfs-utils.js.html +1 -1
  321. package/coverage/map/common/wms-utils.js.html +1 -1
  322. package/coverage/map/common/wmts-utils.js.html +1 -1
  323. package/coverage/tmp/coverage-280506-1731704745613-0.json +1 -0
  324. package/coverage/tmp/coverage-280518-1731704745599-0.json +1 -0
  325. package/coverage/tmp/coverage-280529-1731704745588-0.json +1 -0
  326. package/coverage/tmp/{coverage-137470-1719398750728-0.json → coverage-280541-1731704745574-0.json} +1 -1
  327. package/coverage/tmp/{coverage-137477-1719398750691-0.json → coverage-280548-1731704745545-0.json} +1 -1
  328. package/extras/css/core.variables.scss +32 -8
  329. package/extras/icons/attribution.png +0 -0
  330. package/map/api/services/catalog/catalog.hooks.js +5 -7
  331. package/map/api/services/features/features.hooks.js +1 -1
  332. package/map/client/cesium/utils/utils.style.js +11 -2
  333. package/map/client/components/KAttribution.vue +108 -0
  334. package/map/client/components/KPositionIndicator.vue +11 -18
  335. package/map/client/components/KProjectMenu.vue +4 -4
  336. package/map/client/components/catalog/KCategoryItem.vue +74 -0
  337. package/map/client/components/catalog/KLayerCategories.vue +24 -12
  338. package/map/client/components/catalog/KLayersPanel.vue +139 -116
  339. package/map/client/components/catalog/KProjectSelector.vue +29 -17
  340. package/map/client/components/catalog/KProjectsPanel.vue +19 -35
  341. package/map/client/components/catalog/KViewSelector.vue +37 -25
  342. package/map/client/components/catalog/KViewsPanel.vue +19 -35
  343. package/map/client/components/form/KLocationField.vue +1 -2
  344. package/map/client/components/legend/KLegend.vue +34 -34
  345. package/map/client/components/location/KLocationCardSection.vue +18 -22
  346. package/map/client/components/location/KLocationMap.vue +36 -38
  347. package/map/client/components/location/KLocationTimeLineCard.vue +147 -0
  348. package/map/client/components/location/KLocationTip.vue +12 -2
  349. package/map/client/components/widget/KInformationBox.vue +0 -4
  350. package/map/client/components/widget/KStackableTimeSeries.vue +8 -1
  351. package/map/client/components/widget/KTimeSeries.vue +1 -1
  352. package/map/client/composables/highlight.js +29 -31
  353. package/map/client/composables/probe.js +7 -3
  354. package/map/client/composables/weather.js +71 -31
  355. package/map/client/i18n/map_en.json +3 -0
  356. package/map/client/i18n/map_fr.json +3 -0
  357. package/map/client/init.js +4 -3
  358. package/map/client/leaflet/ShapeMarker.js +1 -1
  359. package/map/client/leaflet/utils/utils.events.js +1 -1
  360. package/map/client/leaflet/utils/utils.style.js +20 -8
  361. package/map/client/mixins/globe/mixin.base-globe.js +111 -13
  362. package/map/client/mixins/globe/mixin.file-layers.js +10 -10
  363. package/map/client/mixins/globe/mixin.geojson-layers.js +90 -15
  364. package/map/client/mixins/globe/mixin.style.js +2 -0
  365. package/map/client/mixins/index.js +0 -1
  366. package/map/client/mixins/map/index.js +1 -0
  367. package/map/client/mixins/map/mixin.base-map.js +21 -2
  368. package/map/client/mixins/map/mixin.canvas-layers.js +7 -2
  369. package/map/client/mixins/map/mixin.edit-layers.js +12 -4
  370. package/map/client/mixins/map/mixin.file-layers.js +3 -0
  371. package/map/client/mixins/map/mixin.geojson-layers.js +90 -5
  372. package/map/client/mixins/map/mixin.pmtiles-layers.js +106 -0
  373. package/map/client/mixins/mixin.activity.js +8 -3
  374. package/map/client/mixins/mixin.feature-service.js +73 -32
  375. package/map/client/mixins/mixin.levels.js +1 -0
  376. package/map/client/mixins/mixin.weacast.js +10 -87
  377. package/map/client/utils/index.js +1 -0
  378. package/map/client/utils/utils.capture.js +1 -1
  379. package/map/client/utils/utils.catalog.js +7 -7
  380. package/map/client/utils/utils.features.js +59 -1
  381. package/map/client/utils/utils.layers.js +8 -0
  382. package/map/client/utils/utils.time-series.js +121 -0
  383. package/map/client/utils/utils.weacast.js +102 -0
  384. package/package.json +6 -6
  385. package/scripts/init_runner.sh +2 -2
  386. package/scripts/kash/CHANGELOG.md +12 -0
  387. package/scripts/kash/README.md +2 -0
  388. package/scripts/kash/kash.sh +34 -32
  389. package/scripts/run_tests.sh +2 -2
  390. package/scripts/setup_workspace.sh +24 -6
  391. package/test/api/core/hooks.test.js +6 -3
  392. package/test/api/core/test-log-2024-07-09.log +0 -0
  393. package/test/api/core/test-log-2024-08-13.log +69 -0
  394. package/test/api/core/test-log-2024-10-28.log +53 -0
  395. package/test/api/core/test-log-2024-11-05.log +30 -0
  396. package/test/api/core/test-log-2024-11-15.log +23 -0
  397. package/test/api/map/alerts.test.js +3 -1
  398. package/test/api/map/config/layers.json +3 -1
  399. package/test/api/map/index.test.js +18 -1
  400. package/test/api/map/test-log-2024-08-13.log +13 -0
  401. package/test/api/map/test-log-2024-08-20.log +55 -0
  402. package/test/api/map/test-log-2024-09-09.log +92 -0
  403. package/test/api/map/test-log-2024-10-28.log +11 -0
  404. package/test/client/core/utils.js +13 -0
  405. package/test/client/map/api.js +34 -0
  406. package/test/client/map/catalog.js +6 -2
  407. package/test/client/map/index.js +1 -0
  408. package/test/client/map/utils.js +4 -2
  409. package/core/client/components/collection/KList.vue +0 -135
  410. package/core/client/components/layout/KPageSticky.vue +0 -53
  411. package/core/client/mixins/mixin.base-collection.js +0 -162
  412. package/core/client/utils/utils.data.js +0 -22
  413. package/coverage/tmp/coverage-137435-1719398750767-0.json +0 -1
  414. package/coverage/tmp/coverage-137447-1719398750752-0.json +0 -1
  415. package/coverage/tmp/coverage-137458-1719398750740-0.json +0 -1
  416. package/map/client/mixins/mixin.catalog-panel.js +0 -26
@@ -4,15 +4,13 @@
4
4
  <!--
5
5
  Header section
6
6
  -->
7
- <div v-if="!hideHeader" class="row full-width items-center no-wrap" style="min-height: 30px">
7
+ <div v-if="!hideHeader" class="row full-width justify-between items-center no-wrap">
8
8
  <span class="text-grey-7 text-body-2 ellipsis">
9
9
  {{ title }}
10
10
  </span>
11
- <q-space />
12
11
  <KPanel
13
- v-if="actions"
14
- :content="actions"
15
- :context="context"
12
+ v-if="filteredActions"
13
+ :content="filteredActions"
16
14
  class="no-wrap"
17
15
  />
18
16
  </div>
@@ -26,9 +24,11 @@
26
24
  </template>
27
25
 
28
26
  <script setup>
27
+ import _ from 'lodash'
28
+ import { computed } from 'vue'
29
29
 
30
30
  // Props
31
- defineProps({
31
+ const props = defineProps({
32
32
  title: {
33
33
  type: String,
34
34
  default: ''
@@ -37,6 +37,10 @@ defineProps({
37
37
  type: Array,
38
38
  default: () => null
39
39
  },
40
+ actionsFilter: {
41
+ type: [String, Array],
42
+ default: () => null
43
+ },
40
44
  hideHeader: {
41
45
  type: Boolean,
42
46
  default: false
@@ -44,10 +48,16 @@ defineProps({
44
48
  dense: {
45
49
  type: Boolean,
46
50
  default: false
47
- },
48
- context: {
49
- type: Object,
50
- default: () => null
51
51
  }
52
52
  })
53
+
54
+ // Computed
55
+ const filteredActions = computed(() => {
56
+ if (!props.actionsFilter) return props.actions
57
+ let filter = props.actionsFilter
58
+ if (_.isString(filter)) filter = [filter]
59
+ return _.filter(props.actions, action => {
60
+ return _.indexOf(filter, action.id) >= 0
61
+ })
62
+ })
53
63
  </script>
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <KCardSection
3
+ :title="$t('KDescriptionCardSection.TITLE')"
4
+ :actions="actions"
5
+ :actionsFilter="actionsFilter"
6
+ :hideHeader="hideHeader"
7
+ :dense="dense"
8
+ >
9
+ <KTextArea
10
+ v-if="description"
11
+ :text="description"
12
+ :minHeight="48"
13
+ :dense="dense"
14
+ />
15
+ <div v-else :style="`height: 44px; position: relative`">
16
+ <KStamp
17
+ text="KDescriptionCardSection.NO_DESCRIPTION"
18
+ icon="las la-exclamation-circle"
19
+ iconSize="24px"
20
+ direction="horizontal"
21
+ class="absolute-center"
22
+ />
23
+ </div>
24
+ </KCardSection>
25
+ </template>
26
+
27
+ <script setup>
28
+ import _ from 'lodash'
29
+ import { computed } from 'vue'
30
+ import { CardSectionProps } from '../../utils/utils.items.js'
31
+ import KCardSection from './KCardSection.vue'
32
+ import KTextArea from '../KTextArea.vue'
33
+
34
+ // Props
35
+ const props = defineProps({
36
+ descriptionPath: {
37
+ type: String,
38
+ default: 'description'
39
+ },
40
+ ...CardSectionProps
41
+ })
42
+
43
+ // Computed
44
+ const description = computed(() => {
45
+ return _.get(props.item, props.descriptionPath)
46
+ })
47
+ </script>
@@ -1,55 +1,154 @@
1
1
  <template>
2
- <div v-if="items.length > 0" class="q-pa-sm row">
3
- <template v-for="item in items" :key="item._id">
4
- <div :class="itemClass">
5
- <component
6
- :id="item._id"
7
- :service="service"
8
- :item="item"
9
- :contextId="contextId"
10
- :is="rendererComponent"
11
- v-bind="renderer"
12
- @item-selected="onItemSelected" />
2
+ <div class="fit column no-wrap">
3
+ <!--
4
+ Header
5
+ -->
6
+ <div id="grid-header">
7
+ <slot name="header">
8
+ <KPanel :content="header" :class="headerClass" />
9
+ </slot>
10
+ </div>
11
+ <!--
12
+ Content
13
+ -->
14
+ <div v-if="items && items.length > 0"
15
+ id="grid-content"
16
+ ref="contentRef"
17
+ class="col scroll"
18
+ >
19
+ <!-- Infinite mode -->
20
+ <div v-if="appendItems" class="column">
21
+ <q-infinite-scroll
22
+ @load="onLoad"
23
+ :initial-index="1"
24
+ :offset="200"
25
+ v-scroll="onScroll"
26
+ class="col"
27
+ >
28
+ <div class="row">
29
+ <template v-for="(item, index) in items" :key="item._id">
30
+ <div :class="rendererClass">
31
+ <component
32
+ :id="item._id"
33
+ :ref="onItemRendered"
34
+ :service="service"
35
+ :item="item"
36
+ :contextId="contextId"
37
+ :is="itemRenderer"
38
+ v-bind="renderer"
39
+ @item-selected="onItemSelected"
40
+ />
41
+ </div>
42
+ </template>
43
+ </div>
44
+ </q-infinite-scroll>
45
+ </div>
46
+ <!-- Paginated mode -->
47
+ <div v-else class="row">
48
+ <template v-for="item in items" :key="item._id">
49
+ <div :class="rendererClass">
50
+ <component
51
+ :id="item._id"
52
+ :ref="onItemRendered"
53
+ :service="service"
54
+ :item="item"
55
+ :contextId="contextId"
56
+ :is="itemRenderer"
57
+ v-bind="renderer"
58
+ @item-selected="onItemSelected"
59
+ />
60
+ </div>
61
+ </template>
13
62
  </div>
14
- </template>
15
- <div v-if="nbPages > 1" class="col-12">
16
- <q-pagination
17
- class="justify-center q-ma-md"
18
- v-model="currentPage"
19
- :max="nbPages"
20
- :input="true"
21
- @update:model-value="refreshCollection"
22
- />
23
63
  </div>
24
- </div>
25
- <div v-else>
26
- <slot name="empty-section">
27
- <div class="row justify-center">
28
- <KStamp icon="las la-exclamation-circle" icon-size="1.6rem" :text="$t('KGrid.EMPTY_GRID')" direction="horizontal" />
64
+ <!-- Empty slot -->
65
+ <div v-else-if="items && items.length === 0"
66
+ id="grid-empty"
67
+ >
68
+ <slot name="empty">
69
+ <div class="row justify-center">
70
+ <KStamp
71
+ icon="las la-exclamation-circle"
72
+ icon-size="1.6rem"
73
+ :text="$t('KGrid.EMPTY_LABEL')"
74
+ direction="horizontal"
75
+ class="q-pa-md"
76
+ />
77
+ </div>
78
+ </slot>
79
+ </div>
80
+ <!-- Initializing slot -->
81
+ <div v-else id="grid-initializing">
82
+ <slot name="initializing">
83
+ <div class="row justify-center">
84
+ <q-spinner
85
+ color="primary"
86
+ size="2rem"
87
+ />
88
+ </div>
89
+ </slot>
90
+ </div>
91
+ <!--
92
+ Controls
93
+ -->
94
+ <div id="grid-controls">
95
+ <div v-if="appendItems">
96
+ <!-- scroll -->
97
+ <div v-if="contentRef" class="row items-center">
98
+ <div class="col-4"></div>
99
+ <div class="col-4 row justify-center">
100
+ <KScrollDown
101
+ v-if="scrollDown"
102
+ :ref="scrollDownRefCreated"
103
+ target="grid-content"
104
+ :loading="loadDoneFunction ? true : false"
105
+ />
106
+ </div>
107
+ <div class="col-4 row justify-end">
108
+ <KScrollToTop
109
+ v-if="scrollToTop"
110
+ :ref="scrollToTopRefCreated"
111
+ target="grid-content"
112
+ />
113
+ </div>
114
+ </div>
29
115
  </div>
30
- </slot>
116
+ <!-- pagination -->
117
+ <div v-else>
118
+ <div v-if="nbPages > 1" class="row justify-center">
119
+ <q-pagination
120
+ v-model="currentPage"
121
+ :max="nbPages"
122
+ :input="true"
123
+ @update:model-value="refreshCollection"
124
+ />
125
+ </div>
126
+ </div>
127
+
128
+ </div>
129
+ <!--
130
+ Footer
131
+ -->
132
+ <div id="grid-footer">
133
+ <slot name="footer">
134
+ <KPanel :content="footer" :class="footerClass" />
135
+ </slot>
136
+ </div>
31
137
  </div>
32
138
  </template>
33
139
 
34
140
  <script setup>
35
- import { computed, watch, toRefs, onBeforeMount, onBeforeUnmount } from 'vue'
36
- import KStamp from '../KStamp.vue'
37
- import { Events } from '../../events.js'
141
+ import { ref, computed, watch, toRefs, onBeforeMount, onBeforeUnmount } from 'vue'
38
142
  import { useCollection } from '../../composables'
143
+ import { Events } from '../../events.js'
39
144
  import { loadComponent } from '../../utils'
40
-
41
- const emit = defineEmits(['selection-changed', 'collection-refreshed'])
145
+ import KScrollToTop from './KScrollToTop.vue'
146
+ import KScrollDown from './KScrollDown.vue'
147
+ import KStamp from '../KStamp.vue'
148
+ import KPanel from '../KPanel.vue'
42
149
 
43
150
  // Props
44
151
  const props = defineProps({
45
- renderer: {
46
- type: Object,
47
- default: () => {
48
- return {
49
- component: 'collection/KCard'
50
- }
51
- }
52
- },
53
152
  contextId: {
54
153
  type: String,
55
154
  default: undefined
@@ -66,45 +165,126 @@ const props = defineProps({
66
165
  type: Object,
67
166
  default: () => {}
68
167
  },
69
- listStrategy: {
70
- type: String,
71
- default: 'smart'
168
+ renderer: {
169
+ type: Object,
170
+ default: () => {
171
+ return {
172
+ component: 'collection/KCard'
173
+ }
174
+ }
175
+ },
176
+ processor: {
177
+ type: Function,
178
+ default: undefined
179
+ },
180
+ appendItems: {
181
+ type: Boolean,
182
+ default: false
72
183
  },
73
184
  nbItemsPerPage: {
74
185
  type: Number,
75
186
  default: 12
76
187
  },
77
- processor: {
78
- type: Function,
188
+ listStrategy: {
189
+ type: String,
190
+ default: 'smart'
191
+ },
192
+ scrollDown: {
193
+ type: Boolean,
194
+ default: true
195
+ },
196
+ scrollToTop: {
197
+ type: Boolean,
198
+ default: true
199
+ },
200
+ header: {
201
+ type: [Array, Object],
202
+ default: () => null
203
+ },
204
+ headerClass: {
205
+ type: String,
206
+ default: undefined
207
+ },
208
+ footer: {
209
+ type: [Array, Object],
210
+ default: () => null
211
+ },
212
+ footerClass: {
213
+ type: String,
79
214
  default: undefined
215
+ },
216
+ dense: {
217
+ type: Boolean,
218
+ default: false
80
219
  }
81
220
  })
82
221
 
222
+ // Emits
223
+ const emit = defineEmits(['collection-refreshed', 'selection-changed'])
224
+
225
+ // Data
226
+ const { items, nbTotalItems, nbPages, currentPage, refreshCollection, resetCollection } = useCollection(toRefs(props))
227
+ const contentRef = ref(null)
228
+ const scrollDownRef = ref(null)
229
+ const scrollToTopRef = ref(null)
230
+ const loadDoneFunction = ref(null)
231
+
83
232
  // Computed
84
- const rendererComponent = computed(() => loadComponent(props.renderer.component))
85
- const itemClass = computed(() => props.renderer.class || 'q-pa-sm col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2')
233
+ const itemRenderer = computed(() => {
234
+ return loadComponent(props.renderer.component)
235
+ })
236
+ const rendererClass = computed(() => {
237
+ return props.renderer.class || 'q-pa-sm col-12 col-sm-6 col-md-4 col-lg-3'
238
+ })
239
+
240
+ // Watch
241
+ watch(items, onCollectionRefreshed)
86
242
 
87
243
  // Functions
244
+ function onItemRendered (instance) {
245
+ if (instance) onScroll()
246
+ }
247
+ function scrollDownRefCreated (instance) {
248
+ scrollDownRef.value = instance
249
+ if (instance) instance.refresh()
250
+ }
251
+ function scrollToTopRefCreated (instance) {
252
+ scrollToTopRef.value = instance
253
+ if (instance) instance.refresh()
254
+ }
255
+ function onScroll () {
256
+ if (scrollDownRef.value) scrollDownRef.value.refresh()
257
+ if (scrollToTopRef.value) scrollToTopRef.value.refresh()
258
+ }
259
+ function onLoad (index, done) {
260
+ // check whether the items are all loaded yet
261
+ if (items.value.length === nbTotalItems.value) {
262
+ done(true)
263
+ return
264
+ }
265
+ // set the current page and tell the collection to be refreshed
266
+ currentPage.value = index
267
+ refreshCollection()
268
+ loadDoneFunction.value = done
269
+ }
88
270
  function onItemSelected (item, section) {
89
271
  emit('selection-changed', item, section)
90
272
  }
91
273
  function onCollectionRefreshed () {
92
274
  emit('collection-refreshed', items.value)
275
+ // call done callback if needed
276
+ if (loadDoneFunction.value) {
277
+ loadDoneFunction.value(items.value.length === nbTotalItems.value)
278
+ loadDoneFunction.value = null
279
+ }
93
280
  }
94
281
 
95
- const { items, nbTotalItems, nbPages, currentPage, refreshCollection, resetCollection } = useCollection(toRefs(props))
96
-
97
- // Lifecycle hooks
98
-
99
- // Emit events so that embbeding components can be aware of it
100
- watch(items, onCollectionRefreshed)
101
-
282
+ // Hooks
102
283
  onBeforeMount(() => {
103
284
  refreshCollection()
104
285
  // Whenever the user abilities are updated, update collection as well
105
286
  Events.on('user-abilities-changed', refreshCollection)
106
287
  })
107
-
108
288
  onBeforeUnmount(() => {
109
289
  Events.off('user-abilities-changed', refreshCollection)
110
290
  })
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div>
3
+ <q-spinner v-if="loading"
4
+ color="primary"
5
+ :size="size"
6
+ />
7
+ <KAction v-else
8
+ v-if="isVisible"
9
+ id="scroll-down"
10
+ :color="color"
11
+ :icon="icon"
12
+ :size="size"
13
+ :handler="scrollOnce"
14
+ />
15
+ </div>
16
+ </template>
17
+
18
+ <script setup>
19
+ import _ from 'lodash'
20
+ import logger from 'loglevel'
21
+ import { ref, watch } from 'vue'
22
+ import { useQuasar, scroll as qScrollUtils } from 'quasar'
23
+ import { clamp } from '../../utils'
24
+
25
+ // Props
26
+ const props = defineProps({
27
+ target: {
28
+ type: String,
29
+ required: true
30
+ },
31
+ color: {
32
+ type: String,
33
+ default: 'grey-7'
34
+ },
35
+ icon: {
36
+ type: String,
37
+ default: 'las la-angle-double-down'
38
+ },
39
+ size: {
40
+ type: String,
41
+ default: 'md'
42
+ },
43
+ loading: {
44
+ type: Boolean,
45
+ default: false
46
+ },
47
+ duration: {
48
+ type: Number,
49
+ default: 200
50
+ }
51
+ })
52
+
53
+ // Data
54
+ const $q = useQuasar()
55
+ const isVisible = ref(false)
56
+
57
+ // Watch
58
+ watch(() => [$q.screen.width, $q.screen.height], () => {
59
+ refresh()
60
+ })
61
+
62
+ // Functions
63
+ const refresh = _.debounce(() => {
64
+ const targetElement = document.getElementById(props.target)
65
+ if (!targetElement) {
66
+ logger.error('[KDK] Cannot find target element')
67
+ return
68
+ }
69
+ const containerHeight = targetElement.offsetHeight
70
+ const scrollHeight = qScrollUtils.getScrollHeight(targetElement)
71
+ const diff = scrollHeight - containerHeight
72
+ if (diff <= 0) isVisible.value = false
73
+ else {
74
+ const ratio = clamp(qScrollUtils.getVerticalScrollPosition(targetElement) / diff, 0, 1)
75
+ const percent = Math.round(ratio * 10000) / 10000
76
+ isVisible.value = percent < 0.99
77
+ }
78
+ logger.trace(`[KDK] (KScrollDown) Refreshed with visibility: ${isVisible.value}`)
79
+ }, 100)
80
+ function scrollOnce () {
81
+ const targetElement = document.getElementById(props.target)
82
+ if (!targetElement) {
83
+ logger.error('[KDK] Cannot find target element')
84
+ return
85
+ }
86
+ const position = qScrollUtils.getVerticalScrollPosition(targetElement)
87
+ const offset = targetElement.offsetHeight * 0.75
88
+ qScrollUtils.setVerticalScrollPosition(targetElement, position + offset, props.duration)
89
+ logger.trace(`[KDK] (KScrollDown) Scrolled down with offset: ${offset}`)
90
+ refresh()
91
+ }
92
+
93
+ // Expose
94
+ defineExpose({
95
+ refresh
96
+ })
97
+ </script>
@@ -0,0 +1,93 @@
1
+ <template>
2
+ <div class="k-scroll-to-top">
3
+ <KAction
4
+ v-if="isVisible"
5
+ id="scroll-to-top"
6
+ tooltip="KScrollToTop.TOOLTIP"
7
+ :icon="icon"
8
+ :color="color"
9
+ :flat="false"
10
+ :size="size"
11
+ :handler="scrollToTop"
12
+ />
13
+ </div>
14
+ </template>
15
+
16
+ <script setup>
17
+ import _ from 'lodash'
18
+ import logger from 'loglevel'
19
+ import { ref, watch } from 'vue'
20
+ import { useQuasar, scroll as qScrollUtils } from 'quasar'
21
+ import { DefaultZIndex } from '../../layout.js'
22
+
23
+ // Props
24
+ const props = defineProps({
25
+ target: {
26
+ type: String,
27
+ required: true
28
+ },
29
+ color: {
30
+ type: String,
31
+ default: 'grey-7'
32
+ },
33
+ icon: {
34
+ type: String,
35
+ default: 'las la-arrow-up'
36
+ },
37
+ size: {
38
+ type: String,
39
+ default: 'md'
40
+ },
41
+ duration: {
42
+ type: Number,
43
+ default: 300
44
+ },
45
+ zIndex: {
46
+ type: Number,
47
+ default: () => { return DefaultZIndex.fab }
48
+ }
49
+ })
50
+
51
+ // Data
52
+ const $q = useQuasar()
53
+ const isVisible = ref(false)
54
+
55
+ // Watch
56
+ watch(() => [$q.screen.width, $q.screen.height], () => {
57
+ refresh()
58
+ })
59
+
60
+ // Functions
61
+ const refresh = _.debounce(() => {
62
+ const targetElement = document.getElementById(props.target)
63
+ if (!targetElement) {
64
+ logger.error('[KDK] Cannot find target element')
65
+ return
66
+ }
67
+ isVisible.value = qScrollUtils.getVerticalScrollPosition(targetElement) > 0
68
+ logger.trace(`[KDK] (KScrollToTop) Refreshed with visibility: ${isVisible.value}`)
69
+ }, 100)
70
+ function scrollToTop () {
71
+ const targetElement = document.getElementById(props.target)
72
+ if (!targetElement) {
73
+ logger.error('[KDK] Cannot find target element')
74
+ return
75
+ }
76
+ qScrollUtils.setVerticalScrollPosition(targetElement, 0, props.duration)
77
+ logger.trace('[KDK] (KScrollToTop) Scrolled to top')
78
+ refresh()
79
+ }
80
+
81
+ // Expose
82
+ defineExpose({
83
+ refresh
84
+ })
85
+ </script>
86
+
87
+ <style lang="scss" scoped>
88
+ .k-scroll-to-top {
89
+ position: relative;
90
+ transform: translate(-48px, -24px);
91
+ z-index: v-bind(zIndex);
92
+ }
93
+ </style>