@kalisio/kdk 2.3.2 → 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 (441) 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 +62 -49
  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 +54 -32
  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/base.css +224 -0
  95. package/coverage/block-navigation.js +87 -0
  96. package/coverage/core/api/application.js.html +1870 -0
  97. package/coverage/core/api/authentication.js.html +742 -0
  98. package/coverage/core/api/db.js.html +793 -0
  99. package/coverage/core/api/hooks/hooks.authentication.js.html +313 -0
  100. package/coverage/core/api/hooks/hooks.authorisations.js.html +1243 -0
  101. package/coverage/core/api/hooks/hooks.groups.js.html +229 -0
  102. package/coverage/core/api/hooks/hooks.logger.js.html +163 -0
  103. package/coverage/core/api/hooks/hooks.model.js.html +955 -0
  104. package/coverage/core/api/hooks/hooks.organisations.js.html +541 -0
  105. package/coverage/core/api/hooks/hooks.push.js.html +253 -0
  106. package/coverage/core/api/hooks/hooks.query.js.html +862 -0
  107. package/coverage/core/api/hooks/hooks.schemas.js.html +298 -0
  108. package/coverage/core/api/hooks/hooks.service.js.html +319 -0
  109. package/coverage/core/api/hooks/hooks.storage.js.html +193 -0
  110. package/coverage/core/api/hooks/hooks.users.js.html +868 -0
  111. package/coverage/core/api/hooks/index.html +296 -0
  112. package/coverage/core/api/hooks/index.js.html +121 -0
  113. package/coverage/core/api/index.html +191 -0
  114. package/coverage/core/api/index.js.html +148 -0
  115. package/coverage/core/api/marshall.js.html +448 -0
  116. package/coverage/core/api/models/groups.model.mongodb.js.html +109 -0
  117. package/coverage/core/api/models/index.html +176 -0
  118. package/coverage/core/api/models/messages.model.mongodb.js.html +121 -0
  119. package/coverage/core/api/models/organisations.model.mongodb.js.html +94 -0
  120. package/coverage/core/api/models/tags.model.mongodb.js.html +115 -0
  121. package/coverage/core/api/models/users.model.mongodb.js.html +115 -0
  122. package/coverage/core/api/services/account/account.hooks.js.html +208 -0
  123. package/coverage/core/api/services/account/account.service.js.html +436 -0
  124. package/coverage/core/api/services/account/index.html +131 -0
  125. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  126. package/coverage/core/api/services/authorisations/authorisations.service.js.html +529 -0
  127. package/coverage/core/api/services/authorisations/index.html +131 -0
  128. package/coverage/core/api/services/databases/databases.hooks.js.html +193 -0
  129. package/coverage/core/api/services/databases/databases.service.js.html +100 -0
  130. package/coverage/core/api/services/databases/index.html +131 -0
  131. package/coverage/core/api/services/groups/groups.hooks.js.html +178 -0
  132. package/coverage/core/api/services/groups/index.html +116 -0
  133. package/coverage/core/api/services/import-export/import-export.hooks.js.html +184 -0
  134. package/coverage/core/api/services/import-export/import-export.service.js.html +118 -0
  135. package/coverage/core/api/services/import-export/index.html +131 -0
  136. package/coverage/core/api/services/index.html +116 -0
  137. package/coverage/core/api/services/index.js.html +556 -0
  138. package/coverage/core/api/services/mailer/index.html +131 -0
  139. package/coverage/core/api/services/mailer/mailer.hooks.js.html +190 -0
  140. package/coverage/core/api/services/mailer/mailer.service.js.html +118 -0
  141. package/coverage/core/api/services/messages/index.html +116 -0
  142. package/coverage/core/api/services/messages/messages.hooks.js.html +199 -0
  143. package/coverage/core/api/services/organisations/index.html +131 -0
  144. package/coverage/core/api/services/organisations/organisations.hooks.js.html +178 -0
  145. package/coverage/core/api/services/organisations/organisations.service.js.html +343 -0
  146. package/coverage/core/api/services/push/index.html +131 -0
  147. package/coverage/core/api/services/push/push.hooks.js.html +190 -0
  148. package/coverage/core/api/services/push/push.service.js.html +121 -0
  149. package/coverage/core/api/services/storage/index.html +131 -0
  150. package/coverage/core/api/services/storage/storage.hooks.js.html +190 -0
  151. package/coverage/core/api/services/storage/storage.service.js.html +172 -0
  152. package/coverage/core/api/services/tags/index.html +116 -0
  153. package/coverage/core/api/services/tags/tags.hooks.js.html +178 -0
  154. package/coverage/core/api/services/users/index.html +116 -0
  155. package/coverage/core/api/services/users/users.hooks.js.html +307 -0
  156. package/coverage/core/api/utils.js.html +118 -0
  157. package/coverage/core/common/errors.js.html +88 -0
  158. package/coverage/core/common/index.html +176 -0
  159. package/coverage/core/common/index.js.html +115 -0
  160. package/coverage/core/common/permissions.js.html +1048 -0
  161. package/coverage/core/common/schema.js.html +190 -0
  162. package/coverage/core/common/utils.js.html +220 -0
  163. package/coverage/favicon.png +0 -0
  164. package/coverage/index.html +506 -0
  165. package/coverage/lcov-report/base.css +224 -0
  166. package/coverage/lcov-report/block-navigation.js +87 -0
  167. package/coverage/lcov-report/core/api/application.js.html +1870 -0
  168. package/coverage/lcov-report/core/api/authentication.js.html +742 -0
  169. package/coverage/lcov-report/core/api/db.js.html +793 -0
  170. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +313 -0
  171. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +1243 -0
  172. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +229 -0
  173. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +163 -0
  174. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +955 -0
  175. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +541 -0
  176. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +253 -0
  177. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +862 -0
  178. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +298 -0
  179. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +319 -0
  180. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +193 -0
  181. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +868 -0
  182. package/coverage/lcov-report/core/api/hooks/index.html +296 -0
  183. package/coverage/lcov-report/core/api/hooks/index.js.html +121 -0
  184. package/coverage/lcov-report/core/api/index.html +191 -0
  185. package/coverage/lcov-report/core/api/index.js.html +148 -0
  186. package/coverage/lcov-report/core/api/marshall.js.html +448 -0
  187. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +109 -0
  188. package/coverage/lcov-report/core/api/models/index.html +176 -0
  189. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +121 -0
  190. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +94 -0
  191. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +115 -0
  192. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +115 -0
  193. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +208 -0
  194. package/coverage/lcov-report/core/api/services/account/account.service.js.html +436 -0
  195. package/coverage/lcov-report/core/api/services/account/index.html +131 -0
  196. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +184 -0
  197. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +529 -0
  198. package/coverage/lcov-report/core/api/services/authorisations/index.html +131 -0
  199. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +193 -0
  200. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +100 -0
  201. package/coverage/lcov-report/core/api/services/databases/index.html +131 -0
  202. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +178 -0
  203. package/coverage/lcov-report/core/api/services/groups/index.html +116 -0
  204. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +184 -0
  205. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +118 -0
  206. package/coverage/lcov-report/core/api/services/import-export/index.html +131 -0
  207. package/coverage/lcov-report/core/api/services/index.html +116 -0
  208. package/coverage/lcov-report/core/api/services/index.js.html +556 -0
  209. package/coverage/lcov-report/core/api/services/mailer/index.html +131 -0
  210. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +190 -0
  211. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +118 -0
  212. package/coverage/lcov-report/core/api/services/messages/index.html +116 -0
  213. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +199 -0
  214. package/coverage/lcov-report/core/api/services/organisations/index.html +131 -0
  215. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +178 -0
  216. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +343 -0
  217. package/coverage/lcov-report/core/api/services/push/index.html +131 -0
  218. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +190 -0
  219. package/coverage/lcov-report/core/api/services/push/push.service.js.html +121 -0
  220. package/coverage/lcov-report/core/api/services/storage/index.html +131 -0
  221. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +190 -0
  222. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +172 -0
  223. package/coverage/lcov-report/core/api/services/tags/index.html +116 -0
  224. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +178 -0
  225. package/coverage/lcov-report/core/api/services/users/index.html +116 -0
  226. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +307 -0
  227. package/coverage/lcov-report/core/api/utils.js.html +118 -0
  228. package/coverage/lcov-report/core/common/errors.js.html +88 -0
  229. package/coverage/lcov-report/core/common/index.html +176 -0
  230. package/coverage/lcov-report/core/common/index.js.html +115 -0
  231. package/coverage/lcov-report/core/common/permissions.js.html +1048 -0
  232. package/coverage/lcov-report/core/common/schema.js.html +190 -0
  233. package/coverage/lcov-report/core/common/utils.js.html +220 -0
  234. package/coverage/lcov-report/favicon.png +0 -0
  235. package/coverage/lcov-report/index.html +506 -0
  236. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +457 -0
  237. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +397 -0
  238. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1309 -0
  239. package/coverage/lcov-report/map/api/hooks/index.html +161 -0
  240. package/coverage/lcov-report/map/api/hooks/index.js.html +94 -0
  241. package/coverage/lcov-report/map/api/index.html +131 -0
  242. package/coverage/lcov-report/map/api/index.js.html +139 -0
  243. package/coverage/lcov-report/map/api/marshall.js.html +178 -0
  244. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +106 -0
  245. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +127 -0
  246. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +196 -0
  247. package/coverage/lcov-report/map/api/models/index.html +161 -0
  248. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +109 -0
  249. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +274 -0
  250. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +610 -0
  251. package/coverage/lcov-report/map/api/services/alerts/index.html +131 -0
  252. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +310 -0
  253. package/coverage/lcov-report/map/api/services/catalog/index.html +116 -0
  254. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  255. package/coverage/lcov-report/map/api/services/daptiles/index.html +116 -0
  256. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +241 -0
  257. package/coverage/lcov-report/map/api/services/features/features.service.js.html +241 -0
  258. package/coverage/lcov-report/map/api/services/features/index.html +131 -0
  259. package/coverage/lcov-report/map/api/services/index.html +116 -0
  260. package/coverage/lcov-report/map/api/services/index.js.html +817 -0
  261. package/coverage/lcov-report/map/api/services/projects/index.html +116 -0
  262. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +439 -0
  263. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +466 -0
  264. package/coverage/lcov-report/map/common/errors.js.html +94 -0
  265. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +541 -0
  266. package/coverage/lcov-report/map/common/grid.js.html +1612 -0
  267. package/coverage/lcov-report/map/common/index.html +371 -0
  268. package/coverage/lcov-report/map/common/index.js.html +172 -0
  269. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +556 -0
  270. package/coverage/lcov-report/map/common/moment-utils.js.html +157 -0
  271. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +868 -0
  272. package/coverage/lcov-report/map/common/opendap-utils.js.html +826 -0
  273. package/coverage/lcov-report/map/common/permissions.js.html +124 -0
  274. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +418 -0
  275. package/coverage/lcov-report/map/common/tms-utils.js.html +274 -0
  276. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +364 -0
  277. package/coverage/lcov-report/map/common/wcs-utils.js.html +586 -0
  278. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1033 -0
  279. package/coverage/lcov-report/map/common/wfs-utils.js.html +574 -0
  280. package/coverage/lcov-report/map/common/wms-utils.js.html +451 -0
  281. package/coverage/lcov-report/map/common/wmts-utils.js.html +547 -0
  282. package/coverage/lcov-report/prettify.css +1 -0
  283. package/coverage/lcov-report/prettify.js +2 -0
  284. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  285. package/coverage/lcov-report/sorter.js +196 -0
  286. package/coverage/lcov.info +11245 -0
  287. package/coverage/map/api/hooks/hooks.catalog.js.html +457 -0
  288. package/coverage/map/api/hooks/hooks.features.js.html +397 -0
  289. package/coverage/map/api/hooks/hooks.query.js.html +1309 -0
  290. package/coverage/map/api/hooks/index.html +161 -0
  291. package/coverage/map/api/hooks/index.js.html +94 -0
  292. package/coverage/map/api/index.html +131 -0
  293. package/coverage/map/api/index.js.html +139 -0
  294. package/coverage/map/api/marshall.js.html +178 -0
  295. package/coverage/map/api/models/alerts.model.mongodb.js.html +106 -0
  296. package/coverage/map/api/models/catalog.model.mongodb.js.html +127 -0
  297. package/coverage/map/api/models/features.model.mongodb.js.html +196 -0
  298. package/coverage/map/api/models/index.html +161 -0
  299. package/coverage/map/api/models/projects.model.mongodb.js.html +109 -0
  300. package/coverage/map/api/services/alerts/alerts.hooks.js.html +274 -0
  301. package/coverage/map/api/services/alerts/alerts.service.js.html +610 -0
  302. package/coverage/map/api/services/alerts/index.html +131 -0
  303. package/coverage/map/api/services/catalog/catalog.hooks.js.html +310 -0
  304. package/coverage/map/api/services/catalog/index.html +116 -0
  305. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1510 -0
  306. package/coverage/map/api/services/daptiles/index.html +116 -0
  307. package/coverage/map/api/services/features/features.hooks.js.html +241 -0
  308. package/coverage/map/api/services/features/features.service.js.html +241 -0
  309. package/coverage/map/api/services/features/index.html +131 -0
  310. package/coverage/map/api/services/index.html +116 -0
  311. package/coverage/map/api/services/index.js.html +817 -0
  312. package/coverage/map/api/services/projects/index.html +116 -0
  313. package/coverage/map/api/services/projects/projects.hooks.js.html +439 -0
  314. package/coverage/map/common/dynamic-grid-source.js.html +466 -0
  315. package/coverage/map/common/errors.js.html +94 -0
  316. package/coverage/map/common/geotiff-grid-source.js.html +541 -0
  317. package/coverage/map/common/grid.js.html +1612 -0
  318. package/coverage/map/common/index.html +371 -0
  319. package/coverage/map/common/index.js.html +172 -0
  320. package/coverage/map/common/meteo-model-grid-source.js.html +556 -0
  321. package/coverage/map/common/moment-utils.js.html +157 -0
  322. package/coverage/map/common/opendap-grid-source.js.html +868 -0
  323. package/coverage/map/common/opendap-utils.js.html +826 -0
  324. package/coverage/map/common/permissions.js.html +124 -0
  325. package/coverage/map/common/time-based-grid-source.js.html +418 -0
  326. package/coverage/map/common/tms-utils.js.html +274 -0
  327. package/coverage/map/common/wcs-grid-source.js.html +364 -0
  328. package/coverage/map/common/wcs-utils.js.html +586 -0
  329. package/coverage/map/common/weacast-grid-source.js.html +1033 -0
  330. package/coverage/map/common/wfs-utils.js.html +574 -0
  331. package/coverage/map/common/wms-utils.js.html +451 -0
  332. package/coverage/map/common/wmts-utils.js.html +547 -0
  333. package/coverage/prettify.css +1 -0
  334. package/coverage/prettify.js +2 -0
  335. package/coverage/sort-arrow-sprite.png +0 -0
  336. package/coverage/sorter.js +196 -0
  337. package/coverage/tmp/coverage-280506-1731704745613-0.json +1 -0
  338. package/coverage/tmp/coverage-280518-1731704745599-0.json +1 -0
  339. package/coverage/tmp/coverage-280529-1731704745588-0.json +1 -0
  340. package/coverage/tmp/coverage-280541-1731704745574-0.json +1 -0
  341. package/coverage/tmp/coverage-280548-1731704745545-0.json +1 -0
  342. package/extras/css/core.variables.scss +32 -8
  343. package/extras/icons/attribution.png +0 -0
  344. package/map/api/services/catalog/catalog.hooks.js +5 -7
  345. package/map/api/services/features/features.hooks.js +1 -1
  346. package/map/client/cesium/utils/utils.style.js +11 -2
  347. package/map/client/components/KAttribution.vue +108 -0
  348. package/map/client/components/KPositionIndicator.vue +11 -18
  349. package/map/client/components/KProjectMenu.vue +4 -4
  350. package/map/client/components/catalog/KCategoryItem.vue +74 -0
  351. package/map/client/components/catalog/KLayerCategories.vue +24 -12
  352. package/map/client/components/catalog/KLayersPanel.vue +139 -116
  353. package/map/client/components/catalog/KProjectSelector.vue +29 -17
  354. package/map/client/components/catalog/KProjectsPanel.vue +19 -35
  355. package/map/client/components/catalog/KViewSelector.vue +37 -25
  356. package/map/client/components/catalog/KViewsPanel.vue +19 -35
  357. package/map/client/components/form/KLocationField.vue +1 -2
  358. package/map/client/components/legend/KLegend.vue +34 -34
  359. package/map/client/components/location/KLocationCardSection.vue +18 -22
  360. package/map/client/components/location/KLocationMap.vue +36 -38
  361. package/map/client/components/location/KLocationTimeLineCard.vue +147 -0
  362. package/map/client/components/location/KLocationTip.vue +12 -2
  363. package/map/client/components/widget/KInformationBox.vue +0 -4
  364. package/map/client/components/widget/KStackableTimeSeries.vue +8 -1
  365. package/map/client/components/widget/KTimeSeries.vue +1 -1
  366. package/map/client/composables/highlight.js +29 -31
  367. package/map/client/composables/probe.js +7 -3
  368. package/map/client/composables/weather.js +71 -31
  369. package/map/client/i18n/map_en.json +3 -0
  370. package/map/client/i18n/map_fr.json +3 -0
  371. package/map/client/init.js +4 -3
  372. package/map/client/leaflet/ShapeMarker.js +1 -1
  373. package/map/client/leaflet/utils/utils.events.js +1 -1
  374. package/map/client/leaflet/utils/utils.style.js +20 -8
  375. package/map/client/mixins/globe/mixin.base-globe.js +111 -13
  376. package/map/client/mixins/globe/mixin.file-layers.js +10 -10
  377. package/map/client/mixins/globe/mixin.geojson-layers.js +90 -15
  378. package/map/client/mixins/globe/mixin.style.js +2 -0
  379. package/map/client/mixins/index.js +0 -1
  380. package/map/client/mixins/map/index.js +1 -0
  381. package/map/client/mixins/map/mixin.base-map.js +21 -2
  382. package/map/client/mixins/map/mixin.canvas-layers.js +7 -2
  383. package/map/client/mixins/map/mixin.edit-layers.js +12 -4
  384. package/map/client/mixins/map/mixin.file-layers.js +3 -0
  385. package/map/client/mixins/map/mixin.geojson-layers.js +90 -5
  386. package/map/client/mixins/map/mixin.pmtiles-layers.js +106 -0
  387. package/map/client/mixins/mixin.activity.js +8 -3
  388. package/map/client/mixins/mixin.feature-service.js +73 -32
  389. package/map/client/mixins/mixin.levels.js +1 -0
  390. package/map/client/mixins/mixin.weacast.js +10 -87
  391. package/map/client/utils/index.js +1 -0
  392. package/map/client/utils/utils.capture.js +1 -1
  393. package/map/client/utils/utils.catalog.js +7 -7
  394. package/map/client/utils/utils.features.js +59 -1
  395. package/map/client/utils/utils.layers.js +8 -0
  396. package/map/client/utils/utils.time-series.js +121 -0
  397. package/map/client/utils/utils.weacast.js +102 -0
  398. package/package.json +6 -6
  399. package/scripts/init_runner.sh +2 -2
  400. package/scripts/kash/CHANGELOG.md +12 -0
  401. package/scripts/kash/README.md +2 -0
  402. package/scripts/kash/kash.sh +34 -32
  403. package/scripts/run_tests.sh +2 -2
  404. package/scripts/setup_workspace.sh +24 -6
  405. package/test/api/core/hooks.test.js +6 -3
  406. package/test/api/core/test-log-2023-12-19.log +7 -0
  407. package/test/api/core/test-log-2024-01-04.log +14 -0
  408. package/test/api/core/test-log-2024-05-14.log +6 -0
  409. package/test/api/core/{test-log-2024-04-23.log → test-log-2024-06-06.log} +3 -3
  410. package/test/api/core/test-log-2024-06-26.log +25 -0
  411. package/test/api/core/test-log-2024-06-28.log +2 -0
  412. package/test/api/core/test-log-2024-07-09.log +0 -0
  413. package/test/api/core/test-log-2024-08-13.log +69 -0
  414. package/test/api/core/test-log-2024-10-28.log +53 -0
  415. package/test/api/core/test-log-2024-11-05.log +30 -0
  416. package/test/api/core/test-log-2024-11-15.log +23 -0
  417. package/test/api/map/alerts.test.js +3 -1
  418. package/test/api/map/config/layers.json +3 -1
  419. package/test/api/map/index.test.js +18 -1
  420. package/test/api/map/test-log-2023-11-24.log +121 -0
  421. package/test/api/map/test-log-2023-12-12.log +29 -0
  422. package/test/api/map/test-log-2023-12-13.log +5 -0
  423. package/test/api/map/test-log-2024-01-04.log +2 -0
  424. package/test/api/map/test-log-2024-01-11.log +1 -0
  425. package/test/api/map/test-log-2024-01-25.log +19 -0
  426. package/test/api/map/test-log-2024-06-06.log +39 -0
  427. package/test/api/map/test-log-2024-08-13.log +13 -0
  428. package/test/api/map/test-log-2024-08-20.log +55 -0
  429. package/test/api/map/test-log-2024-09-09.log +92 -0
  430. package/test/api/map/test-log-2024-10-28.log +11 -0
  431. package/test/client/core/utils.js +13 -0
  432. package/test/client/map/api.js +34 -0
  433. package/test/client/map/catalog.js +6 -2
  434. package/test/client/map/index.js +1 -0
  435. package/test/client/map/utils.js +4 -2
  436. package/core/client/components/collection/KList.vue +0 -135
  437. package/core/client/components/layout/KPageSticky.vue +0 -53
  438. package/core/client/mixins/mixin.base-collection.js +0 -162
  439. package/core/client/utils/utils.data.js +0 -22
  440. package/map/client/mixins/mixin.catalog-panel.js +0 -26
  441. package/test/api/core/test-log-2024-04-22.log +0 -84
@@ -1,5 +1,6 @@
1
1
  <template>
2
- <div v-if="items.length > 0">
2
+ <!-- Content -->
3
+ <div v-if="items && items.length > 0">
3
4
  <q-table
4
5
  :title="title"
5
6
  :rows="items"
@@ -18,6 +19,29 @@
18
19
  :display-value="$t('KTable.TABLE_COLUMNS')" emit-value map-options
19
20
  :options="selectableColumns" option-value="name" style="min-width: 150px"/>
20
21
  </template>
22
+ <template v-slot:body="props" v-if="hasRenderer">
23
+ <q-tr :props="props">
24
+ <q-td :props="props" key="actions" v-if="hasSelection">
25
+ <q-checkbox :model-value="props.selected" @update:model-value="(val) => props.selected = val" />
26
+ </q-td>
27
+ <q-td v-for="(item, index) in renderer" :key="item.key" :props="props">
28
+ <component
29
+ v-if="item.component"
30
+ :item="item"
31
+ :row="props.row"
32
+ :is="loadComponent(item.component)"
33
+ />
34
+ <p v-else>{{ props.row.properties[`${item.key}`] }}</p>
35
+ </q-td>
36
+ <q-td :props="props" key="actions">
37
+ <KPanel
38
+ id="item-actions"
39
+ :content="itemActions"
40
+ :context="{ item: props.row }"
41
+ />
42
+ </q-td>
43
+ </q-tr>
44
+ </template>
21
45
  <template v-slot:body-cell-actions="props">
22
46
  <q-td :props="props">
23
47
  <KPanel
@@ -29,12 +53,32 @@
29
53
  </template>
30
54
  </q-table>
31
55
  </div>
32
- <div v-else>
33
- <div slot="empty-section">
56
+ <!-- Empty slot -->
57
+ <div v-else-if="items && items.length === 0"
58
+ id="table-empty"
59
+ >
60
+ <slot name="empty">
61
+ <div class="row justify-center">
62
+ <KStamp
63
+ icon="las la-exclamation-circle"
64
+ icon-size="1.6rem"
65
+ :text="$t('KTable.EMPTY_TABLE')"
66
+ direction="horizontal"
67
+ class="q-pa-md"
68
+ />
69
+ </div>
70
+ </slot>
71
+ </div>
72
+ <!-- Initializing slot -->
73
+ <div v-else id="grid-initializing">
74
+ <slot name="initializing">
34
75
  <div class="row justify-center">
35
- <KStamp icon="las la-exclamation-circle" icon-size="1.6rem" :text="$t('KTable.EMPTY_TABLE')" direction="horizontal" />
76
+ <q-spinner
77
+ color="primary"
78
+ size="2rem"
79
+ />
36
80
  </div>
37
- </div>
81
+ </slot>
38
82
  </div>
39
83
  </template>
40
84
 
@@ -47,17 +91,16 @@ import KStamp from '../KStamp.vue'
47
91
  import { Events } from '../../events.js'
48
92
  import { i18n } from '../../i18n.js'
49
93
  import { useCollection, useSchema } from '../../composables'
94
+ import { loadComponent } from '../../utils/index.js'
50
95
 
51
96
  const emit = defineEmits(['selection-changed', 'collection-refreshed'])
52
97
 
53
98
  // Props
54
99
  const props = defineProps({
55
100
  renderer: {
56
- type: Object,
101
+ type: Array,
57
102
  default: () => {
58
- return {
59
- component: 'collection/KItem'
60
- }
103
+ return []
61
104
  }
62
105
  },
63
106
  itemActions: {
@@ -127,18 +170,31 @@ const pagination = ref({
127
170
  // Remove special column used for actions
128
171
  const selectableColumns = computed(() => columns.value.filter(column => column.name !== 'actions'))
129
172
  const filterQuery = computed(() => Object.assign({}, props.filterQuery, tableQuery.value))
173
+ const renderer = computed(() => props.renderer)
174
+ const hasRenderer = computed(() => _.isArray(props.renderer) && !_.isEmpty(props.renderer))
175
+ const hasSelection = computed(() => !_.isString(props.selection))
130
176
 
131
177
  const { schema, compile } = useSchema()
132
178
  // Add sort query into collection options
133
179
  const options = Object.assign({ filterQuery }, _.omit(toRefs(props), ['filterQuery']))
134
180
  const { items, nbTotalItems, nbPages, currentPage, refreshCollection, resetCollection } = useCollection(options)
135
181
 
182
+ // Watch
183
+ watch(items, onCollectionRefreshed)
184
+ watch(schema, () => {
185
+ processSchema()
186
+ resetCollection()
187
+ })
188
+ watch(() => props.schema, async (value) => {
189
+ await compile(props.schema || `${props.service}.get`)
190
+ })
191
+ watch(nbTotalItems, () => {
192
+ // Update pagination for table
193
+ pagination.value.rowsNumber = nbTotalItems.value
194
+ })
195
+
136
196
  // Functions
137
197
  function processSchema () {
138
- columns.value = [{
139
- name: 'actions',
140
- align: 'center'
141
- }]
142
198
  _.forOwn(schema.value.properties, (value, key) => {
143
199
  const type = _.get(value, 'type')
144
200
  // FIXME: allow for custom representation of complex objects
@@ -171,20 +227,27 @@ function processSchema () {
171
227
  }
172
228
  })
173
229
  })
230
+ columns.value.push({
231
+ name: 'actions',
232
+ align: 'center'
233
+ })
174
234
  visibleColumns.value = columns.value.map(column => column.name)
175
235
  }
176
236
  function onRequest (props) {
177
237
  const { page, rowsPerPage, sortBy, descending } = props.pagination
178
238
  const geoJson = (_.get(items.value, '[0].type') === 'Feature')
179
239
  currentPage.value = page
180
- tableQuery.value.$sort = { [geoJson ? `properties.${sortBy}` : sortBy]: (descending ? -1 : 1) }
240
+ if (pagination.value.descending !== descending || pagination.value.sortBy !== sortBy) {
241
+ sortBy === null ? tableQuery.value.$sort = { _id: 1 } : tableQuery.value.$sort = { [geoJson ? `properties.${sortBy}` : sortBy]: (descending ? -1 : 1) }
242
+ options.filterQuery.value = Object.assign({}, props.filterQuery, tableQuery.value)
243
+ } else {
244
+ refreshCollection()
245
+ }
181
246
  // Don't forget to update local pagination object
182
247
  pagination.value.page = page
183
248
  pagination.value.rowsPerPage = rowsPerPage
184
249
  pagination.value.sortBy = sortBy
185
250
  pagination.value.descending = descending
186
- // This will trigger a collection refresh, take care composable options are refs
187
- options.filterQuery.value = Object.assign({}, props.filterQuery, tableQuery.value)
188
251
  }
189
252
  function onSelectionChanged (data) {
190
253
  if (props.selection === 'single') {
@@ -199,29 +262,14 @@ function onCollectionRefreshed () {
199
262
  emit('collection-refreshed', items.value)
200
263
  }
201
264
 
202
- // Lifecycle hooks
203
-
204
- // Emit events so that embbeding components can be aware of it
205
- watch(items, onCollectionRefreshed)
206
- watch(schema, () => {
207
- processSchema()
208
- resetCollection()
209
- })
210
- watch(() => props.schema, async (value) => {
211
- await compile(props.schema || `${props.service}.get`)
212
- })
213
- watch(nbTotalItems, () => {
214
- // Update pagination for table
215
- pagination.value.rowsNumber = nbTotalItems.value
216
- })
217
-
265
+ // Hooks
218
266
  onBeforeMount(async () => {
219
267
  // This will launch collection refresh
220
268
  await compile(props.schema || `${props.service}.get`)
269
+ refreshCollection()
221
270
  // Whenever the user abilities are updated, update collection as well
222
271
  Events.on('user-abilities-changed', refreshCollection)
223
272
  })
224
-
225
273
  onBeforeUnmount(() => {
226
274
  Events.off('user-abilities-changed', refreshCollection)
227
275
  })
@@ -236,3 +284,9 @@ defineExpose({
236
284
  resetCollection
237
285
  })
238
286
  </script>
287
+
288
+ <style lang="scss" scoped>
289
+ p {
290
+ margin: 0;
291
+ }
292
+ </style>
@@ -0,0 +1,406 @@
1
+ <template>
2
+ <div class="fit column no-wrap">
3
+ <!--
4
+ Header
5
+ -->
6
+ <div id="timeline-header" class="q-pr-xs q-pb-xs">
7
+ <slot name="header">
8
+ <KPanel
9
+ :content="header"
10
+ :class="headerClass"
11
+ />
12
+ </slot>
13
+ </div>
14
+ <!--
15
+ Content
16
+ -->
17
+ <div v-if="items && items.length > 0"
18
+ id="timeline-content"
19
+ ref="contentRef"
20
+ class="col scroll"
21
+ >
22
+ <q-timeline
23
+ :layout="layout"
24
+ color="grey-7"
25
+ >
26
+ <q-infinite-scroll
27
+ @load="onLoad"
28
+ :initial-index="1"
29
+ :offset="200"
30
+ v-scroll="onScroll"
31
+ >
32
+ <template v-for="item in items" :key="item._id">
33
+ <!-- Heading entry if any -->
34
+ <q-timeline-entry
35
+ v-if="getHeading(item)"
36
+ :heading="true"
37
+ >
38
+ <div class="k-timeline-heading">
39
+ {{ getHeading(item) }}
40
+ </div>
41
+ </q-timeline-entry>
42
+ <!-- Item entry -->
43
+ <q-timeline-entry :color="getColor(item)">
44
+ <template v-slot:title>
45
+ <slot name="title">
46
+ <div v-if="getTitle(item)" class="text-h6">
47
+ {{ getTitle(item) }}
48
+ </div>
49
+ </slot>
50
+ </template>
51
+ <template v-slot:subtitle>
52
+ <slot name="subtitle">
53
+ <div v-if="layout === 'dense'" class="row items-center q-gutter-x-sm">
54
+ <span v-if="getTimestamp(item)">
55
+ {{ getTimestamp(item) }}
56
+ </span>
57
+ <span v-if="getAuthor(item)" class="text-caption" style="text-transform: capitalize;">
58
+ {{ getAuthor(item) }}
59
+ </span>
60
+ <KPanel
61
+ v-if="getDecoration(item)"
62
+ :content="getDecoration(item)"
63
+ />
64
+ </div>
65
+ <div v-else class="column items-end">
66
+ <span v-if="getTimestamp(item)">
67
+ {{ getTimestamp(item) }}
68
+ </span>
69
+ <span v-if="getAuthor(item)" class="text-caption" style="text-transform: capitalize;">
70
+ {{ getAuthor(item) }}
71
+ </span>
72
+ <KPanel
73
+ v-if="getDecoration(item)"
74
+ :content="getDecoration(item)"
75
+ class="justify-end"
76
+ />
77
+ </div>
78
+ </slot>
79
+ </template>
80
+ <div :class="dense ? 'q-pr-sm' : 'q-pr-md'">
81
+ <div v-if="bodyRenderer" :class="bodyRendererClass">
82
+ <component
83
+ :id="item._id"
84
+ :ref="onBodyRendered"
85
+ :service="service"
86
+ :item="item"
87
+ :contextId="contextId"
88
+ :is="bodyRendererComponent"
89
+ v-bind="bodyRenderer"
90
+ />
91
+ </div>
92
+ <div v-else v-html="getBody(item)" />
93
+ </div>
94
+ </q-timeline-entry>
95
+ </template>
96
+ </q-infinite-scroll>
97
+ </q-timeline>
98
+ </div>
99
+ <!-- Empty slot -->
100
+ <div v-else-if="items && items.length === 0"
101
+ id="timeline-content"
102
+ >
103
+ <slot name="empty">
104
+ <KStamp
105
+ icon="las la-exclamation-circle"
106
+ icon-size="4rem"
107
+ :text="$t('KTimeLine.EMPTY_LABEL')"
108
+ text-size="1.2rem"
109
+ direction="vertical"
110
+ class="absolute-center"
111
+ />
112
+ </slot>
113
+ </div>
114
+ <!-- Initializing slot -->
115
+ <div v-else id="timeline-initializing">
116
+ <slot name="initializing">
117
+ <div class="row justify-center">
118
+ <q-spinner
119
+ color="primary"
120
+ size="4rem"
121
+ class="absolute-center"
122
+ />
123
+ </div>
124
+ </slot>
125
+ </div>
126
+ <!--
127
+ Controls
128
+ -->
129
+ <div v-if="contentRef"
130
+ id="timeline-controls"
131
+ :class="dense ? 'q-px-sm' : 'q-px-md'"
132
+ class="row items-center"
133
+ >
134
+ <div class="col-4"></div>
135
+ <div class="col-4 row justify-center">
136
+ <KScrollDown
137
+ v-if="scrollDown"
138
+ :ref="scrollDownRefCreated"
139
+ target="timeline-content"
140
+ :loading="loadDoneFunction ? true : false"
141
+ />
142
+ </div>
143
+ <div class="col-4 row justify-end">
144
+ <KScrollToTop
145
+ v-if="scrollToTop"
146
+ :ref="scrollToTopRefCreated"
147
+ target="timeline-content"
148
+ />
149
+ </div>
150
+ </div>
151
+ <!--
152
+ Footer
153
+ -->
154
+ <div id="timeline-footer">
155
+ <slot name="footer">
156
+ <q-separator inset v-if="footer"/>
157
+ <KPanel
158
+ :content="footer"
159
+ :class="footerClass"
160
+ />
161
+ </slot>
162
+ </div>
163
+ </div>
164
+ </template>
165
+
166
+ <script setup>
167
+ import _ from 'lodash'
168
+ import moment from 'moment'
169
+ import { ref, computed, watch, toRefs, onBeforeMount, onBeforeUnmount } from 'vue'
170
+ import { useQuasar } from 'quasar'
171
+ import { useCollection } from '../../composables'
172
+ import { Events } from '../../events.js'
173
+ import { Time } from '../../time.js'
174
+ import { loadComponent } from '../../utils'
175
+ import KScrollToTop from './KScrollToTop.vue'
176
+ import KScrollDown from './KScrollDown.vue'
177
+ import KStamp from '../KStamp.vue'
178
+ import KPanel from '../KPanel.vue'
179
+
180
+ // Props
181
+ const props = defineProps({
182
+ contextId: {
183
+ type: String,
184
+ default: undefined
185
+ },
186
+ service: {
187
+ type: String,
188
+ required: true
189
+ },
190
+ baseQuery: {
191
+ type: Object,
192
+ default: () => { return { $sort: { createdAt: -1 } } }
193
+ },
194
+ filterQuery: {
195
+ type: Object,
196
+ default: () => {}
197
+ },
198
+ nbItemsPerPage: {
199
+ type: Number,
200
+ default: 10
201
+ },
202
+ listStrategy: {
203
+ type: String,
204
+ default: 'smart'
205
+ },
206
+ bodyRenderer: {
207
+ type: Object,
208
+ default: () => null
209
+ },
210
+ schema: {
211
+ type: Object,
212
+ default: () => {
213
+ return {
214
+ colorField: 'color',
215
+ titleField: 'name',
216
+ timestampField: 'createdAt',
217
+ bodyField: 'description',
218
+ decorationField: 'tags'
219
+ }
220
+ }
221
+ },
222
+ processor: {
223
+ type: Function,
224
+ default: undefined
225
+ },
226
+ sideWidth: {
227
+ type: Number,
228
+ default: 20
229
+ },
230
+ scrollDown: {
231
+ type: Boolean,
232
+ default: true
233
+ },
234
+ scrollToTop: {
235
+ type: Boolean,
236
+ default: true
237
+ },
238
+ header: {
239
+ type: [Array, Object],
240
+ default: () => null
241
+ },
242
+ headerClass: {
243
+ type: String,
244
+ default: undefined
245
+ },
246
+ footer: {
247
+ type: [Array, Object],
248
+ default: () => null
249
+ },
250
+ footerClass: {
251
+ type: String,
252
+ default: undefined
253
+ },
254
+ dense: {
255
+ type: Boolean,
256
+ default: false
257
+ }
258
+ })
259
+
260
+ // Emits
261
+ const emit = defineEmits(['collection-refreshed', 'selection-changed'])
262
+
263
+ // Data
264
+ const $q = useQuasar()
265
+ const { items, nbTotalItems, currentPage, refreshCollection } = useCollection(_.merge(toRefs(props), { appendItems: ref(true) }))
266
+ const contentRef = ref(null)
267
+ const scrollDownRef = ref(null)
268
+ const scrollToTopRef = ref(null)
269
+ const loadDoneFunction = ref(null)
270
+
271
+ // Computed
272
+ const bodyRendererComponent = computed(() => {
273
+ return loadComponent(props.bodyRenderer.component)
274
+ })
275
+ const bodyRendererClass = computed(() => {
276
+ return props.bodyRenderer.class || 'col-12'
277
+ })
278
+ const layout = computed(() => {
279
+ if (props.dense) return 'dense'
280
+ return $q.screen.lt.md ? 'dense' : 'comfortable'
281
+ })
282
+ const comfortSize = computed(() => {
283
+ return `${props.sideWidth}%`
284
+ })
285
+ const comfortPadding = computed(() => {
286
+ return props.dense ? '24px' : '32px'
287
+ })
288
+
289
+ // Watch
290
+ watch(items, onCollectionRefreshed)
291
+
292
+ // Functions
293
+ function onBodyRendered (instance) {
294
+ // Force the scroll components to be refreshed
295
+ if (instance) onScroll()
296
+ }
297
+ function scrollDownRefCreated (instance) {
298
+ scrollDownRef.value = instance
299
+ if (instance) instance.refresh()
300
+ }
301
+ function scrollToTopRefCreated (instance) {
302
+ scrollToTopRef.value = instance
303
+ if (instance) instance.refresh()
304
+ }
305
+ function getTitle (item) {
306
+ return _.get(item, _.get(props.schema, 'titleField'))
307
+ }
308
+ function getTimestamp (item) {
309
+ const time = _.get(item, _.get(props.schema, 'timestampField'))
310
+ if (time) return `${Time.format(time, 'date.long')} - ${Time.format(time, 'time.long')}`
311
+ }
312
+ function getAuthor (item) {
313
+ return _.get(item, _.get(props.schema, 'authorField'))
314
+ }
315
+ function getDecoration (item) {
316
+ return _.get(item, _.get(props.schema, 'decorationField'))
317
+ }
318
+ function getBody (item) {
319
+ return _.get(item, _.get(props.schema, 'bodyField'))
320
+ }
321
+ function getColor (item) {
322
+ return _.get(item, _.get(props.schema, 'colorField'))
323
+ }
324
+ function getHeading (item) {
325
+ const currentTimestamp = moment(_.get(item, _.get(props.schema, 'timestampField')))
326
+ if (!currentTimestamp || !currentTimestamp.isValid()) return false
327
+ const heading = _.capitalize(currentTimestamp.format('MMMM, YYYY'))
328
+ if (!item.previous) return heading
329
+ const previousTimestamp = moment(_.get(item.previous, _.get(props.schema, 'timestampField')))
330
+ if (!previousTimestamp || !previousTimestamp.isValid()) return heading
331
+ if (currentTimestamp.year() !== previousTimestamp.year()) return heading
332
+ if (currentTimestamp.month() !== previousTimestamp.month()) return heading
333
+ return null
334
+ }
335
+ function onScroll () {
336
+ if (scrollDownRef.value) scrollDownRef.value.refresh()
337
+ if (scrollToTopRef.value) scrollToTopRef.value.refresh()
338
+ }
339
+ function onLoad (index, done) {
340
+ // check whether the items are all loaded yet
341
+ if (items.value.length === nbTotalItems.value) {
342
+ done(true)
343
+ return
344
+ }
345
+ // set the current page and tell the collection to be refreshed
346
+ currentPage.value = index
347
+ refreshCollection()
348
+ loadDoneFunction.value = done
349
+ }
350
+ function onCollectionRefreshed () {
351
+ emit('collection-refreshed', items.value)
352
+ // set previous item. This is required to compute whether it must display an heading or not
353
+ _.forEach(items.value, (item, index) => {
354
+ item.previous = index > 0 ? items.value[index - 1] : null
355
+ })
356
+ // call done callback if needed
357
+ if (loadDoneFunction.value) {
358
+ loadDoneFunction.value(items.value.length === nbTotalItems.value)
359
+ loadDoneFunction.value = null
360
+ }
361
+ }
362
+
363
+ // Hooks
364
+ onBeforeMount(() => {
365
+ refreshCollection()
366
+ Events.on('user-abilities-changed', refreshCollection)
367
+ })
368
+ onBeforeUnmount(() => {
369
+ Events.off('user-abilities-changed', refreshCollection)
370
+ })
371
+ </script>
372
+
373
+ <style lang="scss">
374
+ .q-timeline__heading-title {
375
+ padding-top: 8px;
376
+ padding-bottom: 8px;
377
+ }
378
+ .k-timeline-heading {
379
+ font-size: 1.25rem;
380
+ font-weight: bold;
381
+ }
382
+ .q-timeline__title {
383
+ margin-bottom: 4px;
384
+ }
385
+ .q-timeline__subtitle {
386
+ margin-bottom: 0px;
387
+ opacity: 0.9;
388
+ text-transform: capitalize;
389
+ font-weight: 500;
390
+ }
391
+ .q-timeline__content {
392
+ padding-bottom: 16px;
393
+ width: 100%;
394
+ }
395
+ .q-timeline--comfortable .q-timeline__subtitle {
396
+ width: v-bind(comfortSize);
397
+ }
398
+ .q-timeline--comfortable .q-timeline__content {
399
+ padding-bottom: 16px;
400
+ width: calc(100% - v-bind(comfortSize));
401
+ }
402
+ .q-timeline--dense--right .q-timeline__entry {
403
+ padding-left: v-bind(comfortPadding);
404
+ }
405
+
406
+ </style>
@@ -2,18 +2,14 @@ import KCard from './KCard.vue'
2
2
  import KCardSection from './KCardSection.vue'
3
3
  import KGrid from './KGrid.vue'
4
4
  import KItem from './KItem.vue'
5
- import KList from './KList.vue'
6
5
  import KHistory from './KHistory.vue'
7
6
  import KTable from './KTable.vue'
8
- import KColumn from './KColumn.vue'
9
7
 
10
8
  export {
11
9
  KCard,
12
10
  KCardSection,
13
11
  KGrid,
14
12
  KItem,
15
- KList,
16
13
  KHistory,
17
- KTable,
18
- KColumn
14
+ KTable
19
15
  }